Как" +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 ответа:
+
преобразует значение в число.
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) )
+"123b"
иNaN
. NaN не равно ничему, включая NaN.
две переменные 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