Что это за штука в JavaScript?

var something = {

wtf: null,
omg: null
};

Мои знания JavaScript по-прежнему ужасно неоднородны с тех пор, как я в последний раз программировал их, но я думаю, что теперь я переучил большинство из них. За исключением этого. Я не помню, чтобы когда-либо видел это раньше. Что это? И где я могу узнать больше об этом?

8 ответов

Решение

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

var myobj = {
    name: 'SO',
    hello: function() {
        alert(this.name);
    }
};

И вы можете перебирать свойства, используя цикл for:

for (i in myobj) {
    // myobj[i]
    // Using the brackets (myobj['name']) is the same as using a dot (myobj.name)
}

Это буквальный синтаксис объекта. "Wft" и "omg" - это имена свойств, а "null" и "null" - значения свойств.

Это эквивалентно:

var something = new Object();
something.wtf = null;
something.omg = null;

Ознакомьтесь с документацией Mozilla по литералам объектов: http://developer.mozilla.org/En/Core_JavaScript_1.5_Guide:Literals

Объяснение с точки зрения "Я хочу ассоциативный массив в Javascript" (именно для этого во многих случаях в конечном итоге используются объектные литералы)

Из "Освоения массивов JavaScript"

Ассоциативный массив - это массив, в котором в качестве индекса используется строка вместо числа.

var normalArray    = [];
    normalArray[1] = 'This is an enumerated array';

    alert(normalArray[1]);   // outputs: This is an enumerated array

var associativeArray           = [];
    associativeArray['person'] = 'John Smith';

    alert(associativeArray['person']); // outputs: John Smith   

Javascript не имеет и не поддерживает ассоциативные массивы. Однако... Все массивы в Javascript являются объектами, и синтаксис объектов Javascript дает базовую эмуляцию ассоциативного массива. По этой причине приведенный выше пример кода действительно будет работать. Имейте в виду, что это не настоящий массив и в нем есть реальные подводные камни, если вы попытаетесь его использовать. Элемент person в этом примере становится частью свойств и методов объекта Array, как и.length, .sort(), .splice() и все другие встроенные свойства и методы.

Вы можете просмотреть свойства объекта с помощью следующего цикла:

var associativeArray = [];
associativeArray["one"] = "First";
associativeArray["two"] = "Second";
associativeArray["three"] = "Third";
for (i in associativeArray) { 
   document.writeln(i+':'+associativeArray[i]+', '); 
   // outputs: one:First, two:Second, three:Third
};

В приведенном выше примере, ассоциативная Array.length будет равна нулю, потому что мы на самом деле ничего не помещали в массив, мы помещаем это в объект ассоциативного массива. ассоциативный массив [0] будет неопределенным.

Цикл в приведенном выше примере также подберет любые методы, свойства и прототипы, которые были добавлены в массив, а не только ваши данные. Многие проблемы, с которыми сталкиваются люди с библиотекой Prototype, заключаются в том, что их ассоциативные массивы ломаются, потому что Prototype добавляет несколько полезных функций Prototype к объекту Array, и для циклов i in x выбираются эти дополнительные методы. В этом и заключается смысл использования массива / объектов в качестве ассоциативного массива бедняка.

В качестве последнего примера предыдущий код будет работать независимо от того, определите ли вы ассоциативный массив как Array ([]), Object({}), Regular Expression (//), String("") или любой другой объект Javascript,

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

Это литерал Object (или, иногда, ванильный объект в библиотеках с классами Hash).

То же самое, что и:

var o = new Object();
o.wtf = null;
o.omg = null;

Это объектный литерал. Это фактически эквивалентно следующему:

var something = new Object();
something["wtf"] = null;
something["omg"] = null;

Я считаю, что это объект с 2 свойствами, WTF и OMG.

ты мог бы сказать

something.wtf = "myMessage";
alert(something.wtf);

проверить JSON.ORG

Этот код:

var something = {wtf:null}

Имеет тот же эффект, что и:

var something={};
something.wtf=null;

Или за ненужное многословие:

var something=new Object();
something.wtf=null;

И полезно помнить, что последняя строка такая же, как

something["wtf"]=null;

Таким образом, вы можете использовать:

var myName="wtf";
something[myName]=null;

Это пример встроенного экземпляра объекта JavaScript.

Другие вопросы по тегам