Haz*_*ass 46 javascript ecmascript-5 ecmascript-6
我不知道是什么样的区别let,并const在ES6.它们都是块作用域,如以下代码中的示例所示:
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它.
Som*_*Guy 24
你所看到的只是一个实现错误.根据ES6规范维基const,const是:
初始化一次,只读其后的绑定形式是有用的,并且在现有实现中以const声明的形式具有先例.
这意味着只读,就像现在一样.constTraceur和Continuum中的ES6实现是错误的(它们可能只是忽略了它)
Sha*_*ear 12
letconstES6let允许您声明一个范围仅限于块的变量(局部变量)。主要区别在于var变量的作用域是整个封闭函数:
if (true) {
var foo = 42; // scope globally
}
console.log(foo); // 42
Run Code Online (Sandbox Code Playgroud)
letif (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)
let对绝大多数代码都非常有用.它可以极大地增强您的代码可读性并减少编程错误的可能性.
let abc = 0;
if(true)
abc = 5 //fine
if(true){
let def = 5
}
console.log(def)
Run Code Online (Sandbox Code Playgroud)const是可读性和可维护性的良好实践,并且避免使用魔术文字,例如
// Low readability
if (x > 10) {
}
//Better!
const maxRows = 10;
if (x > maxRows) {
}
Run Code Online (Sandbox Code Playgroud)const声明必须初始化
const foo; // ERROR: const declarations must be initialized
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)
thelet和const关键字都是声明块作用域变量的方法。但是有一个很大的区别:
let可以重新赋值。const必须在声明时初始化并且不能重新分配。如果您尝试重新分配使用const关键字声明的变量,您将收到以下错误(chrome devtools):
如果我们知道我们想为变量赋值一次并且不想重新分配变量,那么使用const关键字有以下优点:
const不应重新分配。通过这种方式,我们的代码变得更具声明性且更易于使用。尽管用 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()它来实现这一点。