美文网首页
前端 の 总结 (一)

前端 の 总结 (一)

作者: Charlescat | 来源:发表于2018-07-18 16:10 被阅读0次
QAQ

1.脏数据检测

在 angular中,它不会判断你哪个数据做了更改, 所以它设置了一些条件,当你触发了这些条件之后,它就执行一个检测来遍历所有的数据,对比你更改了地方,然后执行变化。

这种检测效率较低,所以被命为脏检测。

2.数据劫持

// 这是将要被劫持的对象

        const data = {

            name: '',

        };

        function say(name) {

            if (name === '古天乐') {

                console.log('给大家推荐一款超好玩的游戏');

            } else if (name === '渣渣辉') {

                console.log('戏我演过很多,可游戏我只玩贪玩懒月');

            } else {

                console.log('来做我的兄弟');

            }

        }

        // 遍历对象,对其属性值进行劫持

        Object.keys(data).forEach(function(key) {

            Object.defineProperty(data, key, {

                enumerable: true,

                configurable: true,

                get: function() {

                    console.log('get');

                },

                set: function(newVal) {

                    // 当属性值发生变化时我们可以进行额外操作

                    console.log(`大家好,我系${newVal}`);

                    say(newVal);

                },

            });

        });

        data.name = '渣渣辉';

        //大家好,我系渣渣辉

        //戏我演过很多,可游戏我只玩贪玩懒月

具体:https://juejin.im/post/5acd0c8a6fb9a028da7cdfaf

3.proxy和Object.defineProperty()的区别

proxy例子:

      const input = document.getElementById('input');

        const p = document.getElementById('p');

        const obj = {};

        const newObj = new Proxy(obj, {

            get: function(target, key, receiver) {

                console.log(`getting ${key}!`);

                return Reflect.get(target, key, receiver);

            },

            set: function(target, key, value, receiver) {

                console.log(target, key, value, receiver);

                if (key === 'text') {

                    input.value = value;

                    p.innerHTML = value;

                }

                return Reflect.set(target, key, value, receiver);

            },

        });

        input.addEventListener('keyup', function(e) {

            newObj.text = e.target.value;

        });

Proxy有多达13种拦截方法,不限于apply、ownKeys、deleteProperty、has等等是Object.defineProperty不具备的。

Proxy返回的是一个新对象,我们可以只操作新的对象达到目的,而Object.defineProperty只能遍历对象属性直接修改。

Proxy作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利。

当然,Proxy的劣势就是兼容性问题,而且无法用polyfill磨平,因此Vue的作者才声明需要等到下个大版本(3.0)才能用Proxy重写。

具体:https://juejin.im/post/5acd0c8a6fb9a028da7cdfaf


4.为什么需要虚拟dom

虚拟DOM就是为了解决这个浏览器性能问题而被设计出来的。例如前面的例子,假如一次操作中有10次更新DOM的动作,虚拟DOM不会立即操作DOM,而是将这10次更新的diff内容保存到本地的一个js对象中,最终将这个js对象一次性attach到DOM树上,通知浏览器去执行绘制工作,这样可以避免大量的无谓的计算量。

虚拟dom

相关文章

网友评论

      本文标题:前端 の 总结 (一)

      本文链接:https://www.haomeiwen.com/subject/cwsgpftx.html