如何使用对象属性上的点访问器方案执行类似的操作?

时间:2015-09-16 12:27:54

标签: javascript

我的一位朋友就此进行了讨论,

考虑:

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>

2 个答案:

答案 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]下标符号允许更广泛的表达式。