关于ES6的一些小知识

let和const

1.var声明的变量挂载在window上,而let和const声明的变量不会;

   var a = 4;
    console.log(a) //4
    console.log(window.a); //4
    const a = 4;
    console.log(a) //4
    console.log(window.a); //undefined
    let a = 4;
    console.log(a) //4
    console.log(window.a); //ubdefined

2 .var声明的变量存在变量提升;let和const不存在变量提升;

  console.log(a);//undefined a已经声明,但还没有赋值,默认得到undefined
    var a = 10;
    console.log(b);//报错,b is not defined 找不到
     let b = 4;
     console.log(c);//报错,c is not defined 找不到
     const c = 100;

3.let 和const 声明形成块级作用域

    function fn() {
         var a = 100;
         console.log(a); //100
    }
    fn()

4。在同一作用域下;let和const不能声明同名变量,而var 可以;

    var a = 10;
    var a = 20;
    console.log(a);//20

    let b = 10;
    let b = 20;
    console.log(b);//报错 标识符b已经被声明;

5.暂时死区
let和const命令声明的变量无变量提升;且都会被所在声明的代码块中;在let和const
// 命令执行前,使用该变量都会报错,这一部分被称为暂时性死区;

        var a = 123;
        if(true) {
            a = 'abc';
            let a;
        }

6.const
一旦声明必须赋值,不能使用null占位;
声明后不能再修改
如果声明的是复合数据类性,可以修改其属性

  const a =100; //声明必须赋值
  const list = [];
  list[0] = 10;
  console.log(list); //10

  const obj = {a:100};
  obj.name = 'apple';
  obj.a = 10000;   //复合数据类型,属性被修改
  console.log(obj); {a:10000,name:apple};

7,在let声明之前,typeof运算符是百分百安全的,不会抛出错误;

console.log(typeof a) ; //undefined

在以前没有let和const命令的时候,typeof是一个安全的运算符,
即使变量没有被声明,也会正常返回undefined,但如果typeof处在死区中, 处理了在后文被let和const的变量,将会报错。

 var a = 123;
    typeof undeclared_variable;
    if(true) {
        // 暂时性死区
        typeof a;
        let a
        console.log(a)
     }

Proxy

在vue3.0中将会通过Proxy来替换原来的 Object.defineProperty 来实现数据库响应式,
Proxy是ES6中新增的功能, 用于修改某些操作做的默认行为;等同于在语言层面作出修改;所以属于一种“元编程”;即:对语言编程进行编程; Proxy可以理解为: 在目标对象之前架设一层‘拦截’;外界对该对象的访问,都必须先通过这层拦截; 因此提供了一层机制,可以对外界的访问进行过滤和改写, Proxy意思为代理;代理某些操作,或者也可以叫为"代理器";

1.arget代表要添加代理的对象;
2handel 用来自定义对象中的操作;比如可以用来自定义set或者get函数;
3.obj:是被代理完成之后返回的对象;

当外界每次对obj进行操作时,就会执行handel对象上的一些方法

 let p = new Proxy(target,handel,obj);

Proxy有以下几种方法:

1.get(target, propKey, receiver
get()方法: 用于拦截某个属性的读取操作;可以接受三个参数,1:目标对象;2属性名,实例本身(操作行为所针对的对象)3:可选;

  var person = {
        name: '张大帅'
     };
     var proxy = new Proxy(person, {
         get: function (target, property) {
             if (property in target) {
                return target[property];
           }else {
                 throw new ReferenceError('抛出错误')
             }
         }
     })
    console.log(proxy.name);
    //如果没有get方法拦截,则返回undefined;有则抛出错误;
    console.log(proxy.age)

2. set(target, propKey, value, receiver)
set()方法: 用来拦截某个属性的赋值操作,可以接收4个参数; 1;目标对象,2属性名,属性值,Proxy实例本身;4:可选;

 const obj = {
        'name': 'null'
    };

    // <!-- 设置该对象的属性不可写 -->
    Object.defineProperty(obj, 'name', {
        writable: false
    });

    const handler = {
        set: function (obj, prop, value, receiver) {
            Reflect.set(obj, prop, value);
        }
    };

    const proxy = new Proxy(obj, handler);
    proxy.name = '我是空智';
    console.log(proxy.name); // 打印的是 null

3. has(target, propKey)
has()方法:该方法是判断某个目标对象是否有该属性的姓名;接受两个参数;1.目标对象,2属性名,;返回的是一个布尔值;
4. construct(target, args)
construct()方法:用来拦截new命令的;接受三个参数:1目标对象,2构造函数的参数对象及创造实例的对象;3可选,用来拦截对象属性;

5.apply(target, object, args)
apply()该方法用来拦截函数的调用,接受三个参数:1目标对象,2目标上下文this对象;3目标对象的数组

下面是 Proxy 支持的拦截操作一览,一共 13 种。

get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy['foo']。 set(target, propKey,lue, receiver):拦截对象属性的设置,比如proxy.foo = v或proxy['foo'] = v,返回一个布尔值。
has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值;deleteProperty(target, propKey):拦截delete proxy[propKey]的操作,返回一个布尔值。
ownKeys(target):拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、for...in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。
getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。 defineProperty(target,propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc)、Object.defineProperties(proxy, propDescs),返回一个布尔值。
preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值。
getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象。isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值。 setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。
apply(target, object, args):拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)、proxy.call(object,...args)、proxy.apply(...)。
construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)。

Proxy有许多用途,包括运算符重载,对象模拟,简洁而灵活的API创建,对象变化事件,甚至Vue 3背后的内部响应系统提供动力。

数据响应式
Proxy可以完美的监听到任何方式的数据改变;唯一缺陷可能就是浏览器的兼容性不好了

    let str = (obj,setBind,getLogger) => {
        let handel ={
            get(target,perty,receiver) {
                getLogger(target,perty);
                return Reflect.get(target,perty,receiver)
            },
            set(target,perty,value,receiver) {
                setBind(value,perty)
                return Reflect.set(target,perty,value);
            }
        }
        return new Proxy(obj,handel)
    }
    let obj = {age:21};
    let q = str(
        obj,
        (v,perty) => {
            console.log(`监听到属性${perty}改变为${v}`)
        },
        (target,perty) => {
            console.log(`'${perty}' = ${target[perty]}`)
        }
    )
    q.a = 2;
    console.log(q.a)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容