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


252

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

Пример:

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

57
Напомнил мне старый добрый подход оператора-->
OV

12
Здесь + - унарный оператор с операндом _.
Питер Витвоет

44
Похоже, программист на Perl не смог отпустить переменную по умолчанию ;-)
Michael Wild,

4
Хорошая подсветка синтаксиса помогла бы вам ответить на вопрос.
Hugo der Hungrige

18
Вы можете сделать смайликx= +_+ 0;
tckmn

Ответы:


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

Пример:

+"1"

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

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

rсейчас 1нет "1".

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

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

Также отмечено, что

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


2
+ Действительно означает приведение к числу, или +_действительно означает 0+_, в каком случае _должно быть приведение перед добавлением к 0?
colincameron


17
@ c.cam108 - Нет, они не ведут себя одинаково. Унарный плюс преобразует значение в число, но двоичный плюс не: +'12' === 12(результат - число), но 0 + '12' === '012'(результат - строка). Обратите внимание, однако, что 0 - '12' === -12.
Коби

1
@juzerali Конечно, но это не очень хорошая практика. Попробуйте использовать сложение;)
Izkata

Выглядит perlish с переменной perl по умолчанию $ _
Matthew Lock

95

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

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

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

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


54

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

лайк:

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

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

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

выходы 10

использование: так вот yint 5из-за =+
:

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

выходы 55

Где как _переменная.

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

выходы 10

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

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

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

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


1
Я часто использую x|0для преобразования double в int; однако это так же как использование '~' имеет ограничение ограничения числами <2 ^ 32. + "2е15" нет.
Аки Суйхконен

@AkiSuihkonen Да, хорошо, я считаю, x|0что даже быстрее, чем тогда +. Правильно ? хорошая техника :). (2) Я использую ~только для того, чтобы показать OP, который +можно использовать не только как знак ( я сам использую+ ).
Grijesh Chauhan

Трудно сказать - есть JSperf, хотя есть одно желание, чтобы измерить его. OTOH эти два оператора имеют совершенно разные значения. Если требуется только число (а не целое число), «+» в любом случае на один символ короче.
Аки Суйхконен

1
На самом деле я только что проверил это jsperf - 18 миллионов операций для «| 0», 19 миллионов операций для «+»; производительность, вероятно, будет варьироваться от браузера к браузеру. jsperf.com/strtoint
Аки Суйхконен

1
@AkiSuihkonen О, боже, я только что провел тест jsperf в Firefox, огромная разница ... |намного быстрее.
Тапирбой

16

Это не так =+. В JavaScript это +означает изменить его на число.

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

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

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


16

Это подлый.

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

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

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

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


1
+1, так как вы здесь единственный, кто явно указывает, что _это переменная.
TRiG

@TRiG как насчет ответа Starx, который делает это, не будучи tl; dr?
Математика


9

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


6

_это просто имя переменной, переданное в качестве параметра функции 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

Ответил очень поздно, но очень хороший ответ.
Grijesh Chauhan

5

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

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

Вы забыли +до того b.
Аттила О.

1
Спасибо 4, помогая мне написать ответ гуд.
Амрендра

3

+_почти эквивалентно из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

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


Я думаю, что в первой строке вы хотите сказать parseInr(_)вместо parseFloat(_) ?
Грижеш Чаухан

1
Нет, я имел в виду float, потому что parseInt остановится на не числовом символе, parshFloat не будет. EXP: parseFloat(2.4) = 2.4против parseInt(2.4) = 2.
Брайан

3

Проще говоря, +_ эквивалентно использованию 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.


2

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

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хороши более читаемые альтернативы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.