测试哈哈

参考阮一峰ES6

let

变量不提升

let声明的变量不存在变量提升,只能先完成声明,再使用,否则会报错

console.log(a); // undefined
console.log(b); // Uncaught ReferenceError: b is not defined
var a = 1;      
let b = 2;

只在当前代码块内有效

let声明的变量只在let命令所在的代码块内有效

if (true) { var a = 2; let b = 3 };
console.log(a); // 2
console.log(b); // Uncaught ReferenceError: b is not defined
var a = [];
for (var i = 0; i < 5; i++) {
  a[i] = function () { console.log(i); }
}
// 这里的i都指向全局变量i
a[2]();         // 5
a[4]();         // 5
console.log(i); //5

var b = [];
for (let k = 0; k < 5; k++) {
  b[k] = function () { console.log(k); }
}
// k是用let声明的,每循环一次等于重新声明一次k,js引擎会记住上次k的值,在这个值的基础上进行计算
b[2]();         // 2
b[4]();         // 4
console.log(k); // Uncaught ReferenceError: k is not defined

//for循环的()内是父作用域,{}内是子作用域
for (var v = 0; v < 2; v++) {
  let v = 'h';
  console.log(v);
}
// h
// h
// h

不允许重复声明

let不允许在相同作用域内重复声明同一个变量

function func() {
  let a = 2;
  let a = 6;
}
func()  // Uncaught SyntaxError: Identifier 'a' has already been declared

const

声明的常量只读

const声明一个只读的常量,一旦声明,这个常量指向的内存地址不得改动

对于基本数据类型来说,就是不可改变

const a = 2;
a = 3;      // Uncaught TypeError: Assignment to constant variable.

对于对象或数组等复杂数据类型来说,就是指针不可改变

const a = { num: 2 };
const b = [1];
a.num = 3;    // 不报错,内存地址未变
b[0] = 'hi';  // 不报错,内存地址未变
a = {};       // Uncaught TypeError: Assignment to constant variable  

声明的同时必须赋值

const声明常量时必须赋值,不能留到后面再赋值

const a;
a = 2;  //Uncaught SyntaxError: Missing initializer in const declaration

constlet相同,只能先声明再使用,且只在声明所在的块级作用域内有效

猜你喜欢

转载自www.cnblogs.com/ak-b/p/8995039.html