Для .. в цикле? - PullRequest
       50

Для .. в цикле?

0 голосов
/ 21 июля 2011

Я теряю это здесь .. Теперь я чрезвычайно озадачен тем, как работает этот цикл.

Из w3 школ:

var person={fname:"John",lname:"Doe",age:25}; 

for (x in person)
{
document.write(person[x] + " ");
}

человек - это объект со свойствами, верно? Как эти свойства доступны с помощью скобок? Я думал, что это для массивов?

Почему это тоже работает, и разве это не должно быть ТОЛЬКО так:

var person=[]; 
person["fname"] = "John";
person["lname"] = "Doe";
person["age"] = "25";


for (x in person)
{
document.write(person[x] + " ");
}

Ответы [ 5 ]

3 голосов
/ 21 июля 2011

Есть два способа получить доступ к свойствам объекта:

  • obj.key
  • obj['key']

Преимущество:Второй метод заключается в том, что вы также можете предоставить ключ динамически, например, obj[x] в вашем примере.obj.x будет буквально означать свойство x (т. Е. obj['x']), а это не то, что вам нужно.

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

1 голос
/ 21 июля 2011

Вы можете получить доступ как к литералам объектов, так и к массивам с помощью оператора скобок в JavaScript. Для объектов оператор скобок обращается к члену объекта путем преобразования значения в скобках в строку (если это не строка) и проверки, действительно ли это свойство ( mdc ).

Ваш второй пример предлагает использовать «ассоциативный массив», который не рекомендуется использовать в JavaScript ( ссылка ).

Чтобы ответить на ваш вопрос: стандартным способом (imo) написания Map подобной структуры - т.е. объекта, содержащего пары ключ-значение - для итерации по циклу for-in, является литерал Object; стандартный способ записи более традиционного массива - Array Object.

var map = { "a": "string" , "b": 0 , "c": null } ;

    for(key in map) console.log("(!!) map # " + key + " : " + map[key] ) ;

var list = ["string",0,null] ;

    for(i = 0 ; i < list.length ; i++) console.log("(!!) list # " + i " : " + list[i] ) ;
0 голосов
/ 21 июля 2011

в объектах js являются асоциативными массивами, что означает, что они являются не чем иным, как набором пар ключ-значение.
Если вы не понимаете, что такое браслеты, не надо! Свойства объекта Javascript можно получить через «.» или конструкция "[]":

var a = {key : 'val'};
alert(a['key'] === a.key);

В большинстве случаев они работают одинаково.
Это всего лишь вопрос настроек и реализации браузера (например, Firefox работает быстрее с квадратными скобками, а Chrome работает быстрее с точками).
Существуют ситуации, когда конструирование точки завершится неудачно: предположим, у вас есть объект, у которого есть свойство с именем «some-key».
Если вы хотите получить к нему доступ с точечной нотацией: object.some-key, вы наверняка получите ошибку, потому что код интерпретируется как разница между двумя значениями: object.some - key. В этом случае вы должны использовать скобки: object['some-key'].
Есть и другие случаи, когда ключ содержит специальный символ, такой как ., ,, ;, \, * ... и т. Д., Который уже имеет интерпретацию в javascript.

0 голосов
/ 21 июля 2011

http://bonsaiden.github.com/JavaScript-Garden/#object.general

"К свойствам объекта можно получить доступ двумя способами: либо через нотацию, либо через квадратную скобку."

0 голосов
/ 21 июля 2011

Свойства объектов JavaScript могут быть доступны как с object [key], так и с object.key (и, скорее всего, некоторыми другими способами). Просто так, как они работают.

Ваш второй пример, массив - это особый объект, но все же объект.

...