Каковы различия между этой линией:
var a = parseInt("1", 10); // a === 1
и эта строка
var a = +"1"; // a === 1
Этот тест jsperf показывает, что унарный оператор намного быстрее в текущей версии Chrome, если предположить, что это для node.js !?
Если я пытаюсь преобразовать строки, которые не являются числами, оба возвращают NaN
:
var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN
Так, когда я должен предпочесть использование по parseInt
сравнению с унарным плюсом (особенно в node.js) ???
редактировать : а в чем разница с оператором двойной тильды ~~
?
javascript
node.js
hereandnow78
источник
источник
Ответы:
Пожалуйста, смотрите этот ответ для более полного набора случаев
Ну, вот несколько отличий, о которых я знаю:
Пустая строка
""
оценивается как a0
, аparseInt
оценивается какNaN
. ИМО, пустая строка должна бытьNaN
.Унарный
+
действует больше как,parseFloat
так как он также принимает десятичные дроби.parseInt
с другой стороны, прекращает синтаксический анализ, когда видит нецифровый символ, например, период, который должен быть десятичной точкой.
.parseInt
иparseFloat
разбирает и строит строку слева направо . Если они видят недопустимый символ, он возвращает то, что было проанализировано (если есть) как число, иNaN
если ни один не было проанализировано как число.Унарный,
+
с другой стороны, вернется,NaN
если вся строка не преобразуется в число.Как видно из комментария @Alex K. ,
parseInt
иparseFloat
будет разбирать по символам. Это означает, что шестнадцатеричные и экспоненциальные нотации потерпят неудачу, так какx
иe
обрабатываются как нечисловые компоненты (по крайней мере, на основании 10).Унарные
+
все же конвертируют их правильно.источник
+"0xf" != parseInt("0xf", 10)
Math.floor()
, который в основном отсекает десятичную часть."2e3"
не является допустимым целочисленным представлением для2000
. Это действительное число с плавающей запятой, хотя:parseFloat("2e3")
будет правильно давать2000
в качестве ответа. И"0xf"
требует по крайней мере основания 16, поэтомуparseInt("0xf", 10)
возвращает0
, тогда какparseInt("0xf", 16)
возвращает значение 15, которое вы ожидали.Math.floor(-3.5) == -4
и~~-3.5 == -3
.Конечная таблица преобразования числа в число:
Показать фрагмент кода
источник
"NaN"
к этой таблице.isNaN
столбец в эту таблицу: например,isNaN("")
false (т. Е. Он считается числом), ноparseFloat("")
этоNaN
может быть ошибкой, если вы пытаетесь использоватьisNaN
для проверки ввода перед его передачейparseFloat
'{valueOf: function(){return 42}, toString: function(){return "56"}}'
в список. Смешанные результаты интересны.+
просто более короткий способ написанияNumber
, а дальнейшие - просто сумасшедшие способы сделать это, которые терпят неудачу в крайних случаях?Я полагаю, что таблица в ответе thg435 является исчерпывающей, но мы можем подвести итог следующим шаблонам:
true
на 1, но"true"
наNaN
.parseInt
более либерально для строк, которые не являются чистыми цифрами.parseInt('123abc') === 123
тогда как+
сообщаетNaN
.Number
будет принимать действительные десятичные числа, тогда какparseInt
просто отбрасывает все после десятичного числа. Таким образом,parseInt
имитирует поведение C, но, возможно, не идеально подходит для оценки пользовательского ввода.parseInt
, будучи плохо спроектированным парсером , принимает восьмеричный и шестнадцатеричный ввод. Унарный плюс принимает только шестнадцатеричный.Ложные значения преобразуются в
Number
следующее, что имело бы смысл в C:null
иfalse
оба равны нулю.""
переход к 0 не совсем соответствует этому соглашению, но имеет для меня достаточно смысла.Поэтому я думаю, что если вы проверяете пользовательский ввод, унарный плюс имеет правильное поведение для всего, кроме того, что он принимает десятичные дроби (но в моих реальных случаях меня больше интересует перехват ввода электронной почты вместо userId, значение опускается полностью и т. Д.), Тогда как parseInt слишком либерален.
источник
Будьте осторожны, parseInt быстрее, чем + унарный оператор в Node.JS, неверно, что + или | 0 быстрее, они быстрее только для элементов NaN.
Проверь это:
источник
Учитывайте производительность тоже. Я был удивлен, что
parseInt
на iOS превосходит один плюс :) Это полезно для веб-приложений только с высокой загрузкой процессора. В качестве практического правила я бы предложил JS opt-guys рассмотреть любого оператора JS вместо другого с точки зрения производительности мобильных устройств в настоящее время.Итак, иди мобильным первым ;)
источник