Я часто видел трюк
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)
Хотя на нижней стороне это требует скобки. Это должен быть самый быстрый вариант в любом случае (вероятно, равный унарному +).