一、let
1.用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
2.变量一定要在声明后使用
3.暂时性死区,不受外部的影响。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
4.let不允许在相同作用域内,重复声明同一个变量。
5.for循环的计数器,很适用let命令
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
//输出了3次abc。表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。
设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
6.块级作用域的出现,使立即执行函数表达式(IIFE)不再必要了。
// IIFE 写法
(function () {
var tmp = ...;
...
}());
// 块级作用域写法
{
let tmp = ...;
...
}
二、const
1.const声明一个只读的常量。一旦声明,常量的值就不能改变,且就必须立即初始化,不能留到以后赋值。
2.只在声明所在的块级作用域内有效。
3.const命令声明的常量也不提升,存在暂时性死区,只能在声明的位置后面使用。
三、class
1.JavaScript 语言中,生成实例对象的传统方法是通过构造函数
而ES6中通过class关键字,可以定义类。
2.类的数据类型就是函数,类本身就指向构造函数。
3.类的内部所有定义的方法,都是不可枚举的(non-enumerable)
4.类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。
4.constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。若无定义,一个空的constructor方法会被默认添加。constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
class Point {
}
// 等同于
class Point {
constructor() {}
}
5.类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。
6.类不存在变量提升
7.Class 可以通过extends关键字实现继承
class Point {
}
class ColorPoint extends Point {
}
网友评论