Я могу объяснить более конкретно, начиная с этого примера, основанного на хорошем примере Фредрика.
var test1 = [];
test1.push("value");
test1.push("value2");
var test2 = new Array();
test2.push("value");
test2.push("value2");
alert(test1);
alert(test2);
alert(test1 == test2);
alert(test1.value == test2.value);
Я просто добавил еще одно значение в массивы и сделал четыре предупреждения:
Первый и второй должны дать нам значение, хранящееся в каждом массиве, чтобы быть уверенным в значениях. Они вернутся так же!
Теперь попробуйте третий, он возвращает ложь, потому что
JS рассматривает test1 как VARIABLE с типом данных массива , а test2 - как OBJECT с функциональностью массива и
здесь есть несколько небольших отличий.
Первое различие заключается в том, что когда мы вызываем test1, он вызывает переменную, не задумываясь, он просто возвращает значения, которые хранятся в этой переменной, независимо от ее типа данных!
Но когда мы вызываем test2, он вызывает функцию Array () , а затем сохраняет наши значения "Pressed" в своем свойстве "Value" , и то же самое происходит, когда мы предупреждаем test2, он возвращает свойство "Value" объекта массива.
Поэтому, когда мы проверяем, равно ли test1 равным test2, они, конечно, никогда не вернут true, один - функция, а другой - переменная (с типом массива), даже если они имеют одинаковое значение!
Чтобы быть уверенным в этом, попробуйте 4-е предупреждение с добавленным .value; это вернет истину. В этом случае мы сообщаем JS «Независимо от типа контейнера, будь то функция или переменная, сравните значения, хранящиеся в каждом контейнере, и скажите нам, что вы видели!» это именно то, что происходит.
Надеюсь, я четко сформулировал эту идею, и извините за мой плохой английский.