2016-01-18 129 views
2
var so = {name: 'stack'}['overflow']; 
undefined 

這個表達式到底在做什麼?控制檯不會產生任何錯誤,也不包含任何數據。var so = {name:'stack'} ['overflow'];

UPDATE

  1. 如果我直接在控制檯輸入{name: 'stack'}['overflow']它打印["overflow"]
  2. 雖然{name: 'stack', location: 'somewhere'}['overflow']給出錯誤Uncaught SyntaxError: Unexpected token :(…)

回答

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 
    
+0

你能回答更新的問題! – Shreyas

+0

@Shreyas請檢查最新的答案。 – thefourtheye

+0

這是否意味着'名稱'在括號內使用時不被視爲標籤? – Shreyas

3

它會設置so(不foo - 有那沒有提及),以undefined

更詳細地,所述表達{name: 'stack'}是一個「對象常量」創建與單個鍵(name)與值stack一個JS對象。

['overflow']然後嘗試從該對象中提取給定的密鑰,但它不包含該密鑰,因此計算結果爲undefined

把它放在一起:var so = undefined

0

您只用一個字段名稱創建一個新對象,然後嘗試檢索字段溢出。你可以這樣做,而不是測試:

iets={name:"stack overflow"}["name"] 

它給不確定的另一個原因是:如果你把變種在它前面的控制檯總給人不確定的。

0

Javascript在某些方面「是不同的」,所以我們把它分解成2個步驟。

var so = {name: 'stack'}; 

這將創建一個名爲so新的對象,有一個屬性name

so['overflow'] 

在javascript中可以從使用陣列支架的對象讀出的屬性,因此,此代碼試圖讀取從so對象overflow屬性。 既然您沒有,它的值是undefined

當你把它放在一起,你正在創建一個新的對象,然後試圖從它讀一個不存在的屬性,這將導致價值undefined

0

沒有答案。這是我個人的意見

你爲什麼不嘗試一下本作用自己的眼睛看到正在發生的事情:

var foo = {name : "stack"}["overflow"]; 
var bar = {name : "stack", overflow : "foobar" }["overflow"]; 
console.log(foo); 
console.log(bar); 
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 :(…) 

如果有人能解釋爲什麼?