2016-12-23 107 views
-1

我是最新編程約定和編程語言最新增加版的忠實粉絲。最近我在Google Guidelines中讀到我們應該使用constlet而不是varJavascript - 如何使用新約定聲明命名空間對象

現在在我的項目,我有名字空間的對象變量(如果那是他們叫什麼,糾正我請如果我錯了)這樣

var myObj = { 

    func1: {}, 
    func2: {} 
}; 

var myOtherObj = { 

    var1: 'foo', 
    var2: 'bar' 
}; 

現在如何使用新的慣例,我應該命名這些對象,與constlet?我很困惑,因爲我不知道這些大件物體是否會隨着時間而改變,或者不...

+0

將它們更改爲'const'並運行代碼。如果因爲某些事情想要修改變量而中斷,請修正或者將其更改爲「let」。 – Pointy

+0

事情是我不完全明白這是一個大對象這意味着什麼改變,如果它是一個簡單的局部變量,那麼它很容易看到它是否得到改變 –

+1

'const'聲明不會使**對象**不可變的;它使**變量**不可變。 – Pointy

回答

3

constconst不會阻止物體發生變化(否則它不會變成freeze它們)。它可以防止變量的值發生變化。

例如,你仍然可以做

const myObj = { 

    func1: {}, 
    func2: {} 
}; 

然後

myObj.fun3 = function(){... 

你不能用const聲明的變量做什麼(但似乎並沒有成爲你的意志)是

myObj = {}; 

模塊通常用const來聲明。

1

我試圖遵循的一般規則是:const隨處可以,let當你不能使用constvar從來沒有。

在您的例子的情況下,當要定義對象(或在其它情況下陣列等),我傾向於限定那些let得到清楚地表明,無論是可變基準可以改變的內容。

const不會阻止列表中的對象或元素的屬性被更改,所以如果您不確定是否會發生這種情況,在我看來最好使用let。這更清楚,可以防止混亂。

+0

如果在我的示例中myOtherObj.var1在運行時多次更改值,該怎麼辦?如果myOtherObj被聲明爲const,它會起作用嗎? –

+0

是的,這仍然有效,但它的語義混淆。就像我所說的,'const'不會阻止對象屬性或列表元素的更改,它只會阻止分配變量引用。所以,就你的情況而言,如果對象'myOtherObj'的內容可以多次改變,使用'let'就可以清楚地表明你的意圖。 – sma

1

如果你真的想不能更改值引用一個對象,這也是不可改變的象徵,你可以這樣做:

const CONSTANT = Object.freeze({ 
    a: "hello", 
    b: "world" 
}); 

記住,舊的平臺仍然在那裏,還承擔將不支持constlet(對此可能也支持Object.freeze())。