1.箭头函数=>
([函数的形参,多个参数则以逗号分隔]) => [函数返回的值/表达式]
箭头函数则会捕获其所在上下文的 this 值,作为自己的 this 值。这样就 不需要利用闭包来保存this了。
2.let
自ES6,javascript开始拥有块级作用域,而 let 则是配合块级作用域,作为替代 var 的一个语法定义。
有了块级作用域,再也不用担心临时变量污染到外层的变量了:
3.const
const 是用来定义常量的,一旦定义了就不可修改(一修改就报错)。用途嘛,也比较单一,就是定义一下配置项什么的,免得被团队里的愣头青写的代码给瞎改了。
4.destructuring
解构, 按照一定模式,从数组和对象中提取值,对变量进行赋值
let [foo, [[bar], baz]] = [ 1 , [[ 2 ], 3 ]]; console .log(foo); // 1 console .log(bar); // 2 console .log(baz); // 3
5. 数组去重
Set是类似数组的一种结构,可以存储数据,与数组的区别主要是 Set中的元素不能重复,而数组中的元素可以重复 。
一句话总结: Set类型是一个包含无重复元素的有序列表。 使用Set的 has() 方法可以判断一个值是否在这个set中。 delete(要删除的值) :删除单个值
clear():清空所有的值
set()和Array.from()
var arr=[1,1,2,3,4,3,2];
var newArray=Array.from(new Set(arr))//[1,2,3,4]
6.ES6新增一个基本数据类型Symbol,用来创建私有成员。
Symbol 作为属性名,该属性不会出现在for…in、for…of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,它也不是私 有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。
7. Map数据结构
ECMAScript 6 中的 map 类型包含一组有序的键值对,其中键和值可以是任何类型。
- Map创建也是使用Map构造函数
- 向Map存储键值对使用set(key, value);方法
- 可以使用get(key),来获取指定key对应的value
8 . 在ES6直接借鉴其他语言,引入了类的概念。
class PersonClass {
// 等效于 PersonType 构造函数。
constructor(name) { //这个表示类的构造函数。constuctor也是关键字必须小写。
this.name = name; //创建属性。 也叫当前类型的自有属性。
}
// 等效于 PersonType.prototype.sayName. 这里的sayName使用了我们前面的简写的方式。
sayName() {
console.log(this.name);
}
}
let person = new PersonClass("Nicholas");
person.sayName(); // 输出 "Nicholas"
console.log(person instanceof PersonClass); // true
console.log(person instanceof Object); // true
console.log(typeof PersonClass); // "function"
console.log(typeof PersonClass.prototype.sayName); // "function"
类声明和函数定义不同,类的声明是不会被提升的。类声明的行为和 let 比较相似,所以当执行流作用到类声明之前类会存在于暂存性死区(temporal dead zone)内。
类声明中的代码自动运行在严格模式下,同时没有任何办法可以手动切换到非严格模式。
所有的方法都是不可枚举的(non-enumerable),这和自定义类型相比是个显著的差异,因为后者需要使用 Object.defineProperty() 才能定义不可枚举的方法。
所有的方法都不能使用 new 来调用,因为它们没有内部方法 [[Construct]]。
不使用 new 来调用类构造函数会抛出错误。也就是 必须使用new 类() 的方式使用
试图在类的方法内部重写类名的行为会抛出错误。(因为在类的内部,类名是作为一个常量存在的
9.ES6中的继承,使用类和extends
class Father{
constructor(name){
this.name = name;
}
sayName(){
console.log(this.name);
}
}
class Son extends Father{ //extents后面跟表示要继承的类型
constructor(name, age){
super(name); //相当于以前的:Father.call(this, name);
this.age = age;
}
//子类独有的方法
sayAge(){
console.log(this.age);
}
}
var son1 = new Son("李四", 30);
son1.sayAge();
son1.sayName();
console.log(son1 instanceof Son); // true
console.log(son1 instanceof Father); //true
- 你只能在派生类中使用 super(),否则(没有使用 extends 的类或函数中使用)一个错误会被抛出。
- 你必须在构造函数的起始位置调用 super(),因为它会初始化 this。任何在 super() 之前访问 this 的行为都会造成错误。也即是说super()必须放在构造函数的首行。
- 在类构造函数中,唯一能避免调用 super() 的办法是返回一个对象。
如果在子类中声明与父类中的同名的方法,则会覆盖父类的方法。(这种情况在其他语言中称之为 方法的覆写、重写 )
如果在子类中又确实需要调用父类中被覆盖的方法,可以通过super.方法()来完成。