ES6补充以及Node事件轮询

Symbol

es6中新增了symbol类型,symbol类型的值是通过symbol函数生成的,相同symbol函数返回的值是唯一的
Symbol函数可以接受字符串作为参数(可以不传参),但即使相同参数返回的也是唯一值,即Symbol('qiang')!=Symbol('qiang')

//基于symbol创建对象的私有属性
let Person=(function(){
    let _age=Symbol('age');
    function P(name,age){
        this.name=name;
        this._age=age;
    }
    P.prototype.getAge=function(){
        return this._age;
    }
    return P;
})()
let p=new Person("qiang",20)
console.log(p)
console.log(p.getAge())

解构赋值

let [a, b, c] = [1, 2, 3]
let [d, , e] = [4, 5, 6]
console.log(a, b, c,d,e)
let {top,left}={left:100,top:200}
//别名,多用于解决变量名已经被定义,此时如果left上面已经定义,let不能重复定义,则L是变量,left不是,则可以正常使用
let {top:T,left:L}={left:100,top:200}
console.log(T,L)
//多重解构
let {foo:[a,b]}={foo:[100,200]}
console.log(a,b)

扩展运算符

let arr=[1,2,3]
console.log(...arr)
console.log(Math.max(...arr))
let arr1=[4,5,6]
//数组合并
console.log([...arr,...arr1,..."abc"])//[ 1, 2, 3, 4, 5, 6,'a', 'b', 'c'  ]
//对象合并,并且如果相同key会覆盖,后覆盖前
console.log({...{top:200},...{name:'hehe'}})//{ top: 200, name: 'hehe' }

unicode表示法

//\u开头的书写方式,es5之前就支持,但是对位数支持力度不够
//所以es6出现{}表示整体解析,不会出现位数不足以表示复杂汉字甚至表情包的情况
console.log('\u{0061}')//a

进制表示


  1. 二进制: 0b
  2. 八进制:0o(es6之前,0开头表示八进制)
  3. 十六进制: 0x

属性名表达式

let x='qiang'
let obj={
    x:1
}
//此时x会被当做字符串
console.log(obj) //{ x: 1 } 

let x1='qiang'
let obj1={
    [x]:1
}
//x会被当做变量
console.log(obj1) //{ qiang: 1 }

不可变对象

const arr=[1,2,3]
虽然不能重新赋值,但是push等还是可以
此时可以使用:冻结属性
const arr1=Object.freeze([1,2,3])
console.log(Object.isFrozen(arr1))//判断是否冻结

this指向


1.普通函数内部this对象指向创建期间上下文对象(即定义时候没有指明this,执行才临时定义)
2.箭头函数this在函数创建期间就绑定好了,指向创建该箭头函数所在的作用域对象(也就是this)
3.箭头函数没有arguments属性


function fn(){console.log(this)}
上面this指向就是window
let obj={}
obj.fn=fn
这个this指向obj
document.onclick=fn
this指向是触发该事件的对象document

定义属性

let obj={x:1}
//此种添加属性,可删除,遍历,修改
obj.y=20
// obj.prototype.y=20 等效于上面
//此处添加属性,可查看,但是不能遍历,删除,修改
Object.defineProperty(obj,'z',{
    value:200,
    //但是可以通过以下控制
    // writable:true,
    // configurable:true,
    // enumerable:true
})
console.log(obj.z)//200
obj.z=100
console.log(obj.z)//200

内置对象的扩展

Object.is()

//理论上,NaN之间是肯定不相等的,但是此时的is方法比较的是两者像不像
console.log(Object.is(NaN,NaN))//true
console.log(Object.is(+0,-0))//false

//合并对象
let obj1={a:1}
let obj2={a:2,b:2}
let obj3={c:'abc'}
Object.assign(obj1,obj2,obj3)
console.log(obj1)//{ a: 2, b: 2, c: 'abc' }

Promise相关

Promise.all的含义:一组promise都执行成功(resolve)则最终以数组形式返回结果
否则就返回第一个错误的原因

let arr = [1, 2, 3]
function fun(num) {
    let p = new Promise((resolve, reject) => {
        if(arr.indexOf(num)==-1){
            reject("value not defined")
        }else{
            resolve(num)
        }
    })
    return p;
}
Promise.all([fun(1),fun(2),fun(3)])
.then((nums)=>{
    console.log(nums)//[ 1, 2, 3 ]
}).catch((err)=>{
    console.log(err)
})

Promise.all([fun(1),fun(2),fun(3)])
.then((nums)=>{
    console.log(nums)
}).catch((err)=>{
    console.log(err)//value not defined
})

事件轮询

Timer

处理所有setTimeout和setInterval的回调

IO异步


1.Pending I/O Callback:执行I/O回调,文件操作,网络操作

2.Idle,Prepare:内部使用

3.POLL: 轮询I/O操作,是否有I/O callback,如果没有则会阻塞(有超时和基本检测)一段时间
(如果3检测到有1的回调,则又进入1)


Check


Check:只处理setImmediate的回调函数

CloseCallback:专门处理一些close类型的函数,比如关闭网络


任务说明

进入宏任务,宏任务执行完毕则进入判断是否有微任务,
没有的话,开始新的宏任务,否则执行所有微任务,之后开始新的宏任务,如此循环往复

宏任务

主体script,setTimeout(虽然执行,但是其回调内部的方法体其实是进入了事件循环,真实是在宏任务和微任务都完成之后),setInterval(同前面),Promise的回调(resolve,reject)是同步的会立刻执行

微任务

Promise的then和catch方法, process.nextTick

补充

代码执行:区分同步还是异步,同步执行区分宏任务还是微任务,全部完毕之后,才开始执行异步(事件轮询内部)代码,而且即使是异步的代码,最终也是主线程从事件队列取出然后执行

你可能感兴趣的:(ES6补充以及Node事件轮询)