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

补充

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容

  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 2,712评论 0 5
  • 本文为阮一峰大神的《ECMAScript 6 入门》的个人版提纯! babel babel负责将JS高级语法转义,...
    Devildi已被占用阅读 1,987评论 0 4
  • 异步编程对JavaScript语言太重要。Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本...
    呼呼哥阅读 7,312评论 5 22
  • 12月坚持积分申请 昵称:小螃谢 打卡天数:17天 时间:1201、1202、1203、1205 、1206、12...
    小螃谢阅读 196评论 1 1
  • 有人说过,大多数人的一生都是平凡的一生,这句比较悲观的话语,其实只是在陈述一个基本事实。如果一个人在年轻的时候没有...
    过河鸫阅读 814评论 0 3