it-swarm.com.ru

Почему я могу добавить именованные свойства в массив, как если бы это был объект?

Следующие два разных фрагмента кода кажутся мне эквивалентными:

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

а также

var myObject = {'A': 'Athens', 'B':'Berlin'};

потому что они оба ведут себя одинаково, а также typeof(myArray) == typeof(myObjects) (оба дают «объект»).

Есть ли разница между этими вариантами?

101
prinzdezibel

Фактически все в javascript - это объект, поэтому вы можете «злоупотребить» объектом Array , задав для него произвольные свойства. Это следует считать вредным хотя. Массивы предназначены для данных с числовым индексом - для нечисловых ключей используйте объект.

Вот более конкретный пример того, почему нечисловые ключи не «соответствуют» массиву:

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

alert(myArray.length);

Это не будет отображать «2», но «0» - фактически, в массив не было добавлено никаких элементов, только некоторые новые свойства добавлены в объект массива.

125
Paul Dixon

В JS массивы являются объектами, только слегка измененными (с еще несколькими функциями).

Функции, такие как:

concat
every   
filer
forEach
join
indexOf
lastIndexOf
map
pop
Push
reverse
shift
slice
some
sort
splice
toSource
toString
unshift
valueOf 
14
Casey

Все в JavaScript - это объект, кроме примитивных типов.

Код

var myArray = Array();

создает экземпляр объекта Array, в то время как 

var myObject = {'A': 'Athens', 'B':'Berlin'};

создает экземпляр объекта Object.

Попробуйте следующий код

alert(myArray.constructor)
alert(myObject.constructor)

Таким образом, вы увидите разницу в типе конструктора объекта.

Экземпляр объекта Array будет содержать все свойства и методы прототипа Array.

5
Dasha Salo

Мне кажется, мне слишком метафоричен и загадочен с предыдущего ответа. Разъяснение следует.

Экземпляр Array, Boolean, Date, Function, Number, RegExp, String является объектом, но дополнен методами и свойствами, характерными для каждого типа. Например, массив имеет предопределенное свойство length, а универсальные объекты - нет.

javascript:alert([].length+'\n'+{}.length)

дисплеи

 0 
 Неопределенными 

По сути, интерпретатор FF Gecko также различает массивы и универсальные объекты с различными различиями при оценке языковых конструкций.

javascript:
  ra=[  "one",   "two",   "three"]; ra.a=4;
  ob={0:"one", 1:"two", 2:"three"}; ob.a=4;
  alert(
    ra            +"\n\n"+
    ob            +"\n\n"+
    ra.toSource() +"\n\n"+
    ra.a          +"\t .toSource() forgot me! \n\n"+
    ra.length     +"\t and my length! \n\n"+
    ob.toSource());
  ps=""; for(i in ra)ps+=i+" "; alert(ps);  /* NB .length is missing! */
  ps=""; for(i in ob)ps+=i+" "; alert(ps);

отображение

 один, два, три 

 [объект объекта] 

 ["один", "два", "три"] 

 4 .toSource () забыл меня ! 

 3 и моя длина! 

 ({0: «один», 1: «два», 2: «три», a: 4}) 

и 0 1 2 a и 0 1 2 a.

Что касается утверждения, что все объекты являются функциями:

Синтаксически и семантически неправильно использовать экземпляр произвольного объекта в качестве функции, такой как 123() или "abc"() или []() или {}() или obj(), где obj - это любой тип, отличный от Function, поэтому произвольный объект INSTANCE не является Function. Однако, учитывая объект obj и его тип как Array, Boolean, Date, ..., как obj стал Array, Boolean, Date, ...? Что такое Array, Boolean, Date, ...?

javascript:
    alert([Array, Boolean, Date, Function, 
              Number, Object, RegExp, String] . join('\n\n') );

дисплеи

function Array() {
    [native code]
}

function Boolean() {
    [native code]
}

function Date() {
    [native code]
}

function Function() {
    [native code]
}

function Number() {
    [native code]
}

function Object() {
    [native code]
}

function RegExp() {
    [native code]
}

function String() {
    [native code]
}

В любом случае, без двусмысленности, тип объекта проявляется как определение function, отсюда и утверждение, что все объекты являются функциями! (Насмешка в том, что я намеренно скрыл и размыл различие экземпляра объекта с экземпляром его типа! Тем не менее, это показывает, что «у вас не может быть одного без другого», объект и функция! Капитализация выделяет тип как против экземпляра.)

Как функциональная, так и объектная парадигма являются фундаментальными для программирования и реализации низкоуровневых встроенных примитивов интерпретатора JS, таких как Math и JSON и true.

 javascript:alert([Math, JSON, true.toSource()].join("\n\n"));

дисплеи

[object Math]

[object JSON]

(new Boolean(true))

Во время разработки Javascript, объектно-ориентированный стиль программирования (ООП - объектно-ориентированный стиль программирования - "это" - мой собственный каламбур!) Был в моде, и интерпретатор был аналогично крещен с Java, чтобы придать ему большую достоверность , Методы функционального программирования были отнесены к более абстрактным и эзотерическим экзаменам с изучением теорий автоматов, рекурсивных функций, формальных языков и т.д. И, как таковые, не являются приемлемыми. Тем не менее, сильные стороны этих формальных соображений ясно проявляются в Javascript, особенно в том виде, как они реализованы в движке Gecko FF (т. Е. .toSource()).


Определение объекта для функции является особенно удовлетворительным, поскольку оно определено как рекуррентное отношение! определяется с помощью своего собственного определения!

function Function() { [native code] }
и так как функция является объектом, то же самое отношение
function Object() { [native code] }.

Большинство других определений находятся в состоянии статического значения терминала. Тем не менее, eval() является особенно мощным примитивом, поэтому String также может включать произвольную функциональность.

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

5
Ekim

Одно практическое отличие заключается в том, что при использовании JSON.stringify для array все нечисловые индексы игнорируются:

var arr = [];
var obj = {};

arr['name'] = 'John';
obj['name'] = 'John';

console.log(arr);    // will output [name: "John"]
console.log(obj);    // will output {name: "John"}

JSON.stringify(arr); // will return []
JSON.stringify(obj); // will return {"name":"John"}
1
user5513314

Разница между массивами и другими объектами в JavaScript. В то время как массивы имеют магически обновляемое свойство длины, для объектов, отличных от массивов, нет способа реализовать такое свойство.

var arrName = [];
arrName[5] = "test";
arrName.length; // <- 6

Массив используется для хранения вещей с порядковым индексом - используйте его как традиционный массив, стек или очередь. Объект - это хеш - используйте его для данных, имеющих отдельный ключ.

0
Parth Raval