什么时候在 JavaScript 中对对象使用 const ?

IT技术 javascript
2021-03-13 23:17:43

我最近阅读了有关 ES6const关键字的信息,当我遇到这样的事情时,我可以理解它的重要性:

(function(){
    const PI = 3.14;
    PI = 3.15; //  Uncaught TypeError: Assignment to constant variable
})();

所以,没有人可以改变我的PI变量。

我的误解是我不明白在哪种情况下使用constwith 对象是有意义的(除了阻止人们做myObj = newValue;)。

(function(){
    const obj = {a:1 ,b: 2, c:3};
    //obj = {x:7 , y:8, z: 9}
    //This is good
    //TypeError: Assignment to constant variable.

    obj.a=7; obj.b=8 ; obj.c=9;
    console.log(obj); //outputs: {a: 7, b: 8, c: 9}
})();

所以在声明一个对象时:我什么时候应该说:现在我必须const?

6个回答

这是网络上的一个常见误解,CONST它不会创建不可变的变量,而是创建不可变的绑定。

例如。

 const temp1 = 1;
 temp1  = 2 //error thrown here.

 temp1.temp = 3 // no error here. Valid JS code as per ES6

所以const创建到该特定对象的绑定。const 确保变量temp1不会有任何其他对象的绑定。

现在来到Object. 我们可以Object通过使用获得不可变的功能Object.freeze

const temp3 = Object.freeze( {a:3,b:4})
temp3.a = 2 // it wont update the value of a, it still have 3
temp3.c = 6 // still valid but wont change the object
任何参考说明?
2021-04-23 23:17:43
谢谢你的明确答复。您能否解释一下“如何const确保该变量temp1不会有任何其他对象的绑定。”?
2021-05-06 23:17:43
@TechTurtle ,在浏览器的控制台中执行上面的例子
2021-05-09 23:17:43
@TechTurtle 我有点晚了,但只是为了完整起见:这里是参考const这里是参考Object.freeze()
2021-05-09 23:17:43

根据ES6-Features.org,常量用于制作“不能重新分配新内容的变量”。

const关键字使一个变量本身不可变的,而不是它分配的内容。当内容是一个对象时,这意味着对象本身仍然可以更改。

因此,可以更改用const变量声明的对象的内容,但不能将新对象分配给const变量。

您仍然可以向对象添加新属性。

const myVar = "someValue";
const myObj = {"name": "nameValue", "age": 14}

console.log(myVar); //someValue
console.log(myObj.name); //nameValue

myObj.name = "newNameValue"; 
console.log(myObj.name); //newNameValue

myObj.someNewAttr = "newAttrValue";
console.log(myObj.someNewAttr); //newAttrValue

myObj = {"newNameAttr": "newNameValue"}; //Uncaught TypeError: Assignment to constant variable.
console.log(myObj.newNameAttr);

myVar = "newValue"; //Uncaught TypeError: Assignment to constant variable.
console.log(myVar);

你也可以在这个小提琴上看到:https : //jsfiddle.net/am2cbb00/1/

@ChristofferBubach 当第二次调用该函数时,它会完全初始化“myObject”的一个新实例,但无法将该新实例分配给同一个“obj”变量,因为它是定义的常量变量。在您的示例中,构造函数所有者还使用“this”传递当前对象范围。开发人员可能希望在构造函数中从该范围访问某个变量。
2021-04-27 23:17:43
那么......在函数的顶部,这样的事情会做什么?const obj = new myObject(this, data);我不确定它是像 PHP 中的 static 还是更像 ..ehm.. 单例模式,但与.. erhm...“resuable”构造函数?或者也许只是一个程序员无缘无故炫耀他闪亮的新关键字......
2021-04-28 23:17:43
我知道我的构造函数是什么 - 我的问题是:第二次调用函数时会发生什么?对象是用新的数据变量重新初始化,还是更像是调用之间的静态?我发现不清楚为什么要在这样的函数中使用它。
2021-04-30 23:17:43
所以问题是,如果您要更改/重新分配其属性,使用对象是否合适(最佳实践明智)?
2021-05-03 23:17:43
@ChristofferBubach 它是 javascript 中的构造函数。“new”关键字用于创建对象的实例。基本上,它创建一个新对象并为其分配一个 const 变量。因此,该 const 变量不能与另一个对象绑定。只能更改和更新对象的内容。另请在此处查看 JS 中“新”关键字的用法:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-05-19 23:17:43

let 和 const 用于类型安全。在任何情况下您都必须使用它们,但它们很方便并减少难以发现的错误。

const 对您不想变成另一种类型的对象有用的情况的一个示例。

const x = {"hello":"world"};

// This is OK
x.hello = "stackoverflow";

// This is not OK
x = JSON.stringify(x);

如果您使用一个对象并希望确保该对象的身份永远不会改变,请说:

const a = {};

a.b = 1;

// ... somewhere in the other part of the code or from an async call
// suddenly

someAjaxCall().then(() => { a = null; }) // for preventing this

const对于 javascript 编译器来说,使用也是一个很好的提示,可以对您的代码进行优化,从而使执行速度更快,let或者var因为身份永远不会改变,

出于性能原因,请注意在循环中使用 const/let,因为它可能会因每个循环创建变量而降低性能,但在大多数情况下,差异可以忽略不计。

const 实际上创建不可变绑定而不是使变量不可变。

由于原始数据类型(BooleannullundefinedStringNumber)是按值传递的,因此它们本身变得不可变,因此不能重新分配给其他值。

在复杂的数据类型的情况下(ArrayFunction,和Object),它们通过引用传递。当我们改变或修改它们的属性/元素时,我们不会改变它们的绑定,因此const不会抛出任何错误。