https://www.jb51.net/article/141141.htm var a={ val: 1 } let _value = a.val Object.defineProperty(a,"val",{ get:function(){ return _value }, set:function(newVal){ _value = newVal console.log("setted") } }) a.val;//1 a.val=[];//setted a.val=[1,2,3];//setted a.val[1]=10;//无输出 a.val.push(4);//无输出 a.val.length=5;//无输出 a.val;//[1,10,3,4,undefined]; 可以看到, 当a.b被设置为数组后,只要不是重新赋值一个新的数组对象,任何对数组内部的修改都不会触发setter方法的执行 。这一点非常重要,因为基于Object.defineProperty()方法的现代前端框架实现的数据双向绑定也同样无法识别这样的数组变化。因此第一点,如果想要触发数据双向绑定,我们不要使用arr[1]=newValue;这样的语句来实现;第二点,框架也提供了许多方法来实现数组的双向绑定。 Array.prototype.push.apply() var a = [1,2,3];