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

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

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

а также

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

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

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

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

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

 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.

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

Экземпляр 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); 

отображение

 один два три

 [Объект Object]

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

 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, в частности, как реализовано в FF-движке Gecko (то есть .toSource() ).


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

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

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

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

Одно практическое отличие заключается в том, что при использовании 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. Хотя массивы имеют волшебное обновление свойства length, для объектов, отличных от массивов, нет способа реализовать такое свойство.

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

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

{} -Значение – это просто синтаксический сахар, чтобы сделать код приятнее 😉

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

 var Func = new Function("", ""); 
  • Избегание! = Null
  • ключ доступа и значение объекта с помощью * ngFor
  • Создание имени переменной с использованием значения String
  • Как читать данные из NSFileHandle по строкам?
  • NSTimeInterval для NSDate
  • Как установить фоновый backgroundRadius для NSString на iOS7
  • Как преобразовать значение NSString в NSData?
  • Как работают hashCode () и identityHashCode () на задней панели?
  • Получение ключей NSDictionary, отсортированных по их соответствующим значениям
  • Как вы получаете «ссылку на объект» объекта в java, когда toString () и hashCode () были переопределены?
  • Что такое hash-код объекта, если hashCode () не переопределяется?
  • Interesting Posts

    Постоянно ли потребляет электропитание своих номинальных ватт?

    Android: Как включить / отключить пункт меню выбора при нажатии кнопки?

    Безмолвно игнорируется remove ()

    Как подключить Bluetooth-устройства с помощью API BluetoothHeadset

    Как «вывести» столбец в DataTable с помощью C #?

    На PCIe 1.0 64-разрядная графическая карта может быть совместима с 32-разрядной ОС (Windows 7 32bits)

    Ошибка при установке Mac OS X 10.10 (Yosemite) на 512 ГБ SSD в моем MacBook 2010 года

    Сначала необходимо выпустить команду STARTTLS. Отправка электронной почты с помощью Java и Google Apps

    Поместите звезды на ggplot barplots и boxplots – чтобы указать уровень значимости (p-value)

    C # – код для заказа по свойству с использованием имени свойства в виде строки

    Как поместить переменную внутри строки в Python?

    Angular2 + http с интервалом

    Кодировка UTF8 длиннее максимальной длины 32766

    как создать линию произвольной толщины с помощью Bresenham?

    Ссылки вставляют неанглийскую подпись в Word 2010

    Давайте будем гением компьютера.