JavaScript - обнаружение разницы между положительным нулем и отрицательным нулем
Я использую MomentJS, чтобы рассчитать разницу между двумя раз. Самое странное в этой библиотеке - разница между сегодняшним и сегодняшним днем - 0. Разница между сегодняшним и завтрашним - это -0.
Мой вопрос: как я различаю между 0 и -0. Кажется, JavaScript относится к ним одинаково.
Так, например, если я напишу следующий код:
if (tomorrow === -0)
console.log('It is tomorrow!');
else if (tomorrow === 0)
console.log('It is today!');
Вот пример JSFiddle относительно того, как он обрабатывает возвращаемые значения (я в Австралии, поэтому в зависимости от того, где вы находитесь, настройте даты сегодняшнего дня и завтрашнего дня)
Ответы
Ответ 1
1/val > 0
сделает то, что вы хотите. Возвращает true
для положительных и false
для отрицательных.
Это работает, потому что 1/-0
возвращает отрицательную бесконечность, а 1/0
возвращает положительную бесконечность, которые тогда сопоставимы. Вы также можете сделать что-то вроде 1/val == Infinity
.
Ответ 2
Как указано в этом вопросе (и в комментариях), в JavaScript +0 === -0
по умолчанию оценивается true
.
Вы можете использовать Infinity
/-Infinity
, чтобы увидеть разницу (технически, +0
/-0
может быть не единственными числами для создания бесконечных значений, поэтому я оставил дополнительную проверку):
var positiveZero = +0;
var negativeZero = -0;
console.log(positiveZero === 0 && 1/positiveZero === Infinity); // true
console.log(positiveZero === 0 && 1/positiveZero === -Infinity); // false
console.log(negativeZero === 0 && 1/negativeZero === Infinity); // false
console.log(negativeZero === 0 && 1/negativeZero === -Infinity); // true
JSFiddle
См. также этот пост в блоге для получения более подробной информации и еще одно решение с ECMAScript 5:
function isNegative0(x) {
if (x!==0) return false;
var obj=Object.freeze({z:-0});
try {
Object.defineProperty(obj,'z',{value:x});
} catch (e) {return false};
return true;
}