Почему я могу добавить именованные свойства в массив, как если бы это был объект?
следующие два разных фрагмента кода кажутся мне эквивалентными:
var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";
и
var myObject = {'A': 'Athens', 'B':'Berlin'};
потому что они оба ведут себя так же, а также typeof(myArray) == typeof(myObjects)
(объект урожай'').
есть ли разница между этими вариантами?
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 используются для хранения вещей с порядковым индексом - используйте его как традиционный массив, стек или очередь. Объект-это хэш-используйте его для данных, которые имеют отдельный ключ.