1、Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。这意味着,你可以用ES6的方式编写程序,又不用担心现有环境是否支持;
2、块级作用域
3、增加声明变量方法:let、const、import、class,(es5是function、var)
4、变量解构赋值:
数组 --------》字符串 / 数字
对象 --------》字符串
数值、布尔先转成对象 let {toString: s} = 123
函数参数 --------》函数入参
用处:交换变量、函数多返回、提取json、遍历map
5、字符串扩展:repeat()、includes()、startWith()、endWith()等
6、正则扩展
7、数值扩展:
新增Number.isFinite()、Number.isNaN()、parseInt()
8、数组扩展:
copyWith(target, start, end)、includes()
9、函数扩展:
可以指定入参默认值、rest参数、箭头函数(this、不用为构造函数不new、rest参数代替arguments、不能用yield)
9.1、尾递归:
function factorial(n, total) {
if (n === 1) return total;
return factorial(n - 1, n * total);
}
factorial(5, 1)
斐波那契数列尾递归算法
function Fibonacci2 (n , ac1 = 1 , ac2 = 1) {
if( n <= 1 ) {return ac2};
return Fibonacci2 (n - 1, ac2, ac1 + ac2);
}
缺点:调用栈太多
改进:“循环”换掉“递归”,蹦床函数
function trampoline(f) {
while (f && f instanceof Function) {
f = f();
}
return f;
}
function sum(x, y) {
if (y > 0) {
return sum.bind(null, x + 1, y - 1);
} else {
return x;
}
}
trampoline(sum(1, 100000))
还可以用状态变量,保证调用栈只有一层
function tco(f) {
var value;
var active = false;
var accumulated = [];
return function accumulator() {
accumulated.push(arguments);
if (!active) {
active = true;
while (accumulated.length) {
value = f.apply(this, accumulated.shift());
}
active = false;
return value;
}
};
}
var sum = tco(function(x, y) {
if (y > 0) {
return sum(x + 1, y - 1)
}
else {
return x
}
});
sum(1, 100000)
// 100001
10、对象扩展:
同值相等:Object.is()
对象合并:Object.assign()(浅拷贝)
属性可枚举:属性遍历的5种方法
proto属性
11、第七种数据类型:Symbol
Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)
12、Iterator和for... of循环