Я часто видел трюк
after = +after;
чтобы принудить переменную after
к числу. Чтение через Node.JS source Я нашел другой метод:
after *= 1; // coalesce to number or NaN
Являются ли эти два метода строго эквивалентными по своему поведению?
Я часто видел трюк
after = +after;
чтобы принудить переменную after
к числу. Чтение через Node.JS source Я нашел другой метод:
after *= 1; // coalesce to number or NaN
Являются ли эти два метода строго эквивалентными по своему поведению?
Да. Оба Unary Operator +
и мультипликативные операторы, такие как *
(вызываемые из Compound Assignment op=
) вызывают внутренний алгоритм ToNumber
.
Вы даже можете использовать третий вариант, статически называя конструктор Number
:
after = Number(after);
После быстрого google, чтобы убедиться, что мои подозрения верны, я пришел к такому выводу. Использование оператора +
для преобразования в число выполняется быстрее, потому что после литья типов не выполняются математические операции, тогда как использование подхода *=
означает, что после преобразования after
оно будет умножено на 1
.
Примечание. В некоторых случаях after = after-0
вызывает различное поведение, чем after = after+0
. Я заметил это с датами.
Это тестирование только в Chrome v39:
var date = new Date(2000,0,1);
date += date; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)"
var date2 = new Date(2000,0,1);
date2 + 0; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)0"
date2 - 0; //946684800000
date2 * 1; //946684800000
Я не знаю, что определено в спецификации JS, но с датами, потому что и дата, и число могут быть переданы в строку, а оператор + работает с строкой, тогда Chrome идет с конкатенацией строк, Поскольку оператор-оператор не имеет эквивалента строки, он возвращается к сопоставлению чисел.
Я нашел, что это полезно, когда вы вводите даты в числа для сравнения
Да, однако обратите внимание, что это только оператор унарного+. То есть 10 + "10"
предоставит вам "1010"
.
Возможно, менее вероятный вариант ошибки - использовать то, что делает asm.js:
10 + ("10"|0)
Хотя на нижней стороне это требует скобки. Это должен быть самый быстрый вариант в любом случае (вероятно, равный унарному +).