课堂
(二)
var function变量提升
let 没有变量提升
let会锁死{}
// let a = 2;
// {
// console.log(a); // 暂存死区 被这里面的let锁死 不会向上找,除非把这里的去掉
// let a = 1;
// }
const 不能改变赋值的空间
const a = [];
a.push(1);是可以的
扩展运算符...也可以拓展对象的,不论对象有多少层。只有第一层的展开是深拷贝。
深拷贝指和对象引用的内存地址无关,浅拷贝指拷贝来的对象,所引的内存地址没变。
用JSON.parse(JSON.stringify的可以深拷贝,但是value值是函数 ,正则, new date时有点问题
let school = {
name: 'zfpx', a: null, d: new Date(), reg: /[0-4]/, fn: function () {
}
};
let obj = {...school}
let objj=JSON.parse(JSON.stringify(school))
console.log(objj)
手写深拷贝
let school = { name: 'zfpx', age: 1, a: null, d: new Date(), reg: /reg/, fn: function () { } }; function deepClone(obj){ if (obj == null) return obj; // null == undefined if(obj instanceof Date) return new Date(obj); if(obj instanceof RegExp) return new RegExp(obj); if (typeof obj !='object') return obj; let newObj = new obj.constructor; for (let key in obj){ newObj[key] = deepClone(obj[key]); } return newObj } let d = deepClone(school); // null undefined console.log( d);
解构赋值
箭头函数:
如果返回的是一个对象 那需要用()包起来
let a = x => y => ({ sum: x + y });
// 箭头函数中没有arguments关键字
对象里的函数写法fn(){} 和fn:function(){}等同,
let a = 'zfpx' let obj = { a:'jw', fn:() => { setTimeout(() => { console.log(this.a); }, 0); } } obj.fn();
箭头函数this 向上级作用域查找 对象的{}不是作用域 所以 this指的是window对象 window上没a let声明的a不污染全局window
对象的get set
let o = { // 属性访问器 setter 和getter temp:'', get name(){ return this.temp; }, set name(val){ this.temp = val; } } o.name = 'hello' console.log(o.name);
(三)
es5的类是构造函数
function Animal(name){
this.name = name;
}
里面是实例的属性,私有属性。
Animal.prototype.info = { time: '100' }
原型的属性,是公有属性,实例都有该属性。
Animal.a='aa'
类上的属性 (静态属性)
// let animal1 = new Animal('哺乳类');
// console.log(animal1.__proto__ == Animal.prototype);
// console.log(animal1.__proto__.constructor === Animal);
// console.log(Animal.prototype.__proto__ == Object.prototype);
所有实例都有__proto__属性 ,Animal.prototype也有,Animal.prototype还有constructor是构造函数,也就是类
es6的类
class Animal{ // es6只支持静态的方法 并不支持静态属性 Animal.a = 1; es7支持
static a(){
return 1;
}
constructor(v){
this.name=v
}
eat(){ // 原型上的方法
console.log('吃饭')
}
}
继承:
class Cat extends Animal{
// constructor(name){
// //super(name); // Animal.call(this)
// }
}
let cat = new Cat('小猫');
console.log(cat.name)
(四)
for in for of foreach不能跳出循环
阻塞同步 非阻塞异步
浏览器代码执行:竖着栈,横callback 执行
node事件环
模块化:commonjs:require module.exports;es6 import export。
require的内部实现
进程:最基本的内存占用,js的进程有个一个主线程
bluedbird
(周六12.8号)
for循环是同步
utils的promisify是将异步函数封装成promise
try catch
while
if