Негативы в underscore.js: почему _isEqual (0, -1 * 0) возвращает false? - PullRequest
4 голосов
/ 26 февраля 2012

Используя библиотеку javascript underscore.js (v.1.3.1), я воспроизвел следующее на Mac в современной Chrome (17.0.963.56) и в Firefox 7.0:

0 === -1 * 0
> true

_.isEqual(0, -1 * 0)
> false

Это удивительно, по крайней мере для меня. Я ожидал, что два значения, для которых === истинно, приведут к тому, что _.isEqual также будет истинно.

Что здесь происходит? Спасибо!

Ответы [ 3 ]

4 голосов
/ 26 февраля 2012

Это было явно указано в источнике :

function eq(a, b, stack) {
  // Identical objects are equal. `0 === -0`, but they aren't identical.
  // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
  if (a === b) return a !== 0 || 1 / a == 1 / b;

На самом деле JavaScript интерпретирует 0 и -0 по-разному , но выобычно этого не видят, потому что 0 == -0 и 0 === -0.Есть только несколько способов проверить разницу.

3 голосов
/ 26 февраля 2012

Посмотрите на источник для функции eq здесь . -1 * 0 равно -0, а не 0, поэтому 0 и -0 не равны, согласно isEqual.

Соответствующая строка:

// Identical objects are equal. `0 === -0`, but they aren't identical.
// See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
if (a === b) return a !== 0 || 1 / a == 1 / b;

Я знал об этом раньше, но это послужит интересным злым кодом.

2 голосов
/ 26 февраля 2012

Это глубже, чем это. JavaScript использует числа с плавающей точкой двойной точности IEEE, и они имеют разные представления для 0 и -0 (что может быть важно, когда вы имеете дело с ограничениями и тому подобным). Но обычно вы этого не замечаете, потому что 0 === -0.

...