为什么我得到不同的结果?使用name.property和name [property]

时间:2017-07-25 10:43:32

标签: javascript

/ *枚举

for in语句可以遍历对象中的所有属性名称。枚举将包括函数和原型属性。 * /

//我写的第一个代码

var fruit = {
    apple: 2,
    orange: 5,
    pear:1
},
sentence = 'I have',
quantity;
for (kind in fruit) {
    quantity = fruit[kind];
    sentence += quantity + '' + kind +
                (quantity === 1?'': 's') +
                ', ';
}
sentence = sentence.substr(0,sentence.length-2) + '.';
alert(sentence);

//我写的第二个代码

var fruit = {
    apple: 2,
    orange: 5,
    pear:1
},
sentence = 'I have',
quantity;//
for (kind in fruit) {
    quantity = fruit.kind;
    sentence += quantity + '' + kind +
                (quantity === 1?'': 's') +
                ', ';
}
sentence = sentence.substr(0,sentence.length-2) + '.';
alert(sentence);

2 个答案:

答案 0 :(得分:1)

此问题的根源是以点( obj.prop )与数组表示法( obj [prop] )访问属性之间的区别。

  • obj.prop 表示访问可从 obj 对象访问的名为“prop”的媒体资源。
  • 另一方面,
  • obj [prop] 表示:确定 prop 变量的字符串值,并访问与 obj <上的字符串值匹配的属性/ strong> object。

在第一种情况下:

for (kind in fruit) {
    quantity = fruit[kind];
}

在for循环执行期间, kind 变量被赋予字符串“apple”,“orange”,“pear”。所以你有效地进行访问,比如这个水果[“apple”](相当于fruit.apple),水果[“orange”](或fruit.orange),水果[“梨”]或(fruit.pear) )。

在第二种情况下:

for (kind in fruit) {
    quantity = fruit.kind;
    ...
}

您始终可以访问水果对象的种类属性。由于 fruit 对象没有种类属性,因此您将始终获得未定义

如果您想详细了解如何在JavaScript中解析属性访问权限,可以查看Secrets of the JavaScript Ninja本书 - 它帮助了我。

答案 1 :(得分:0)

这是因为您的kind是变量。

当您编写fruit.kind时,JS引擎实际将其解释为fruit['kind']