我的一位朋友就此进行了讨论,
考虑:
var myString = new String("Hello world");
alert(myString["length"]); // 11
myString["simpleExample"] = true;
alert(myString.simpleExample); // true
myString["spaced Example"] = false;
alert(myString["spaced Example"]); // false
将所有属性放入数组中,
var props = ["length","simpleExample","spaced Example"];
现在,这将,
for (var i = 0; i < props.length; i++) {
alert(myString[props[i]]);
}
// alerts each property individually: 11 true false
这不起作用,
for (var i = 0; i < props.length; i++) {
alert(myString.props[i]);
}
// alerts each property individually: 11 true error/nothing
是否可以通过点表示法访问 属性/键(其中包含空格) ,或者 数组( 运营商 仅为此而制作?
编辑:
我的朋友在接受采访时问了这个问题,采访者使用 eval 暗示了一个解决方案,但我无法弄明白。< / p>
答案 0 :(得分:0)
如果你允许自己使用eval
(你真的,真的不应该因为这么微不足道的原因),那么确实有可能:
for (var i = 0; i < props.length; i++) {
alert(eval("myString." + props[i]));
}
只是出于争论而把它放在这里。不要在生产中使用它。并且它仍然不能使用包含不允许字符的属性(例如"spaced Example"
)。
答案 1 :(得分:-1)
myString.props[i]
表示与myString[props[i]]
完全不同的内容。 myString.props[i]
是i
props
属性的名称/索引myString
的项目。因为myString
(大概)不是有一个属性props
,这将导致错误。
myString[..]
表示法允许您使用表达式获取myString
的属性,例如表达式props[i]
。点符号无法做同样的事情。点符号总是字面的。 myString.props
始终引用props
的{{1}}属性,而不是其他内容。
点符号还限制为要求属性名称是有效的变量名称。例如。 myString
不起作用,因为obj.0
本身不是有效的标识符;即你也不能0
。因此,您需要使用var 0
。除此之外,obj[0]
和obj.0
完全等效,但obj[0]
下标符号允许更广泛的表达式。