2016-10-15 7 views
1

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

var rockSpearguns = { 
    Sharpshooter: {barbs: 2, weight: 10, heft: "overhand"}, 
    Pokepistol: {barbs: 4, weight: 8, heft: "shoulder"}, 
    Javelinjet: {barbs: 4, weight: 12, heft: "waist"}, 
    Firefork: {barbs: 6, weight: 8, heft: "overhand"} 
}; 

function listGuns (guns) { 
    for(var speargun in guns){ 
     console.log("Behold! "+speargun+", with "+ guns[speargun].heft +" heft!"); 
    } 
} 

часть я немного запутался в guns[speargun].heft это будет работать должным образом, но если я guns.speargun.heft то будет неопределенным.

Так как свойства в скалеSpearguns - всего лишь одно слово, не должно gun.speargun еще можно вызвать свойства тоже?

Я подумал немного был причиной, потому что теперь speargun является строкой, если положить в gun.speargun он фактически становится чем-то вроде gun."speargun", потому что при использовании брекет обозначений мы просто делаем gun[speargun] вместо того, чтобы использовать gun["speargun"], потому что это будет просто сделать его двойной цитата, которая неверна.

+0

Возможный дубликат [разница между обозначением точки и обозначением скобки в javascript] (http://stackoverflow.com/questions/20736758/difference-between-dot-notation-and-bracket-notation-in-javascript) – Xufox

ответ

1

Это не работает, потому что в объекте rockSpearguns отсутствует свойство speargun.

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

В вашем коде var speargun заменяется строковым значением каждого из свойств внутри объекта rockSpearguns.

Так, guns[speargun].heft переводит guns["Sharpshooter"].heft

Я предлагаю вам прочитать this article.

+0

thx статья помогает много. – Tsuna

1

Да действительно неоднозначная, есть Эмпирические правила:

  1. использовать скобки, если значение свойства доступа генерируется динамически, например:

    var Person = { 
        name: 'John', 
        lastName: 'Doe' 
    }; 
    
    var propertyToCheck = 'name'; 
    
    console.log(Person.propertyToCheck); //error! 
    console.log(Person[propertyToCheck]); //correct way 
    
  2. использовать точки, когда свойство значение для доступа не генерируется динамически (вы знаете это свойство заранее), например:

    var Person = { 
        name: 'John', 
        lastName: 'Doe' 
    }; 
    
    console.log(Person.name); 
    

Кстати, вы можете использовать скобки в обеих случаях, но я предпочитаю, чтобы выбрать то, что я только что упомянул выше, потому что с помощью скобок, кажется, вы работаете с массивами, а не с объектами

Надеется, что это помогает вам

1

эквивалент

speargun = 'Sharpshooter'; 
guns[speargun].heft 

является

guns['Sharpshooter'].heft 

или

guns.Sharpshooter.heft 

потому что переменная в квадратных скобках оценивается и содержимое вставляется в скобки. Вы получаете второй абзац.

Если у вас есть строковый литерал, вы можете использовать его как property accessor для объекта с точками.

В вашем предыдущем случае, можно использовать

guns.speargun.heft 

, не существует, потому что у вас нет никакого имущества speargun в объекте guns.