2010-09-14 74 views
8

如果還沒有初始化數組,是否有一種很好的方式來初始化一個數組? 目前的代碼看起來是這樣的:優雅的方式來初始化和擴展一個javascript數組

if (!obj) var obj = []; 
obj.push({}); 

酷會是這樣的var obj = (obj || []).push({}),但這並不:-(

+0

嗯......那是一個奇怪的位置對於'if(!obj)'之後的'var obj' ..,沒有多大意義,obj'是否也被定義在更高的範圍之內? – gnarf 2010-09-14 13:49:45

+0

javascript不會在init裏面初始化一個額外的作用域if/else – sod 2010-09-14 14:09:08

+0

我知道這一點,這就是爲什麼我想知道爲什麼你會有條件地定義一個'var'就像那樣......我假設'obj'可能是一個函數參數,而關鍵字'var'在那裏只是無用的/不需要的...如果沒有,在調用這個調用之前,沒有辦法定義'obj' ...嘗試'obj = {}; (函數(){if(!obj)var obj = []; console.log(obj);})();' - 你會得到'[]' – gnarf 2010-09-14 14:28:40

回答

12

var obj = (obj || []).push({})工作,不工作,因爲該數組的新長度push回報。一個新的對象,它會創建obj與1值對於現有對象可能引發錯誤 - 如果obj是一個數字,它沒有一個push功能

你應該做的OK用:

var obj = obj || []; 
obj.push({}); 
+1

簡單的單行'(obj = obj || [] )&& obj.push({})&& obj'可能會做他正在尋找的東西... – gnarf 2010-09-14 13:59:15

+0

@gnarf - 有趣的想法。如果我理解正確,該行仍應以'var obj ='開頭。 – Kobi 2010-09-14 14:11:18

2

我能想到的最好的是:

var obj; 
(obj = (obj || [])).push({}); 
+0

除了隱式地,'obj' * should *在這種情況下總是未定義的,這使得'(obj || [])'只是'[]' – gnarf 2010-09-14 13:53:30

+0

不會。 'var obj;'如果之前是'defined',則不會將'obj'設置爲'undefined'。 – RoToRa 2010-09-14 14:23:49

+0

除非你在同一範圍內使用'var obj'兩次,這看起來像是浪費了'var'給我... – gnarf 2010-09-14 16:00:23

0
with(obj = obj || []) push({}); 
+0

我認爲你的預編輯是優越的:'(obj || [{}] )'是功能性的。 – annakata 2010-09-14 14:14:35

+0

-1:erk!永遠不會*永遠*使用Javascript的「with」功能。 – Spudley 2010-09-14 14:15:23

+0

我擔心道格拉斯克羅克福德告訴我的那句'with'陳述(http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/),其使用方式可能會發生不好的事情 – sod 2010-09-14 14:18:57

0

只是一個很小的調整你的想法,使其工作

var obj = (obj || []).concat([{}]); 
+0

儘管'concat'實際上會返回一個全新的數組......這意味着如果obj已經被定義了(我仍然好奇這是怎麼發生的),它不會在任何父範圍內添加'{}'...... – gnarf 2010-09-14 14:01:57

+0

這是真的,但是原始信息中沒有範圍信息題。另外,由於他在嘗試中使用了賦值語句,所以突變顯然不是必需的。 – 2010-09-14 14:24:15

+0

他的原始似乎是這樣說的:'obj'應該保持原樣,或者變成一個空的數組,然後''將東西推到它上面......問題是'push'不會發生在原始的'obj'上所以如果這個'obj'是對一個不同數組或者函數參數等的引用,那麼你的代碼就不會做同樣的事情...... – gnarf 2010-09-14 16:03:54

相關問題