Что означает = +_ в JavaScript

Мне было интересно, что означает оператор = +_ в JavaScript. Похоже, что это делает назначения.

Пример:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};

12 ответов

Решение
r = +_;
  • + пытается разыграть что угодно _ это номер.
  • _ только имя переменной (не оператор), это может быть a, foo и т.п.

Пример:

+"1"

приведи "1" к чистому номеру 1.

var _ = "1";
var r = +_;

r сейчас 1не "1",

Кроме того, согласно странице MDN об арифметических операторах:

Унарный оператор плюс предшествует своему операнду и вычисляет его операнд, но пытается преобразовать его в число, если это еще не сделано. [...] Он может конвертировать строковые представления целых чисел и чисел с плавающей точкой, а также нестроковые значения true, false, а также null, Целые числа в десятичной и шестнадцатеричной форме ("0x"-префиксируемые) форматы поддерживаются. Отрицательные числа поддерживаются (хотя не для шестнадцатеричного). Если он не может проанализировать конкретное значение, он оценивается как NaN,

Также отмечается, что

унарный плюс - самый быстрый и предпочтительный способ преобразования чего-либо в число

Это не оператор присваивания.

  • _ это просто параметр, передаваемый в функцию.

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
    
  • На следующей строке r = +_;+ передний бросает эту переменную (_) к числу или целочисленному значению и присваивает его переменной r

Не путайте это с += оператор

=+ на самом деле два оператора = это назначение и + а также _ это имя переменной.

лайк:

i = + 5;
or 
j = + i;
or 
i = + _;

Мои следующие коды помогут вам показать использование =+ преобразовать строку в int.
пример:

y = +'5'
x = y +5
alert(x);

выходы 10

использовать: так вот y это int 5 потому что =+
иначе:

y = '5'
x = y +5
alert(x);

выходы 55

В то время как _ переменная

_ = + '5'
x = _ + 5
alert(x)

выходы 10

Кроме того, было бы интересно узнать, что вы также можете достичь того же с ~ (если строка является строкой int (число с плавающей точкой будет округлено до int))

y = ~~'5'  // notice used two time ~
x = y  + 5
alert(x);

также выводит 10

~ поразрядно НЕ: инвертирует биты своего операнда. Я сделал два раза без изменения величины.

Это не =+, В JavaScript + значит изменить его на номер.

+'32' возвращает 32

+'a' возвращает NaN.

Так что вы можете использовать isNaN() чтобы проверить, можно ли его поменять на номер.

Это подлый.

Важно понимать, что символ подчеркивания здесь на самом деле является именем переменной, а не оператором.

Знак плюс перед этим получает положительное числовое значение подчеркивания, то есть фактически преобразует переменную подчеркивания в int. Вы можете достичь того же эффекта с parseInt(), но здесь, скорее всего, используется приведение знака "плюс", потому что оно более лаконично.

И это просто оставляет знак равенства как стандартное присвоение переменной.

Это, вероятно, не намеренно написано, чтобы запутать, поскольку опытный программист Javascript обычно распознает подчеркивание как переменную. Но если вы не знаете, что это определенно очень запутанно. Я бы точно так не написал; Я не фанат коротких бессмысленных имен переменных в лучшие времена - если вы хотите, чтобы короткие имена переменных в коде JS экономили место, используйте минификатор; не пишите это с короткими переменными для начала.

= +_ приведёт _ к числу.

Так

var _ = "1",
   r = +_;
console.log(typeof r)

выдаст номер.

Я полагаю, вы имеете в виду r = +_;? В этом случае это преобразование параметра в Number, Сказать _ "12.3", то +'12.3' возвращается 12.3, Так что в цитируемом утверждении +_ назначен на r,

_ это просто имя переменной, переданное в качестве параметра функции hexbin.radius, а также + брось это в номер

Позвольте мне привести пример, аналогичный вашей функции.

var hexbin = {},r  ;

hexbin.radius = function(_) {
   if (!arguments.length)
      return r;
   console.log( _ , typeof _ )    
   r = +_;
   console.log( r , typeof r , isNaN(r) );   
}

и запустить этот пример функции.. который выводит

hexbin.radius ("1");

1 string
1 number false 

hexbin.radius (1);

1 number
1 number false

hexbin.radius ([]);

[] object
0 number false

hexbin.radius ('a');

a string
NaN number true

hexbin.radius ({});

Object {} object
NaN number true

hexbin.radius (правда);

true boolean
1 number false

Это присвоит новое значение левой переменной числа.

var a=10;
var b="asg";
var c=+a;//return 10
var d=-a;//return -10
var f="10";

var e=+b;
var g=-f;

console.log(e);//NAN
console.log(g);//-10

Проще говоря, +_ эквивалентно использованию конструктора Number().

На самом деле, это даже работает на даты:

var d = new Date('03/27/2014');
console.log(Number(d)) // returns 1395903600000
console.log(+d) // returns 1395903600000

ДЕМО: http://jsfiddle.net/dirtyd77/GCLjd/


Дополнительную информацию также можно найти в разделе MDN - Унарный плюс (+):

Унарный оператор плюс предшествует своему операнду и вычисляет его операнд, но пытается преобразовать его в число, если это еще не сделано. Хотя унарное отрицание (-) также может преобразовывать не числа, унарный плюс - это самый быстрый и предпочтительный способ преобразования чего-либо в число, поскольку он не выполняет никаких других операций над числом. Он может преобразовывать строковые представления целых чисел и чисел с плавающей точкой, а также нестроковые значения true, false и null. Поддерживаются целые числа в десятичном и шестнадцатеричном (с префиксом "0x") формате. Отрицательные числа поддерживаются (хотя не для шестнадцатеричного). Если он не может проанализировать конкретное значение, он будет равен NaN.

+_ почти эквивалентно parseFloat(_), Соблюдайте это parseInt остановится на нечисловом символе, таком как точка, тогда как parshFloat не буду.

EXP:

    parseFloat(2.4) = 2.4 
vs 
    parseInt(2.4) = 2 
vs 
    +"2.4" = 2.4

Опыт:

var _ = "3";
    _ = +_;

console.log(_); // will show an integer 3

Очень мало отличий:

В этом выражении:

r = +_;
  • "+" действует здесь как унарный оператор, который пытается преобразовать значение правого операнда. Он не преобразует операнд, а вычисленное значение. Так _ останется "1", если это было так изначально, но r станет чистым числом.

Рассмотрим эти случаи, если кто-то хочет применить + для числового преобразования

+"-0" // 0, not -0
+"1" //1
+"-1" // -1
+"" // 0, in JS "" is converted to 0
+null // 0, in JS null is converted to 0
+undefined // NaN
+"yack!" // NaN
+"NaN" //NaN
+"3.14" // 3.14

var _ = "1"; +_;_ // "1"
var _ = "1"; +_;!!_ //true
var _ = "0"; +_;!!_ //true
var _ = null; +_;!!_ //false

Тем не менее, это самый быстрый числовой преобразователь, который я бы вряд ли порекомендовал использовать, если он вообще используется. parseInt/parseFloat хороши более читаемые альтернативы.

Другие вопросы по тегам