'let'和'const'ECMAScript 2015(ES6)有什么区别?

Haz*_*ass 46 javascript ecmascript-5 ecmascript-6

我不知道是什么样的区别let,并constES6.它们都是块作用域,如以下代码中的示例所示:

const PI = 3.14;
console.log(PI);

PI = 3;
console.log(PI);

const PI = 4;
console.log(PI);

var PI = 5;
console.log(PI);
Run Code Online (Sandbox Code Playgroud)

在ES5中,输出将是:

3.14
3.14
3.14
3.14
Run Code Online (Sandbox Code Playgroud)

但在ES6中它将是:

3.14
3
4
5
Run Code Online (Sandbox Code Playgroud)

我想知道为什么ES6允许更改const值,问题是为什么我们现在应该使用'const'?我们可以使用'let'代替吗?

注意:jsbin可用于测试,选择JavaScript运行ES5代码,Traceur运行ES6功能.

Tho*_*ter 56

let和之间的区别在于const,一旦使用值将值/对象绑定到变​​量const,就无法重新分配给该变量.例:

const something = {};
something = 10; // Error.

let somethingElse = {};
somethingElse = 1000; // This is fine.
Run Code Online (Sandbox Code Playgroud)

请注意,const这不会使某些东西变得不可变.

const myArray = [];
myArray.push(1); // Works fine.
myArray[1] = 2; // Also works fine.
console.log(myArray); // [1, 2]
myArray = [1, 2, 3] // This will throw.
Run Code Online (Sandbox Code Playgroud)

可能目前使对象(浅)不可变的最佳方法是使用const它.

  • @rohan-patel 1) `const` 是在变量名和对象常量之间进行绑定(或“链接”)。如果您使用 `const`,该变量名称将*始终*引用同一个对象。2) `let` 是块范围的,而 `var` 是函数范围的。换句话说,如果你在 if 语句中使用 `let`,变量将只存在于 if 语句中,而如果你使用 `var`,变量将存在于 if 语句所在的函数体内在。 (2认同)

Som*_*Guy 24

你所看到的只是一个实现错误.根据ES6规范维基const,const是:

初始化一次,只读其后的绑定形式是有用的,并且在现有实现中以const声明的形式具有先例.

这意味着只读,就像现在一样.constTraceur和Continuum中的ES6实现是错误的(它们可能只是忽略了它)

这是关于Traceur没有实现Github问题const


Sha*_*ear 12

letconst

ES6let允许您声明一个范围仅限于块的变量(局部变量)。主要区别在于var变量的作用域是整个封闭函数:

if (true) {
  var foo = 42; // scope globally
}

console.log(foo); // 42
Run Code Online (Sandbox Code Playgroud)

范围let

if (true) {
  let foo = 42; // scoped in block
}

console.log(foo); // ReferenceError: foo is not defined
Run Code Online (Sandbox Code Playgroud)

在函数作用域中使用var与使用相同let

function bar() {
  var foo = 42; // scoped in function
}

console.log(foo); // ReferenceError: foo is not defined
Run Code Online (Sandbox Code Playgroud)

let关键字将变量声明附加到它所包含的任何块的范围。

申报令

let和之间的另一个区别var是声明/初始化顺序。let访问早于其声明之前声明的变量会导致ReferenceError

console.log(a); // undefined
console.log(b); // ReferenceError: b is not defined
  
var a = 1;
let b = 2;
Run Code Online (Sandbox Code Playgroud)

使用const

另一方面,使用 ES6 与const使用 很相似let,但一旦分配了值,就无法更改。用作const不可变值以防止变量意外重新分配:

const num = 42;

try {
  num = 99;
} catch(err) {
  console.log(err);
  // TypeError: invalid assignment to const `number'

}

num; // 42
Run Code Online (Sandbox Code Playgroud)

用于const分配现实生活中恒定的变量(例如冰点温度)。JavaScriptconst并不是要使值成为不可更改的,它与值无关,const而是为了防止将另一个值重新分配给变量并将变量设置为只读。但是,值始终可以更改:

const arr = [0, 1, 2];
arr[3] = 3; // [0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

要防止值更改,请使用Object.freeze()

let arr = Object.freeze([0, 1, 2]);
arr[0] = 5;

arr; // [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

使用letWithFor循环

真正令人眼前一亮的一个特殊情况let是在循环头中for

for (let i = 0; i <= 5; i++) {
  console.log(i);
}

// 0 1 2 3 4 5

console.log(i); // ReferenceError, great! i is not global
Run Code Online (Sandbox Code Playgroud)


Par*_*ain 6

  • 在编程中使用块范围.
  • 对于每个块,让我们创建自己的新范围,您无法在该块之外访问它.
  • 值可以根据需要多次更改.
  • let对绝大多数代码都非常有用.它可以极大地增强您的代码可读性并减少编程错误的可能性.

    let abc = 0;
    
    if(true)
     abc = 5 //fine
    
    if(true){
      let def = 5
    }
    console.log(def)
    
    Run Code Online (Sandbox Code Playgroud)

常量

  • const就像我们在let:+中看到的一样
const foo = 123;
if (true) {
    const foo = 456; // Allowed as its a new variable limited to this `if` block
}
Run Code Online (Sandbox Code Playgroud)


Wil*_*een 5

概括:

theletconst关键字都是声明块作用域变量的方法。但是有一个很大的区别:

  • 用 声明的变量let可以重新赋值。
  • 声明的变量const必须在声明时初始化并且不能重新分配。

如果您尝试重新分配使用const关键字声明的变量,您将收到以下错误(chrome devtools):

const 重新分配错误

我们为什么要使用这个?

如果我们知道我们想为变量赋值一次并且不想重新分配变量,那么使用const关键字有以下优点:

  • 我们在代码中表示我们不想重新分配变量。这样,如果其他程序员查看您的代码(甚至您查看您之前编写的自己的代码),您就会知道声明的变量const不应重新分配。通过这种方式,我们的代码变得更具声明性且更易于使用。
  • 我们强制不能重新分配变量的原则(JS引擎抛出错误)。这样,如果您不小心尝试重新分配一个不打算重新分配的变量,您可以在较早的阶段检测到这一点(因为它已记录到控制台)。

警告:

尽管用 with 声明的变量const不能重新分配,但这并不意味着分配的对象不可变。例如:

const obj = {prop1: 1}

// we can still mutate the object assigned to the 
// variable declared with the const keyword
obj.prop1 = 10;
obj.prop2 = 2;

console.log(obj);
Run Code Online (Sandbox Code Playgroud)

如果您还希望您的对象不可变,您可以使用Object.freeze()它来实现这一点。