为什么使用数组作为键访问对象中的元素是有效的?
Why does accessing an element in an object using an array as a key work?
你怎么看?
var x = {a: 1}; //=> {a: 1}
var y = Object.keys(x); //=> ['a']
x[y] //=> 1
如果y = ['a']
, x[y]
和x[['a']]
一样,对吧?
x[['a']]; //=> 1
x[[['a']]]; //=> 1
x[[[[[[[['a']]]]]]]]; //=> 1
谁能解释一下这里发生了什么?为什么会这样呢? 属性名必须是字符串。如果您尝试使用数组作为属性名,则会隐式地调用它的toString()
方法。生成一个字符串,其中包含以逗号分隔的值列表。
> var array = ['a', 'b', 'c'];
undefined
> array.toString();
'a,b,c'
如果你只有一个值,那么没有逗号。
> var array = ['a'];
undefined
> array.toString();
'a'
@Quentin建议将属性名自动转换为字符串。好吧,我认为他是对的东西,但给出两个显式的arr.toString()
的例子并没有真正演示访问一个对象的属性使用数组。我把这个作为他帖子的编辑。然而,他把它滚回来了。
无论如何,在我看来,这更明显地展示了隐含的行为。
var x = {'a,b,c': 1};
var y = ['a','b','c'];
x[y]; //=> 1
我认为这有两个原因:
- JS引擎类型
- 任何JS对象都可以像数组一样被访问
所以你的
["a"]
当用作键时将被"强制转换"为string,这将给出
a
甚至[[[[["a"]]]]].toString() == a // true
所以你的
x[y]
end UN as
x["a"]
相关文章:
- 使用Underscore.js修改json数组中所选元素的更有效方法
- 选择具有值数组的所有元素的最有效方法
- 儿童最安全、最有效的元素去除
- 隐藏具有特定类$.each、for等的元素的有效方法
- JavaScript,数组和函数 - 只有数组的最后一个元素有效
- 输入元素模式属性的Javascript正则表达式在reFiddle上有效,但在页面上无效
- 只有当脚本放置在具有所用ID的元素下方时,JavaScript才有效
- TinyMCE - 允许表格单元格元素作为有效的 html
- Js-一种在DOM中查找第n个元素的更优雅/更有效的方法
- 什么's是在IE8+中添加元素的最有效方法
- addEventListener对所有元素都有效,但有时它会提醒消息两次或多次
- 从任何jquery选择器字符串创建元素的最有效方法
- 更改svg元素只在某些情况下有效
- 如何在Angular中有效地检测元素点击
- Jquery两个元素,切换焦点/点击..有效但滞后
- 选择id中带有双点的元素,错误:“#octo:cat”不是有效的选择器
- 由具有内联 JavaScript 的元素赋值的变量中的“this”对所有元素或已赋值的活动元素有效
- addEventListener 在循环中自动触发 - 或者只有最后一个元素有效
- 如何在web ix表单中通过onChange使每个元素有效
- (美元).attr(“name");只对第一个元素有效