что это за штука в JavaScript? - PullRequest
9 голосов
/ 07 октября 2008
var something = {

wtf: null,
omg: null
};

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

Ответы [ 8 ]

17 голосов
/ 07 октября 2008

Это буквальный синтаксис объекта. «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#Object_Literals

11 голосов
/ 07 октября 2008

Это литерал объекта с двумя свойствами. Обычно так люди создают ассоциативные массивы или хэши, потому что 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)
}
6 голосов
/ 07 октября 2008

Объяснение с точки зрения «Я хочу ассоциативный массив в 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 выбираются эти дополнительные методы. В этом и заключается смысл использования массива / объектов в качестве ассоциативного массива бедняка.

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

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

5 голосов
/ 07 октября 2008

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

То же, что и:

var o = new Object();
o.wtf = null;
o.omg = null;
4 голосов
/ 07 октября 2008

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

var something = new Object();
something["wtf"] = null;
something["omg"] = null;
2 голосов
/ 07 октября 2008

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

Вы могли бы сказать

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

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

1 голос
/ 07 октября 2008

Этот код:

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;
0 голосов
/ 07 октября 2008

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

...