Ответ 1
+
преобразует значение в число.
a
преобразуется в 123
и 123 === 123
.
b
преобразуется в NaN
, но NaN !== NaN
(потому что NaN
никогда не равен другому NaN
в соответствии с шагом 4a правил равенства ).
Увидев этот вопрос: Есть ли (встроенный) способ в JavaScript проверить, является ли строка допустимым числом? и это: jsperf, один из представленных подходов - это (mutatis mutandis):
var a = "123"
var b = "123b"
if ( +a === +a ) // true
if ( +b === +b ) // false
Как эта логика работает внутри JavaScript, чтобы сделать это возможным?
Мой вопрос не, как проверить, является ли строка допустимым числом – на это уже ответили: Подтвердить десятичные числа в JavaScript - IsNumeric(). Я хочу понять, как работает оператор +a === +a
.
+
преобразует значение в число.
a
преобразуется в 123
и 123 === 123
.
b
преобразуется в NaN
, но NaN !== NaN
(потому что NaN
никогда не равен другому NaN
в соответствии с шагом 4a правил равенства ).
Оператор +
здесь известен как Unary Plus.
Оператор унарного плюса предшествует своему операнду и вычисляет его операнд, но пытается преобразовать его в число, если оно еще не было.
+"123"
проявляет себя как 123
.
+a === +a
-> +"123" === +"123"
-> 123 === 123
-> true
+"123b"
оценивается как NaN
(не номер), так как символ b
не может быть преобразован с помощью Unary Plus без префикса (например, 0x
для шестнадцатеричного числа), Unary Plus будет считать значение десятичным (0-9). NaN
- это особый случай, когда он не сравнивается ни с чем, включая себя:
NaN === NaN
-> false
NaN !== NaN
-> true
Из-за этого наш тестовый пример +b
не работает:
+b === +b
-> +"123b" === +"123b"
-> NaN === NaN
-> false
Если вы хотите, чтобы оба значения были равно true, мы можем добавить вызов isNaN()
в конце:
if ( +a === +a || isNaN(+a) )
if ( +b === +b || isNaN(+b) )
+"123b"
NaN
. NaN не соответствует ни одному, включая NaN.
Две переменные - это строка, но javascript автоматически преобразует любую строку в число, когда вы + или -.
var a = "1";
var b = a; // b = "1": a string
var c = +a; // c = 1: a number
var d = -a; // d = -1: a number
и в основном в вашем примере вы пытаетесь сделать это:
if ( +"123" === +"123" ) => ( 123 === 123) // true
if ( +"123b" === +"123b" ) => (NaN === NaN) // false