2013-12-09 13 views
1

меня попросили написать функцию sortByFoo в Javascript, что бы среагировать правильно к этому тесту:[] не совпадает с []

// Does not crash on an empty array 
console.log(sortByFoo([]) === []); 

Но я пытался что-то:

[] === []; 
>> false 

Просто, чтобы быть уверенным, такой тест всегда терпел бы неудачу, независимо от функции sortByFoo, не так ли? Но я хотел бы получить объяснение, почему это происходит. Почему [] не идентичен/равен []?

Пожалуйста, простите мой приблизительный английский, это не мой родной язык: р

+0

Один пустой массив не совпадает с другим пустым массивом, они представляют собой два разных массива? – adeneo

+0

'[] .__ proto__ === [] .__ proto__' is' true' хотя :-) – qwertynl

+0

@qwertynl So is '[] .__ proto__ === [1] .__ proto__' – delnan

ответ

3

Если вы посмотрите на спецификацию javascript/ecmascript, в частности section 11.9.6, вы увидите, как выполняются сравнения с ===.

строгого равенства Сравнение Алгоритм

Сравнение х === у, где х и у являются значениями, истинным или ложным. Такое сравнение выполняется следующим образом:

  1. Если тип (x) отличается от типа (y), верните значение false.
  2. Если тип (x) не определен, верните true.
  3. Если Type (x) - Null, верните true.
  4. Если тип (x) является числом, то
    • Если x является NaN, верните false.
    • Если y является NaN, верните значение false.
    • Если x - это то же значение числа, что и y, верните true.
    • Если x равно +0 и y равно -0, верните true.
    • Если x есть -0 и y равно +0, верните true.
    • Вернуть false.
  5. Если тип (x) является строкой, то верните true, если x и y - это точно такая же последовательность символов (одинаковая длина и одинаковые символы в соответствующих позициях); в противном случае верните false.
  6. Если тип (x) является логическим, верните true, если x и y оба true или оба false; в противном случае верните false.
  7. Возвращает true, если x и y относятся к одному и тому же объекту. В противном случае верните false.

Поскольку ваши массивы пройти весь путь вплоть до седьмого этапа они должны будут быть один и тот же объект, а не только двух одинаковых объектов. То же самое относится к регулярному оператору равенства (==).

+0

[off topc] Почему вы одобрили [упоминаемое здесь изменение] (http://meta.stackexchange.com/q/211655/180276)? Он должен был быть отклонен – Doorknob

+0

Я быстро прочитал редактирование, и он выглядел достаточно разумным, хотя, как упоминалось в «Meta», у меня не так много опыта по этим тегам. –

+1

Хорошо, тогда, пожалуйста, просто будьте внимательнее при просмотре. (И используйте Skip, когда вы не уверены, и у вас мало опыта.) Спасибо! – Doorknob

3

Потому что каждый раз, когда вы пишете [] вы вызываете конструктор массива.

[] - это то же самое, что и new Array(), а в Javascript новые объекты по сравнению с методом equals различны. См. reference,, это то же самое, что и new Object() при использовании {}.

1

Когда вы делаете [] === [], вы сравниваете ссылки, а не значения (или глубокое сравнение по значениям).

Взгляните на это решение для яваскрипта сравнения массива: Comparing two arrays in Javascript

1

Да, вы правы, что два литерала массива никогда не равны. Это потому, что они являются ссылками на два отдельных экземпляра массивов.

Код для описания теста должно быть написано:

var arr = []; 
var result = sortByFoo(arr); 
console.log(result === arr && result.length == 0); 

Проверка, что ссылка, возвращенная функцией такой же, что был послан в, и что массив еще пуст, гарантирует, что функция возвращается тот же массив не изменился.

+0

Это работает только в том случае, если' sortByFoo' возвращает массив, которым он снабжен. – Stilltorik

+0

@Stilltorik: Да, и нет никакой причины, чтобы функция возвращала новый массив. – Guffa

+0

Это действительно зависит от характеристик. Если он изменяет предоставленный массив напрямую, вы теряете исходный порядок. Это может быть или не быть приемлемым. – Stilltorik

Смежные вопросы