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?
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)
}