检测javascript中的对象是否已更改
我有一个每1秒调用一次的函数检测javascript中的对象是否已更改,javascript,Javascript,我有一个每1秒调用一次的函数 var latestObject; //this updated separately, it depends on user input so it may not be different every second var previousObject; function Tick(object) { if (latestObject !== previousObject) { //Problem is here previousObje
var latestObject; //this updated separately, it depends on user input so it may not be different every second
var previousObject;
function Tick(object) {
if (latestObject !== previousObject) { //Problem is here
previousObject = latestObject; //or here
//do stuff with latestObject;
}
}
但是,当更新latestObject
时,其属性会更改,变量不会设置为其他对象。所以previousObject和LatesObject总是相等的,do stuff
永远不会发生
我可以做到:
function Tick(object) {
var latestObjectString = JSON.stringify(latestObject);
if (latestObjectString !== previousObject) { //Problem is here
previousObject = latestObjectString; //or here
//do stuff with latestObject;
}
}
但是我每秒钟做一次JSON.stringify,这看起来效率很低,尤其是因为latestObject非常大,而且非常深
将previousObject设置为latestObject的副本不是更好吗?这样,当latestObject上的属性发生更改时,previousObject保持不变,而只有当对象不同时才会发生这种情况,而这种情况的发生频率比每秒都少?但是,copyOfObject==Object
永远不会为真,这难道不会有问题吗
(对象主要是属性,但有一些永远不变的函数)
(无jQuery)问题描述
这里的问题确实与一个事实有关,即同一个对象被分配给两个不同的变量。即使你在一个地方改变它,另一个地方也会改变它
这个例子向您展示了真正发生的事情(jsFiddle:):
然而,拥有两个不同的对象也不是那么理想,因为比较它们是非常重要的(这里有证据:)
解决办法1。用于比较对象
要解决这个问题:
.extend()
的解决方案从现有对象构造新对象)。您当前使用不必要的序列化来实现该部分但是,正如我所提到的,它可能需要重建脚本(我们还没有看到,所以我们不能说它是否必要,或者它是否可以很容易地应用)。可能相关:寻找深度相等算法。或者构造自己的
obj.hasChanged
语义。也可以发光(也许)?物体的属性是什么?对象、自定义元素或DOM元素是什么?让我知道,我可以帮你。那么if()
语句是用来检测突变的吗?如果是,突变是如何发生的?当对象发生变异时,您能在其上设置一个标志吗?JavaScript有一天会出现Proxy
,这为对象带来了强大的观察功能。遗憾的是,我无法控制对象,因此我无法向其添加标志。我意识到在do stuff
部分,无论如何我都必须使用JSON.stringify
var objA = {'a':10, 'b': 20};
var objB = objA; // same instance assigned to both names
objB.a = 30; // instance is modified, its "a" property is changed
// now, both objA.a and objB.a show "30", as objA and objB is the same instance