ES6, 全称 ECMAScript 6.0
,是 JavaScript
的下一个版本标准
,2015.06 发版。
ECMA 是标准,JS 是实现
ES6
主要是为了解决 ES5
的先天不足。比如 JavaScript
里并没有类的概念
目前各大浏览器基本上都支持 ES6
的新特性,其中 Chrome
和 Firefox
浏览器对 ES6
新特性最友好,IE7~11
基本不支持 ES6。
Node
已经实现的 ES6
特性
针对 ES6
的兼容性问题,可以使用多种语法解析转换工具,把我们写的 ES6
语法转换成 ES5
,相当于在 ES6
和浏览器
之间做了一个翻译官。比较通用的工具方案有 babel
,jsx
,traceur
,es6-shim
等。
const
用于声明常量,其值一旦被设定不能再被修改,对于声明对象时,可以修改对象的值,但是不能修改引用对象的地址let
用于声明变量,其值能再被修改window
)。i
的值。var value;
if (false) {
value = 1;
}
console.log(value); // undefined
var value = 2;
console.log(window.value); // 2
for (var i = 0; i < 10; i++) {
...
}
console.log(i); // 10
变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部
1
let value = 1;
编译为
var value = 1;
2
if (false) {
let value = 1;
}
console.log(value); // Uncaught ReferenceError: value is not defined
编译为
if (false) {
var _value = 1;
}
console.log(value);
通过 “{}” 去简化键值对取值的操作
let obj = {
username:'webpilot',
userid:12831,
profession:'webDeveloper',
region:'beijing'
}//同样还是这个数据
let {
username,userid,profession,region} = obj;
就是从obj里面取出前面花括号里面变量所对应的值,并且对应的赋值给花括号里面的对象。
使用冒号设置别名
let {
username:n} = obj;
通过等号设置默认值
let {
username:n} = obj;
对象用的是 “{}” 而数组要用 “[]” 中括号
let arr = ['a','b','c','d','e','f','g'];
let [first,second,third] = arr;
console.log(first,second,third);//a b c
参数扩展/展开 ...args
function show(a, b, ...args) {
console.log(a)
console.log(b)
console.log(args)
}
console.log(show(1, 2, 3, 4, 5))
let arr1 = [1, 2, 3]
let arr2 = [4, 5, 6]
let arr3 = [...arr1, ...arr2]
console.log(arr3)
function show2(a, b=5, c=8) {
console.log(a, b, c)
}
show2(88, 12)
ES6 引入了一种新的原始数据类型 Symbol
,表示独一无二的值。
1.Symbol()
函数会返回symbol
类型的值,使用 typeof,结果为 “symbol”
var s = Symbol();
console.log(typeof s); // "symbol"
2.Symbol 是一个原始类型的值,不能使用 new
命令,不能使用instanceof
判断其类型
3.Symbol
函数可以接受一个字符串作为参数,表示对 Symbol
实例的描述
4.如果 Symbol
的参数是一个对象,就会调用该对象的 toString
方法,将其转为字符串
5.Symbol
函数的参数只是表示对当前 Symbol
值的描述,相同参数的 Symbol
函数的返回值是不相等的。
6.Symbol
值不能与其他类型的值进行运算
7.Symbol
值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性
var mySymbol = Symbol();
// 第一种写法
var a = {
};
a[mySymbol] = 'Hello!';
// 第二种写法
var a = {
[mySymbol]: 'Hello!'
};
// 第三种写法
var a = {
};
Object.defineProperty(a, mySymbol, {
value: 'Hello!' });
// 以上写法都得到同样结果
console.log(a[mySymbol]); // "Hello!"
8.Symbol
作为属性名,该属性不会出现在 for...in
、for...of
循环中,也不会被 Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回。但是,它也不是私有属性,有一个 Object.getOwnPropertySymbols
方法,可以获取指定对象的所有 Symbol
属性名。
var obj = {
};
var a = Symbol('a');
var b = Symbol('b');
obj[a] = 'Hello';
obj[b] = 'World';
var objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols);
// [Symbol(a), Symbol(b)]
Map
对象保存键值对。任何值
(对象或者原始值) 都可以作为一个键或一个值
Object
的键只能
是字符串
或者 Symbols
,但一个 Map
的键可以是任意值
。Map
中的键值是有序
的(FIFO 原则),而添加到对象中的键则不是。Map
的键值对个数可以从 size
属性获取,而 Object 的键值对个数只能手动计算。Object
都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。Set
对象允许你存储任何类型的唯一值
,无论是原始值或者是对象引用。
// 数组去重
var mySet = new Set([1, 2, 3, 4, 4]);
[...mySet]; // [1, 2, 3, 4]
// 并集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var union = new Set([...a, ...b]); // {1, 2, 3, 4}
Proxy
与 Reflect
是 ES6
为了操作对象引入的 API 。
Proxy
可以对目标对象的读取
、函数调用
等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式
,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。
Reflect
可以用于获取目标对象的行为,它与 Object
类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy
是对应的。