前三单元

1、块作用域

凡是左右花括弧包含的区域都是一个独立的作用域。该作用域里的变量只在该作用域内有效。

2、词法作用域

一个变量到底代表什么意思,要根据上下文来推断

块作用是不存在变量提升着一说的

// let username = 'zs';
// var age = 18;
//块作用域和词法作用域的区别
var flag = false
if(true){
    console.log(username)
    let username = 'zs'
}
//console.log(username)

3、字符串扩展

(1)编码扩展
es5只能识别\u之后四位16进制数值,多余四位则识别为两个以上字符
es6通过\u{}可识别4位以上16进制数值的字符

//1 0000000 1  ascii   gbk   unicode  utf-8

(2)startsWith endWith两个api可以判断字符串是否以某个字符开头或结尾

4、数组扩展

var str = new Array(5).fill(0).map(()=>{return 'li'}).join('')
var obj = {
      username:'zs',
      count:{
            math:90,
            his:80
      }
}
//'username'   'count.math'
function returnAttr(obj,express){
    //以.为分隔符得到一个属性层级数组
    let expressArr = express.split('.')
    return expressArr.reduce((obj,currentAtr)=>{
        return obj[currentAtr]
    },obj)
}
console.log(returnAttr(obj,'count.tongji.current'))

5、Symbol

es5 ---->有几种数据类型?
基5
引1

es6 --->有几种数据类型
整数类型
Symbol:全应用唯一的值
Symbol和Symbol.for获取Symbol值得区别

let one = Symbol.for('aaa')
let two = Symbol.for('aaa')
one === two

6、Set

let first = new Set()
first.add(1)
first.add(2)
first.add(1)

//first.delete(2)
//first.clear()
//console.log(first.has(2))
for(let value of first){
    console.log(value)
}
//console.log(first.keys())

7、Map

//Map 图
let first  = new Map([['name','zs'],['age',18]])
//console.log(first)

first.set('count',90)
first.set('count',85)
first.delete('count')
// console.log(first.get('name'))
// console.log(first.has('name'))

// console.log(first)
for(let value of first){
    console.log(value)
}

8、defineProperty

用法

Object.defineProperty(obj,key,{
  ....
})
名字 作用
enumerable boolean 设置该属性是否可被遍历
value any 该属性被访问时的返回值
writeable boolean 该属性值是否可以被改写
configurable boolean 该属性是否可以被重复定义
let obj = {
    username:'zs',
    age:18
}
//数据劫持configurable

Object.defineProperty(obj,'username',{
    enumerable:false,
    configurable:false
})
Object.defineProperty(obj,'username',{
    enumerable:true
})
for(let key in obj){
    console.log(key)
}

属性代理


let obj = {
    username:'zs',
    age:18
}
//数据劫持configurable   属性代理
let str = '666'
Object.defineProperty(obj,'username',{
    get(){
        return str
    },
    set(newValue){
        console.log('设置值被触发了')
        str ='bw'+newValue
    }
})
obj.username = '8888'
console.log(obj.username)

不成功的属性代理

let obj = {
    username:'zs',
    age:18,
    count:{
        math:90
    }
}
//封装一个函数 将obj对象的所有属性均进行属性代理
function myProxy(obj){
    let keyArr = Object.keys(obj)
    for(let i = 0;i < keyArr.length;i++){
        let tmp;
        Object.defineProperty(obj,keyArr[i],{
            get(){
                return tmp;
            },
            set(newValue){
                tmp = newValue
            }
        })
    }
}
myProxy(obj)
obj.age = 19
console.log(obj)

将一个不定层级的嵌套对象进行属性代理

let obj = {
    username:'zs',
    age:18,
    count:{
        math:90
    }
}
//封装一个函数 将obj对象的所有属性均进行属性代理
function myProxy(obj){
    let keyArr = Object.keys(obj)
    for(let i = 0;i < keyArr.length;i++){
        proxyAttr(obj,keyArr[i],obj[keyArr[i]])
    }
}
function proxyAttr(obj,key,value){
    if(typeof value === 'object'){
        myProxy(value)
    }
    Object.defineProperty(obj,key,{
            get(){
                return value;
            },
            set(newValue){
                if(value === newValue){
                    return
                }
                value = newValue
            }
    })
}
myProxy(obj)
obj.age = 19
console.log(obj)

proxy进行对象代理

let obj = {
    username:'zs',
    age:18,
    count:{
        math:90
    }
}
let newObj = new Proxy(obj,{
    get(target,key){
        console.log('你在获取值'+key)
        return target[key]
    },
    set(target,key,value){
        target[key] = value
    }
})
newObj.username = 'lisi'
console.log(newObj.count.math)

原型链

访问对象的某个属性,如果不存在,就逐层向上它的原型中查找,直到Object,次过程形成的链条就叫原型链。

将Object上的一些功能函数放到了Reflect对象上

Promise
逐行执行---->阻塞---->异步---->回调地域--->Promise
可以将回调地狱改善为then的链式调用

 function ajax(fn){
        setTimeout(()=>{
            fn(4576)
        },2000)
    }
    // ajax((data)=>{
    //     ajax((res)=>{
    //         console.log(res)
    //     })
    // })
    //fullfield 成功  pedding 等待  reject 错误
    let first = new Promise((resolve,reject)=>{
        ajax((data)=>{
            resolve(data)
        })
    })
    first
    .then((res)=>{
        console.log(res)
        return res+1
    })
    .then((ress)=>{
        console.log(ress)
        ajax((data)=>{
            console.log(data)
        })
    })

直接将ajax函数封装为promise

function ajax(options){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                try{
                    resolve(100)
                }catch(err){
                    reject(404)
                }
            },2000)
        })
        
    }
    ajax({
        url:'',
        methods:'GET'
    })
    .then((res)=>{
        console.log(res)
        return ajax({
            url:'',
            methods:'GET',
            params:{
                id:res
            }
        })
    })
    .then((pro)=>{
        console.log(pro)
    })

promise封装,一层then调用

const FULLFIELD = 'fulfield'
   const PENDDING = 'pendding'
   const REJECT = 'reject'
   class MyPromise{
       constructor(excute){
            this.value = undefined;
            this.fail = undefined;
            this.state = PENDDING;
            this.successContainer = [];
            this.failContainer = [];
            excute(this.resolve.bind(this),this.reject.bind(this))
       }
       resolve(data){
           if(this.state===PENDDING){
            this.state = FULLFIELD
            this.successContainer.forEach((itemFn)=>{
                this.value = data
                itemFn(data)
            })
           }
       }
        reject(err){
            if(this.state===PENDDING){
                this.state = REJECT;
                this.failContainer.forEach((itemFn)=>{
                    this.value = err
                    itemFn(err)
                })
            }  
        }
        then(success,fail){
            if(this.state===FULLFIELD){
                success(this.value)
            }else if(this.state === REJECT){
                typeof fail === 'function' && fail(this.fail)
            }else{
                this.successContainer.push(success)
                typeof fail === 'function' && this.failContainer.push(fail)
            }
        }
   }
   let first = new MyPromise((resolve,reject)=>{
       setTimeout(()=>{
        resolve(100)
       },2000)
   })
   first
   .then((res)=>{
       console.log(res)
   })

generator函数的声明和使用

//generator
        function *test(){
            console.log('666')
            yield 1+100
            yield 2
            return 100
        }
        //generator函数调用拿到的是一个执行器
        let first = test()
        console.log(first.next())
        console.log(first.next())
        console.log(first.next())
        console.log(first.next())

generator函数解决异步流程控制

let first;
        function add(){
            console.log('generator函数开启执行')
                setTimeout(()=>{
                    first.next(300)
                },2000)
        }
        function login(verify){
                setTimeout(()=>{
                    first.next('true'+verify)
                },2000)
        }
        //generator
        function *test(){
            let a = yield add()//验证码请求
            console.log(a,'---')
            let status =  yield login(a)//登录请求
            console.log(status)
            return 100
        }
        //generator函数调用拿到的是一个执行器
        first = test()
        first.next()

Promise.resolve,Promise.reject

        Promise.resolve(new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve(100)
            },1000)
        })).then((res)=>{
            console.log(res)
        })
        Promise.resolve(6).then((res)=>{
            console.log(res)
        })
        Promise.reject(6).then(()=>{},(err)=>{
            console.log(err)
        })

Promise.all

        function fetch1(){
            return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                    reject(6)
                },2000)
                
            })
        }
        function fetch2(){
            return new Promise((resolve,reject)=>{
                resolve(7)
            })
        }
        Promise.all([fetch1(),fetch2()]).then((res)=>{
            console.log(res)
        },(err)=>{
            console.log('异常'+err)
        })

Promise.race


        function fetch1(){
            return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                    resolve(6)
                },2000)
                
            })
        }
        function fetch2(){
            return new Promise((resolve,reject)=>{
                resolve(7)
            })
        }
        Promise.race([fetch1(),fetch2()]).then((res)=>{
            console.log(res)
        },(err)=>{
            console.log('异常'+err)
        })

async await

        function testFn(num){
            return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                    resolve(num)
                },2000)
            })
        }
        async function test(){
            let result = await testFn(100);
            
            let res = await testFn(result+1);
            console.log(res)
            return 666
        }
        test()

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

推荐阅读更多精彩内容

  • ECMAScript - 学习笔记 🎬 🧩nvm node.js 包管理工具 nvm github[https:/...
    Super三脚猫阅读 626评论 0 1
  • ES6 新特性 ES6 新特性 一ES6简介 二块级作用域绑定1 let声明2 const声明Constant D...
    _无为_阅读 845评论 0 3
  • 实习的时候写的学习笔记 如有错误请各位大佬直接留言批判,防止错误的信息会误导他人! ---------------...
    ci鱼丸粗面阅读 520评论 0 0
  • 一、ES6简介 ​ 历时将近6年的时间来制定的新 ECMAScript 标准 ECMAScript 6(亦称 ...
    一岁一枯荣_阅读 6,078评论 8 25
  • 三,字符串扩展 3.1 Unicode表示法 ES6 做出了改进,只要将码点放入大括号,就能正确解读该字符。有了这...
    eastbaby阅读 1,536评论 0 8