2016-12-23 56 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())。