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


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

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

и

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

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

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

7 95

7 ответов:

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

вот более конкретный пример, почему нечисловые клавиши не" подходят " к массиву:

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

alert(myArray.length);

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

в JS массивы-это объекты, просто слегка измененные (с несколькими дополнительными функциями).

функции как:

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

все в JavaScript является объектом, кроме примитивных типов.

код

var myArray = Array();

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

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

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

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

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

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

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

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

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

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

выводит

0
undefined

по сути, интерпретатор 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);

показывать

one,two,three

[object Object]

["one", "two", "three"]

4    .toSource() forgot me! 

3    and my length! 

({0:"one", 1:"two", 2:"three", a:4})

и 0 1 2 a и 0 1 2 a.

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

ни синтаксически, ни семантически корректно использовать произвольный экземпляр объекта в качестве функции типа 123() или "abc"() или []() или {}() или obj() здесь obj - любой тип, кроме Function, так что произвольный экземпляр объекта не является 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, an объектно-ориентированный стиль программирования (ООП-объектно-ориентированный стиль программирования - "s" - это мой собственный каламбур!) был в моде, и переводчик был также окрещен Java, чтобы придать ему большую достоверность. Методы функционального программирования были отнесены к более абстрактным и эзотерическим исследованиям, изучающим теории автоматов, рекурсивных функций, формальных языков и т. д. и как таковой не очень приятный на вкус. Однако сильные стороны этих формальных соображений четко проявляются в Javascript в частности, как реализовано в двигателе FF Gecko (т. е. .toSource()).


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

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

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

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

одно практическое отличие заключается в использовании 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"}

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

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

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

The {}-нотации-это просто синтаксический сахар, чтобы сделать код лучше ;-)

JavaScript имеет много подобных конструкций, таких как построение функций, где function() является просто синонимом

var Func = new Function("<params>", "<code>");