前端巅峰每日一题:本系列小伙伴都可以参与做题,可以在评论区把你的答案秀出来,javaScript是一门相当动态的语言,每个人都有自己的风格和见解,欢迎大家提供日常问题,在下面提供不同的答案~我每天都会请一些人来回答问题,只要你回答问题,你就可以可以在评论区打广告,不定期给大家发奖品(还有小姐姐)第一季:ES6基础系列:思考题:let,const,object.freeze()的区别从最简单的const开始:像上面这样写会报错:Assignmenttoconstantvariable。赋值给了一个常量,但是当我们:发现代码运行正常,没有报错,那我再试一次。看看阮一峰老师对ES6的介绍:const:let:const其实保证的不是变量的值不能改变,而是变量指向的内存地址中存储的数据不能改变。对于简单类型的数据(数字、字符串、布尔值),值存储在变量指向的内存地址,因此相当于一个常量。但是对于复合类型的数据(主要是对象和数组),变量指向的内存地址只是一个指向实际数据的指针,const只能保证指针是固定的(即总是指向另一个固定的address),至于它指向的数据结构是不是可变的,就完全没法控制了。总结一下:const并不能真正保证ES5的'不变'浅冻结,一般情况下使用API??Object.freeze(),代码如下:最终输出:{a:"a",b:{...}}a的值已经改变了,但是注释代码Object.freeze(obj)的最终输出是:{a:1,b:{...}}此时a的值并没有改变,因为它is"frozen"除了上面提到的浅层冻结,我们看看修改b的值有没有效果:最终输出如下:{a:1,b:{...}}a:1b:{c:2}证明b也被冻结了再次尝试修改C的值:Output:{a:1,b:{...}}a:1b:{c:2}好像是Object.freeze()不能完全冻结,但是万能的程序员大哥是Impossibletoyield,简单粗暴的递归,深度冻结:这时候我们修改了c:的值,发现输出:{a:1,b:{…}}a:1b:{c:2}看来这次是真的冻结了,但是deepfreeze必须根据数据的类型进行冻结,否则无法实现真正??意义上的完全冻结。Vue1.0.18+提供了对Object.freeze()的支持。对于freezeindata或者vuex冻结的对象,Vue不会进行getters和setters的转换。如果你有一个巨大的数组或对象,并且你确定数据不会被修改,那么使用Object.freeze()可以大大提高性能。Object.freeze()方法可以冻结一个对象。无法再修改冻结的对象;当对象被冻结时,对象不能添加新的属性,不能删除已有的属性,也不能修改对象已有属性的可枚举性、可配置性和可写性。属性,并且不能修改现有属性的值。此外,对象的原型在冻结后无法修改。但它冻结的是价值。仍然可以将变量的引用替换为上面提到的:可枚举性、可配置性、可写性以及无法修改上面定义的现有属性的值Object.defineProperty()属性,访问得到打印输出2然后分析三个属性描述符:writable:判断属性的值是否可以修改,打印输出或者2,属性a的值不可修改解析:writable:false可以认为是不可修改的属性,在严格模式下("usestrict";),引擎会抛出TypeError异常,也就是说我们不能修改一个不可写的可配置属性:只要属性是可配置的,就可以使用defineProperty(...)方法来修改属性descriptor注意??在false的情况下,如果修改了,不管是否是严格模式,都会抛出TypeError错误。在这种情况下,我们仍然可以将writability的状态由true改为false来删除该属性将被禁止(deletemyObject.a;)emumerable:可枚举,如果设置为false,该属性将不会出现在枚举中,但是可以正常访问访问描述符定义对象时,添加访问描述符:正常情况下访问p.age输出18但是设置p.age=101后:会抛出错误index.html:65UncaughtError:invalidvalueatObject.setage[asage](index.html:65)atindex.html:71访问描述符的作用:get:每次获取属性时调用console.log(p.age),而此时会调用getset:seteverytime调用p.age=101等属性时,这两者甚至可以和特别提醒无关。他们两个的调用逻辑想必是很清楚的。如果耦合度太高,很容易进入死循环。大名鼎鼎的Vue框架在2.x版本中借用了这种响应式的实现方式~例如:只需要通知所有订阅这个数据变化的组件进行更新,并传递新的值~以上只是一个伪代码,但是总体思路是一样的。如果觉得文笔不错,请点击阅读。朋友圈又一个开源项目Palantir,已经接入微前端,正在编写微前端框架~仓库地址:https://github.com/JinJieTan/PalantirPalantir仓库地址欢迎加入~我们的大群,还有交流群,公众号回复:加群即可
