不再让梦枯萎 2022-05-04 13:47:02
为什么不能监听数组的变化?
function(obj, key) { let val = obj[key]; Object.defineProperty(obj, key, { enumerable: true, configurable: true, get() { console.log('in get'); return val; }, set(newVal) { if (newVal === val) { return; } val = newVal; } }); } var a = [1, 2, 3] defineReactive(a, 0) a[0] = 5 // in get这有什么问题?
这里说的不能监听数组变化是指{b:[1,2,3]},这样去改变b[0] =2是无法触发依赖收集的
而你这种写法实际上是不能算属于数组的监听了,实际上是利用了js最顶层原型是对象的原理,你监听的是a下面的0属性,a下面的1属性,甚至是a下面的length属性
原来研究过一下这个,不太记得当时的结论了,但是刚才想了下,你非要说可以监听的话,这样是能做到监听的没问题。但是这样浪费的性能将指数倍增加,你无法预估一个数组有多少层有多少位,你需要对数组每一层每一位进行依赖收集和更新时的notify。
不再让梦枯萎 2022-05-04 01:52:48
一秒后同时输出 1、4、9
如果要每隔一秒输出把 forEach 换成普通 for 循环或者 for...of... 循环即可
这里并行进行是因为 forEach 实现的问题,源码里用 while 来一次性执行了所有回调
具体参考官网 polyfill: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
- 共 1 页
- 1
第 77 题:旋转数组算法题