var so = {name:'stack'} ['overflow'];

时间:2016-01-18 13:49:18

标签: javascript

var so = {name: 'stack'}['overflow'];
undefined

这个表达到底在做什么?控制台既不会产生任何错误,也不会so包含任何数据。

更新

  1. 如果我直接在控制台中输入{name: 'stack'}['overflow'],则会打印["overflow"]
  2. 虽然{name: 'stack', location: 'somewhere'}['overflow']提供了错误Uncaught SyntaxError: Unexpected token :(…)

6 个答案:

答案 0 :(得分:9)

{name: 'stack'}被称为对象文字,其中包含一个名为name的属性,其对应值为stack

{name: 'stack'}['overflow']正在尝试从对象文字中获取属性overflow的值。

由于对象中没有该属性,因此默认情况下会返回undefined,并将其存储在变量so中。

在控制台中,

  1. {name: 'stack'}被视为一个区块,name:被视为label statement。由于该块内部没有任何内容,因此只需返回['overflow']

    如果您希望将其作为单个表达式进行求值,那么您需要将其包含在括号中,如下所示

    ({name: 'stack'}['overflow'])
    // undefined
    
  2. 在第二种情况下,它会看到块中的标签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);