Как" +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 строительство.

4 51

4 ответа:

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

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

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

The + оператор здесь известен как Унарный Плюс.

унарный оператор plus предшествует своему операнду и вычисляет его операнд, но пытается преобразовать его в число, если это еще не так.

+"123" evaulates как 123.

+a === +a
-> +"123" === +"123"
  -> 123 === 123
    -> true

+"123b" оценивается как NaN (не число), как b символ не может быть преобразован с унарным плюсом как без префикса (например 0x для шестнадцатеричного) унарный Плюс будет принимать значение десятичное (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) )

две переменные string, но 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