JavaScript: в каком смысле объекты `{}` и массивы `[]` одинаковые или разные - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь понять следующий вывод:

'use strict';
console.log(Object.getPrototypeOf([]));
// [] 
console.log(Object.getPrototypeOf(Array.prototype));
// {}
console.log(Object.getPrototypeOf([]) == Array.prototype);
// true
console.log(Object.getPrototypeOf([]) === Array.prototype);
// true
console.log([]=={});
// false
console.log([]==={});
// false

В частности, почему строки 6 и 8 оцениваются как true, тогда как строки 10 и 12 оцениваются как false. #

Редактировать: я сделал глупую опечатку в строках 6 и 8, которую я сейчас редактировал. Это делает вопрос другим. Извинения.

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

[] создаст новый экземпляр массива. Два экземпляра отличаются друг от друга (вы можете изменить их независимо). То же самое относится к {}, он создает новый экземпляр объекта.

Все экземпляры массива совместно используют один и тот же экземпляр прототипа (существует только один экземпляр прототипа массива). Прототипом массива является прототип объекта.

Они просто имеют одинаковое представление строки / JSON.

Что вы в основном делаете во втором console.log примере: console.log(Object.getPrototypeOf(Object.getPrototypeOf([])))

Последние две строки возвращают false, потому что вы сравниваете объекты и массивы (которые не могут быть равны)

0 голосов
/ 26 августа 2018

Все прототипы в Javascript в конечном итоге наследуются от одного и того же прототипа объекта.Вот почему, если вы добавите свойство к прототипу объекта, все объекты в вашей программе получат это свойство.В строках 6 и 8 вы сравниваете Object.prototype с самим собой, который равен.

Однако в строках 10 и 12 вы сравниваете 2 разных объекта, они могут иметь один и тот же прототип, но это абсолютно два разных объекта в памяти.

0 голосов
/ 26 августа 2018

В строках 6 и 8 вы буквально сравниваете два абсолютно одинаковых выражения.

(X)===(X) всегда 1 true для любого X, и в этом случае (X)==(X) также автоматически true (не всегда наоборот).

[] и {} не совпадают, следовательно, false из строк 10 и 12.

(1) при условии, конечно, что X является неразрушающим или только для чтения выражением, если X является чем-то вроде (Y++), то это не имеет места.

...