Що означає = + _ в 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;
посміхнене

Відповіді:


396
r = +_;
  • +намагається передати все, що _є, до числа.
  • _це лише ім'я змінної (не оператор), це може бути aі fooт.д.

Приклад:

+"1"

киньте "1" на чисте число 1.

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

rзараз 1, ні "1".

Більше того, згідно зі сторінкою MDN про Арифметичні оператори :

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

Також зазначається, що

Унар плюс - це найшвидший і бажаний спосіб перетворення чогось у число


2
Чи значить + дійсно означає присвоєння числу чи +_дійсно означає 0+_, у такому випадку його _потрібно передати перед додаванням до 0?
colincameron


17
@ c.cam108 - Ні, вони не так поводяться. Unary plus передає значення на число, але двійковий плюс не: +'12' === 12(результат - це число), але 0 + '12' === '012'(результат - рядок). Зауважте, однак, що 0 - '12' === -12.
Кобі

1
@juzerali Звичайно, але це не є хорошою практикою. Спробуйте використовувати додаток;)
Ізката

Виглядає як із змінною за замовчуванням $ _
Меттью Лок

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 string (float буде круглим до int) )

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

також виводить 10

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


1
Я часто використовую x|0для перетворення подвійних в int; однак це, а також використання '~' передбачає обмеження числа <2 ^ 32. + "2e15" не відповідає.
Акі Суйконен

@AkiSuihkonen Так добре, я вважаю, що x|0це ще швидше +. Правильно ? приємна техніка :). (2) Я використовую ~просто, щоб показати ОП, що +це не тільки знак, який можна використовувати ( я сам використовую+ ).
Grijesh Chauhan

Важко сказати - є jsperf, хоча можна його виміряти. ОТОХ ці два оператори мають зовсім інше значення. Якщо потрібно лише число (а не ціле число), "+" все одно на один символ коротше.
Акі Суйконен

1
Насправді я щойно тестував це jsperf - 18M ops для '| 0', 19M ops для '+'; продуктивність, ймовірно, буде відрізнятися від браузера до браузера. jsperf.com/strtoint
Aki Suihkonen

1
@AkiSuihkonen О, я тільки що зробив тест jsperf у Firefox, величезна різниця .. |набагато швидше.
Тапірбой

16

Це не так =+. У JavaScript +означає змінити його на номер.

+'32' повертає 32.

+'a' повертає NaN.

Тож ви можете використовувати, isNaN()щоб перевірити, чи можна його змінити на число.


16

Це підлий.

Важливо розуміти, що символ підкреслення тут насправді ім'я змінної , а не оператор.

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

І це просто залишає знак рівності як просто стандартне призначення змінної.

Це, мабуть, навмисно не написано для плутанини, оскільки досвідчений програміст Javascript, як правило, розпізнає підкреслення як змінну. Але якщо ви не знаєте, це, безумовно, дуже заплутано. Я, звичайно, не писав би це так; Я не є прихильником коротких безглуздих імен змінних у кращі часи - якщо ви хочете, щоб короткі імена змінних у JS-коді економили простір, використовуйте мініфікатор; не пишіть його з короткими змінними для початку.


1
+1, оскільки ви єдиний, хто тут прямо вказав, що _це змінна.
TRiG

@TRiG, ​​як щодо відповіді Starx, яка робить це, не будучи tl; dr?
Математика


9

Я гадаю, ти маєш на увазі r = +_;? У такому випадку це перетворення параметра в a 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
ніж допомогти мені написати відповідь.
Amrendra

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(_) ?
Grijesh Chauhan

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

DEMO: http://jsfiddle.net/dirtyd77/GCLjd/


Додаткову інформацію можна знайти в розділі MDN - Unary plus (+) :

Оператор unary plus передує його операнду і оцінює його операнду, але намагається перетворити його в число, якщо його ще немає. Хоча одинарне заперечення (-) також може конвертувати не числа, унар плюс є найшвидшим і бажаним способом перетворення чогось у число, оскільки він не виконує жодних інших операцій над числом. Він може конвертувати рядкові представлення цілих чисел і плавців, а також нерядкові значення 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.