ES6
{
const MAX = 10;
let a = 1;
var b = 2;
}
a; b;
ES5只有两种申明变量的方式var, function, ES6增加了四种方式:let, const, class, import
解构赋值
let [foo, [[bar], bat]] = [1, [[2], 2]]; 默认赋值 [x, y = 'b'] = ['a']; 对象赋值 var { foo, bar } = { foo: 'aaa', bar: 'bbb' }; 函数参数的赋值 [[1,2],[3,4]].map(function([a,b]) { return a+b; }); 变量解构赋值用途 交换变量的值 [x, y] = [y, x]; 提取JSON数据 var jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData; console.log(id, status, number);// 42, "OK", [867, 5309]
字符串扩展
var s = 'Hello world!'; s.startsWith('world', 6); // true s.endsWith('Hello', 5); // true s.includes('Hello', 6); // false 'hello'.repeat(2) // "hellohello" padStart 用于头部补全, padEnd 用于尾部补全。 'x'.padStart(5, 'ab') // 'ababx' 'x'.padStart(4, 'ab') // 'abax' 'x'.padEnd(5, 'ab') // 'xabab' 'x'.padEnd(4, 'ab') // 'xaba' 模板字符串(template string)是增强版的字符串,用反引号标识。 var name = "Bob", time = "today"; `Hello ${name}, how are you ${time}?`
Number
Number.isFinite() Number.isNaN() Number.parseInt(), Number.parseFloat() Number.isSafeInteger() Math对象的扩展 Math.trunc 方法用于去除一个数的小数部分,返回整数部分。 Math.sign 方法用来判断一个数到底是正数、负数、还是零。 Math.cbrt 方法用于计算一个数的立方根。 Math.fround方法返回一个数的单精度浮点数形式。 Math.hypot 方法返回所有参数的平方和的平方根。
函数
rest参数:不定参数 function foo(...values) {} 箭头函数 var f=v => v 绑定this foo::bar var method = ::Object.foo;
数组
...将一个数组转化为逗号分隔的参数序列 Array.from() let ps = document.querySelectorAll('p'); Array.from(ps).forEach(function (p) { console.log(p); }); Array.of() Array.of 方法用于将一组值,转换为数组。 Array.of(3, 11, 8) // [3,11,8] Array.find() Array.findIndex() [1,4,-5,10].find((n) => n < 0); // -5 Array.fill() Array.entries() Array.keys() Array.values() Array.includes()
Object:
var target = { a: 1 }; var source1= { b: 2 }; var source2= { c: 3 }; Object.assidn(target, source1, source2); target // {a:1, b:2, c: 3)
Symbol
从根本上防止属性名冲突 var mySym = Symbol(); var a = {}; a.mySym = 'hello'; a['mySym'] //;hello' a[mySym] //undefined Symbol.for('bar') === Symbol.for('bar') //true Symbol('var') === Symbol('bar') //false var s1 = Symbol.for('foo'); Symbol.keyFor(s1); //true var s2 = Symbol('foo'); Symbol.keyFor(s2); //undefined
Set和Map
Set成员值是唯一的 Map的键值可以是字串,可以是其它值,包括对象 var s = new Set(); var s1 = new set("bar", "circle"); s1.add(3.14); [2,3,5,3,2,4].map(x => s.add(x)); for (let i of s) { console.log(i); } //2,3,5,4 Array.from(new Set(1,2,3,4)) //转化为数组 var map = new Map(); map.set("key", "value"); map.get("key"); map.has("key"); map.delete("key"); map.clear(); for (let [key, value] of map) { } for (let [key, value] of map.entries()) { } for (let key of map.keys()) { } for (let value of map.values()) { } map.forEach((value, key) => { });
Proxy
外部访问该对象,进行过滤和改写 var proxy = new Proxy({}, { get: function(target, property) { return 35; } }); proxy.time; //35 proxy.name; //35 proxy.title; //35
Reflect
从Reflect对象能查询到语言内部的方法
Promise
将异步操作以同步操作的流程表达出来 ,避免了层层嵌套的回调函数 var promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作成功 */){ resolve(value); } else { reject(error); } }); Promise.prototype.then() Promise.prototype.catch() Promise.all(); Promise.race() async函数 function timeout(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } async function asyncPrint(value, ms) { await timeout(ms); console.log(value); } asyncPrint('hello world', 50); async function f() { try { await new Promise(function (resolve, reject) { throw new Error('出错了'); }); } catch(e) { } return await('hello world'); } f() .then(v => console.log(v)) .catch(e => console.log(e)) // Error:出错了 //多个异步触发 let [foo, bar] = await Promise.all([getFoo(), getBar()]);
class
class Point { constructor(x, y) { this.x = x; this.y = y; } static getPI() { //静态函数,函数中的this指向类,而不是实例 return 3.1415926; } toString() { return this.x + ',' + this.y; } } Point.getPI(); //向类中添加方法 Object.assign(Point.prototype, { toValue() {} }); new.target属性 构造函数不是通过new命令或Reflect.construct()调用的,new.target会返回undefined class ColorPoint extends Point { constructor() { super(); this.x = 2; } toString() { console.log(x,y); super.toString(); } } 在静态方法之中,这时super将指向父类, 而不是实例
静态字符串一律使用单引号或反引号,不使用双引号。动态字符串使用反引号。 函数的参数如果是对象的成员,优先使用解构赋值。 单行定义的对象,最后一个成员不以逗号结尾。多行定义的对象,最后一个成员以逗号结尾。 js const a = { k1: v1, k2: v2 }; const b = { k1: v1, k2: v2, }; 使用扩展运算符(...)拷贝数组。const itemsCopy = [...items]; 立即执行函数可以写成箭头函数的形式。 javascript (() => { console.log('Welcome to the Internet.'); })();