一、let和const
1.let声明的变量只在它所在的代码块有效。
2.let声明的变量仅在块级作用域内有效。
3.不存在变量提升。
4.每个let声明的变量都有各自的作用域。它所声明的变量一定要在声明后使用,否则报错
5.暂时性死区;只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响
6.不允许重复声明let不允许在相同作用域内,重复声明同一个变量
7.含有块及作用域 允许块级作用域的任意嵌套
8.允许在块级作用域之中声明函数。
9.do表达式加上do就能得到块及作用域的返回值
10.有六种声明方法:var let const import function class
11.es6中顶层对象不是window是global
二、解构赋值
let[a,b,c]=[1,2,3]
Let[foo,[[baz],faa]]=[1,[[2],3]]
Let[a,y,...z]=[‘a’];//a=’a];y=undefinded;z=[];
如果等号的右边不是数组将会报错
Let[x,y,z]=new Set([‘a’,’b’,’c’])
只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值
解构赋值允许指定默认值 let[a=true,a]=[‘a’,’b’];
let[a=true,b]=[undefined,’b’];//a=true,b=’b’
let[a=true,b]=[null,’b’];//a=null,b=’b’
Let[x=y,y=1]=[1,2]//报错
Let[x=1,y=x]=[2];//x=2,y=2;
Let{foo,bar}={foo:’a’,bar:’b’}//
Let{baz}={foo:’a’,bar:’b’}//undefined
Let{foo:baz}={foo:’a’,baz:’b’}//’b’
三、字符串的扩展
1.字符串的遍历接口 for...of
2.at(index)
3.Includes(string)
4.startsWidth(string)//以什么开头
5.endsWidth(string)//以什么结尾
6.repeat(number)//重复n遍
7.padStart(number,string)//头部补全
8.padEnd(number,string)//尾部补全
四、数值的扩展
0b二进制表示
0o八进制表示
Number.isFinite()//检查一个数是否有限
Number.isNaN()//检查一个数是否为NaN
Number.parseInt()
Number.parseFloat()
Number.isInteger()
Number.EPSILON
Number.isSafeInteger()则是用来判断一个整数是否落在这个范围之内范围在-2^53到2^53之间
Math.trunc方法用于去除一个数的小数部分,返回整数部分
Math.sign()Math.sign方法用来判断一个数到底是正数、负数、还是零。对于非数值,
五、函数的扩展
1.能直接为函数的参数指定默认值
2.rest 参数(形式为...变量名)
3.name属性返回函数名字
4.箭头函数
5.函数绑定运算符是并排的两个冒号(::),双冒号左边是一个对象,右边是一个函数
foo::bar(...arguments);
// 等同于bar.apply(foo, arguments);
六数组扩展
1 .扩展运算符
array.push(...items)和add(...numbers)
// ES6的写法function f(x, y, z) {
// ...}
let args = [0, 1, 2];
f(...args);
Array.from();
Array,of()
数组复制
const a1 = [1, 2];
const a2 = a1;
a2[0] = 2;
a1 // [2, 2]
const a1 = [1, 2];
const a2 = a1.concat();
a2[0] = 2;
a1 // [1, 2]
合并数组
// ES5[1, 2].concat(more)
// ES6[1, 2, ...more]
Array.from()Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象
Array.of(a,b,c)Array.of方法用于将一组值,转换为数组。
copyWithin()
[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]
上面代码表示将从 3 号位直到数组结束的成员(4 和 5),复制到从 0 号位开始的位置,结果覆盖了原来的 1 和 2。
find(function(){})数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员
findIndex()数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置
fill方法使用给定值,填充一个数组。
数组实例的 entries(),keys() 和 values()
keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。
Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似
数组的空位指,数组的某一个位置没有任何值。比如,Array构造函数返回的数组都是空位。
七对象的扩展
Object.is()它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。
Object.is('foo', 'foo')
同之处只有两个:一是+0不等于-0,二是NaN等于自身。
Object.assign()对象的合并
Object.assign(target, source1, source2);
如果undefined和null不在首参数,就不会报错。
Object.assign方法实行的是浅拷贝,而不是深拷贝。
对于这种嵌套的对象,一旦遇到同名属性,Object.assign的处理方法是替换,而不是添加。
Object.assign([1, 2, 3], [4, 5])
// [4, 5, 3]
对象的遍历
for...in
for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)
Object.getPrototypeOf该方法与Object.setPrototypeOf方法配套,用于读取一个对象的原型对象。
箭头函数
箭头函数的语法非常简单,看一下最简单的箭头函数表示法
() => console.log('Hello')
之前没有接触过箭头函数的人可能会惊讶于其代码的简洁。对比之前如果要写一个这样的函数
function(){
console.log('hello')
}
和普通函数的区别:
从上面的例子中,我们已经可以看出箭头函数的优势。和普通函数相比,
箭头函数主要就是以下两个方面的特点
1.不绑定this,arguments 2.更简化的代码语法
什么时候不能用箭头函数
1.作为对象的方法
最好不要在对象的方法中使用箭头函数,这样可能会导致一些问题的产生。
除非你很熟悉箭头函数。
2.不能作为构造函数
由于箭头函数的this不绑定的特点,所以不能使用箭头函数作为构造函数,
实际上如果这样做了,也会报错。
3.定义原型方法
super 和 extends 使用新的super和extends关键字扩展类:
1.super 必须在 this 之前被调用
在子类构造函数中,在使用 this 之前,必须先调用超级类。
class Apple {}
class GrannySmith extends Apple {
constructor(tartnessLevel, energy) {
this.tartnessLevel = tartnessLevel; // 在 'super' 之前会抛出一个错误!
super(energy);
}
}
Promises in ES6
下面是一个简单的用setTimeout()实现的异步延迟加载函数:
setTimeout(function() {
console.log('Yay!');
}, 1000);
var wait1000 = new Promise(function(resolve, reject) {
setTimeout(resolve, 1000);
}).then(function() {
console.log('Yay!');
});