Ассоциативные массивы в JavaScript это ошибка? - PullRequest
0 голосов
/ 13 июня 2019


Мы знаем, что JavaScript не поддерживает массивы с именованными индексами. (Ассоциативные массивы)
Но когда мы объявляем ассоциативный массив в javascript, он не выдает ошибку и работает удивительно.

let arr = [];
arr.name = 'John';
arr.lastName = 'Doe';
arr.age = 46;

let obj = {name: 'John', lastName: 'Doe', age: 46};


Когда console.log('arr'), он покажет:

[name: "John", lastName: "Doe", age: 46] //Shown with a special array sign
   age: 46
   lastName: "Doe"
   name: "John"
   length: 0
   __proto__: Array(0) //Shown Array Not Object


И

console.log(arr instanceof Array);  //true
console.log(arr instanceof Object); //true

console.log(obj instanceof Array);  //false
console.log(obj instanceof Object); //true


Как видите, Javascript отображает ассоциативный массив со специальным знаком массива. [] (скобка)
Но он обрабатывается как объект с этим массивом, потому что некоторые методы и свойства массива (например, length) будут давать неверные результаты.
Кроме того, если JavaScript работает с массивом этого типа в качестве объекта, почему не используется специальная метка для объекта? {} (фигурная скобка)
Короче говоря, это ошибка в интерпретаторе JavaScript или тип способности?

Ответы [ 3 ]

1 голос
/ 13 июня 2019

В Javascript массив не только «обрабатывается» как объект - он является объектом.Как вы уже видели, поскольку arr instanceof Object имеет значение true.

Поэтому, как и для всех объектов, вы можете назначать свойства массиву.

length - это специальное свойство массивов,и представляет количество элементов массива.Поскольку в вашем примере arr не имеет элементов, его свойство length равно 0. Объекты не имеют автоматически специального свойства length.

0 голосов
/ 13 июня 2019

Чтобы добавить к сказанному выше киберсамом:

let arr = [];

Это создает «литерал массива».В основном это массив (который является объектом) и имеет длину 0. Если вы введете значения, например:

arr.push ('hello')

, тогда он будет иметь длину 1Однако вы добавили свойства, такие как:

arr.name = 'John';

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

Чтобы сделать вещи еще более запутанными, есть также Array (), который является другим объектом (не буквальным).Он ведет себя таким же образом, за исключением того, что вы можете создать его экземпляр, как объект класса.Хотя это почти никогда не требуется, поэтому придерживайтесь литералов.

Некоторые ссылки, объясняющие это подробнее:

https://www.w3schools.com/js/js_arrays.asp

https://www.w3schools.com/js/js_datatypes.asp

https://www.w3schools.com/js/js_objects.asp

0 голосов
/ 13 июня 2019

Массив - это объект - он предоставляет свои собственные методы, которые вы можете использовать.Объект не является массивом - вы не можете использовать методы объекта Array.

Я нашел этот текст, который описывает его несколькими словами: http://www.javascripter.net/faq/arrayobject.htm

...