Подтвердить что ты не робот

Как "+ var === + var" работает внутри, чтобы проверить, является ли var числовым?

Увидев этот вопрос: Есть ли (встроенный) способ в JavaScript проверить, является ли строка допустимым числом? и это: jsperf, один из представленных подходов - это (mutatis mutandis):

var a = "123"
var b = "123b"

if ( +a === +a ) // true

if ( +b === +b ) // false

Как эта логика работает внутри JavaScript, чтобы сделать это возможным?

Мой вопрос не, как проверить, является ли строка допустимым числом – на это уже ответили: Подтвердить десятичные числа в JavaScript - IsNumeric(). Я хочу понять, как работает оператор +a === +a.

4b9b3361

Ответ 1

+ преобразует значение в число.

a преобразуется в 123 и 123 === 123.

b преобразуется в NaN, но NaN !== NaN (потому что NaN никогда не равен другому NaN в соответствии с шагом 4a правил равенства ).

Ответ 2

Оператор + здесь известен как 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) )

Ответ 4

Две переменные - это строка, но 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