Эта строка из Underscore.js делает проверку на равенство действительно необходимой? - PullRequest
6 голосов
/ 12 сентября 2011

Я только что посмотрел на _.isEqual функцию Underscore.js, и часть кода выглядит примерно так:

if (a === b) return true;

if (typeof a !== typeof b) return false;

if (a == b) return true;

Мне просто интересно, есть ли случай, когдатретье утверждение может быть достигнуто и оценено как true?

Редактировать: Просто чтобы быть ясным, это не мой собственный код, о котором я говорю, я читаю источник Underscore,в частности, эта строка , и мне было любопытно, почему они это делают.

Ответы [ 4 ]

3 голосов
/ 12 сентября 2011

Я только что просматривал репозиторий Underscore и наткнулся на короткое обсуждение, где кто-то спросил точно такую ​​же вещь , и похоже, что на самом деле это не нужно.

Следование алгоритму, определенному Спецификацией языка ECMAScript в разделе 11.9.6 и разделе 11.9.3 , по-видимому, показывает, что ни одна пара значений не должна возвращать true в вышеприведенном случае.

Итак, вкратце, нет, такая ситуация невозможна .

1 голос
/ 12 сентября 2011

Когда вы используете оператор == и выражения имеют разные типы, JavaScript обычно преобразует их в один и тот же тип перед сравнением.

Например, это может произойти с null и undefined.null == undefined верно, хотя null === undefined неверно.Однако typeof null равно "object", а typeof undefined - "undefined".Таким образом, в этом случае вы должны вернуть false во втором операторе.

Вы можете прочитать все детали в спецификации (раздел 11.9.3), это очень сложно: http://www.ecma - международный.орг / публикации / файлы / ECMA-ST / ECMA-262.pdf

1 голос
/ 12 сентября 2011

Мое первоначальное предположение состояло в том, чтобы обойти сломанную реализацию браузера.

Однако после поиска в журнале git этого файла, похоже, что соответствующая строка была в самой первой underscore.js регистрации.(Я не собираюсь охотиться в родительском облаке документов core.js репо ...) Вы можете увидеть его в строке 334 https://github.com/documentcloud/underscore/commit/02ede85b539a89a44a71ce098f09a9553a3a6890.

Так что теперь я предполагаю, что это просто глупость, чтоосталось, никогда полностью не проверено и никогда не вычищено.

1 голос
/ 12 сентября 2011

Единственная ситуация, когда == и === реагируют неожиданно, - это сравнение литеральной строки ("123") с составной строкой (new String("123")), которая не прошла бы первый тест.

Тем не менее, во втором тесте он перехватывается, потому что созданная строка имеет тип object, а литерал имеет тип string.

Исходя из этого, я бы сказал, нет, третье утверждение никогда не может быть достигнуто, и оцените как истинное.

...