var so = {name: 'stack'}['overflow'];
undefined
这个表达到底在做什么?控制台既不会产生任何错误,也不会so
包含任何数据。
更新
{name: 'stack'}['overflow']
,则会打印["overflow"]
{name: 'stack', location: 'somewhere'}['overflow']
提供了错误Uncaught SyntaxError: Unexpected token :(…)
答案 0 :(得分:9)
{name: 'stack'}
被称为对象文字,其中包含一个名为name
的属性,其对应值为stack
。
{name: 'stack'}['overflow']
正在尝试从对象文字中获取属性overflow
的值。
由于对象中没有该属性,因此默认情况下会返回undefined
,并将其存储在变量so
中。
在控制台中,
{name: 'stack'}
被视为一个区块,name:
被视为label statement。由于该块内部没有任何内容,因此只需返回['overflow']
。
如果您希望将其作为单个表达式进行求值,那么您需要将其包含在括号中,如下所示
({name: 'stack'}['overflow'])
// undefined
在第二种情况下,它会看到块中的标签name:
,然后它会看到'stack', location: 'somewhere'
,这是JavaScript引擎无法解析的。这就是你得到错误的原因。同样,将表达式包装在括号中以获取实际值,如此
({name: 'stack', location: 'somewhere'}['overflow'])
// undefined
答案 1 :(得分:3)
它会将so
(而非foo
- 没有提及)设置为undefined
。
更详细地说,表达式{name: 'stack'}
是"对象字面值"使用值为name
的单个键(stack
)创建一个JS对象。
['overflow']
然后尝试从该对象中提取给定的密钥,但它不包含该密钥,因此评估为undefined
。
完全放弃:var so = undefined
。
答案 2 :(得分:1)
在理想情况下代码应该是
var so = {name: 'stack'};
console.log(so.overflow);
//输出为undefined
,因为对象overflow
上没有so
属性
还有另一种方法可以使用[]
,
console.log(so['overflow']);
现在,如果您将所有内容合并到一个声明中
var so = {name: 'stack'}['overflow'];
//显然是undefined
要注意的是,如果你只有{name: 'stack'}['overflow'];
它应该给出错误,那么奇怪的是Firefox和Chrome都做了以下事情:
{a:'aa'}['bbbb']; ["bbbb"] //printed output {a:'aa',b:'bb'}['bbbb']; VM529:2 Uncaught SyntaxError: Unexpected token :(…)
如果有人能解释原因?
答案 3 :(得分:0)
您创建一个只有字段名称的新对象,然后它会尝试检索字段溢出。你可以通过这样做来测试:
iets={name:"stack overflow"}["name"]
它给undefined的另一个原因是:如果你把var放在它前面,控制台总是给出undefined。
答案 4 :(得分:0)
Javascript在某些方面“不同”,所以我们将其分解为两个步骤。
var so = {name: 'stack'};
这将创建一个名为so
的新对象,其属性为name
。
so['overflow']
在javascript中,您可以使用数组括号从对象中读取属性,因此此代码尝试从overflow
对象读取so
属性。
由于你没有,它的值是undefined
。
当你把它们放在一起时,你正在创建一个新对象,然后尝试从中读取一个不存在的属性,这将产生值undefined
。
答案 5 :(得分:0)
没有答案。这是我的个人建议
为什么不试着用自己的眼睛看看发生了什么:
var foo = {name : "stack"}["overflow"];
var bar = {name : "stack", overflow : "foobar" }["overflow"];
console.log(foo);
console.log(bar);