2014-08-27 2 views
5

Все знают основные конкатенации двух строк в JavaScript:Weird поведения при использовании + + в JavaScript

> "Hello " + "World!" 
'Hello World!' 

Но что произойдет, если мы используем + + вместо +? Я просто столкнулся со следующей странного поведения:

> "Hello " + + "World!" 
'Hello NaN' 
> "Hello " + + "" 
'Hello 0' 

Из приведенных выше примеров, я могу видеть, что вторая строка преобразуется в число. Таким образом, передавая объект с свойством valueOf как функцию, значение, возвращаемое этой функцией, будет преобразовано.

> "Hello " + + ({valueOf: function() {return 1; }}) 
'Hello 1' 

Как и ожидалось, это показывает "Hello 1".


Почему вторая строка преобразована в Number? Почему бы не выбросить синтаксическую ошибку или так?

+0

@jeremyharris Да, но не '+ +' ('+ +'). –

+0

оценка + "" дает вам нулевое –

+0

: получилось, удалено :) – jeremyharris

ответ

3

Второй + - это unary plus operator, целью которого является преобразование его операнда в число.

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

"Hello " + + "World!" 

может быть разобран только

"Hello " + (+ "World!") 

которая

"Hello " + NaN 

, следовательно, ваш результат.

Этот унарный оператор очень полезен в JavaScript и является одним из наиболее распространенных способов преобразования из числа, которое может быть числом или строкой для числа. Это также имеет преимущество перед parseFloat, что это не смехотворно толерантно (parseFloat("7up") вернет 7), что делает его простым способом увидеть, является ли строка представлением числа (просто тест s==+s).

+0

В самом деле, можете ли вы объяснить, почему это не синтаксическая ошибка? –

+0

Почему это была синтаксическая ошибка? '+ somestring' совершенно справедливо (см. документ, к которому я привязан) –

+0

Это имеет смысл. Благодаря! –

2

Отличный вопрос.Это потому, что JavaScript имеет одноместный + оператора (по аналогии с одноместный - как, ехом, -1, который разобранный на - (1)): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_plus_(.2B)

Таким образом "foo" + + "bar" анализируются, чтобы "foo" + (+ "bar") (или, если вы предпочитаете разобраны сюсюкать стиль дерево: (+ "foo" (+ "bar")).

Унарный + преобразует свой операнд в число, или NaN, если операнд не является разумным номер:

> +"42" 
42 
> +"foo" 
NaN 

Наконец, добавив ряд (в том числе NaN) в строку результатов в конкатенации ,

Таким образом "foo" + +"bar" может быть расширен:

"foo " + +"bar" 
"foo " + NaN 
"foo NaN" 
+2

Нет, он анализируется как '(" foo "+ (+" bar "))' – Pointy

+0

Err, извините, используя синтаксис в стиле lisp; Прояснит –

1

Здесь + является unary plus operator который пытается преобразовать оператор числа & работает следующим образом

+"" //return 0 
+"Some" //returns NaN 

Так вот

"Hello " + + "World!" 

будет

"Hello " + (+ "World!") 
"Hello " + NaN 
"Hello Nan" 
Смежные вопросы