ES6详解---笔记1

116 阅读3分钟

1EEE6599-D4D1-4128-96EF-AD52D4DF18B1-20917-000006ADDD1447DE.JPG

1.const 标识常量

基础用法

  • 不允许重复生命变量
var name = 'YDS';
[ES5]写法:
//常量法
Object.defineProperty(window,'name',{
    value:'YDS',
    writable:false
})

//闭包法
function createConst(value) { 
    return function() { 
        return value; 
    }; 
} 
var name = createConst(YDS);


[ES6]写法:
//与值的类型及取值方式相关
//这个值不会再变换
const name = 'YDS'; 

//obj按obj地址取值,内部值可以变换;看存在栈还是堆。
const obj = {}

  • 块级作用域
    • 死区dead zone => 先声明赋值,再使用。
    在没声明之前的区域,const变量暂时存在死区中。
何时使用const?

1.能用const都用const;

2.能用const的可变对象不用let,可以保证对象本身不会轻易改变,可以理解为仓库复用;

如何对一个对象常量化?

1.Object.freeze(obj) 只能冻结对象的第一层属性,如果要递归逐层冻结,可以自己判断属性类型写函数递归;

2.解构

按照位置结构进行赋值,类似python的变量赋值处理~

let a = 1;
let b = 2;
[a, b] = [b, a];

3.箭头函数

  • 方便链式调用,方便函数式编程。
const test = (a, b) => a + b;
  • 没有独立上下文,this指向在生成时就确定了,详情在this笔记中体现。
箭头函数常见易错点!
1.dom操作回调函数的时候,this指向不符预期
    const btn = document.querySelect('#btn');
    btn.addEventListener('click',function(){
        //这里的this,如果用箭头函数回调this指向与预期不符;
        this.style.color = '#FFF';
    })
    
2.类操作的时候不能用箭头函数,箭头函数不能构造类
    function Obj(a, b) {
        this.a = a;
        this.b = b;
    }
    //以上类的构造函数不能改写为箭头函数
    
3.箭头函数参数特性,没有arguments

4.class类

ES5中用函数对象模拟对象类

  • 构造函数
    //构造函数
     function timeTable(time, todo){
         //以下两个属性是构造属性,每个实例对象都有自己的一套复制属性;
         this.time = time;
         this.todo = todo;
     }
    
    //公用属性区间放在prototype中,这个属性是共有的,一变俱变;
     timeTable.prototype.getTodoTime = functon() {
         return `this todo is on ${this.time}`;
     }
    
    //实例
     const todo1 = new timeTable('9:00', 'do homework');
     const todo2 = new timeTable('10:00', 'do homework2');
     

ES6中class类

  • 构造类对象-基于函数对象之上的语法糖
    class timeTable {
        // 构造函数
        constructor(time, todo){
            this.time = time;
            this.todo = todo;
        }
        
        // 1.方法挂载在实例上,每个实例都有的方法
        getTodoTime(){
            return '';
        }
        
        // 2.将方法挂载在类上,公用方法类似公用属性
        static getTimeTodo(){
        
        }
    }
    
    //实例
    const timeTable1 = new timeTable();
    timeTable1.getTodoTime();
    timeTable.getTimeTodo();
class的类型是什么?

class是基于函数对象之上的语法糖,所以他的类型首先是Function=>Object=>null; timeTable.prototype = Funtion.proto;

class函数对象的属性?

timeTable.hasOwnProperty('time');

5.尾调用优化

结合上下文调用栈,斐波那契数列尾递归多栈时有溢出风险,对尾调用进行优化处理!

  • 初版斐波那契数列调用
    function fib(n) {
        if(n < 2) {
            return n;
        }
        return fib(n-1) + fib(n-2);
    }

不要在返回值处进行类似相加的运算就不会过度压栈!,自递归已经做了优化!

  • 只修改自递归函数中的传入参数
    function fib(n) {
        return fibImpl(0, 1, n);
    }
    
    function fibImpl(a, b, n) {
        if(n === 0) {
            return a
        }
        return fibImpl(b, a+b, n-1)
    }