检测javascript中的对象是否已更改

检测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

我有一个每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
        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。用于比较对象 要解决这个问题:

  • 您需要使用两个不同的对象(例如,通过使用类似于jQuery的
    .extend()
    的解决方案从现有对象构造新对象)。您当前使用不必要的序列化来实现该部分
  • 您需要以更复杂的方式对它们进行比较(这里是非常通用的解决方案:)
  • 与此相比,您的解决方案可能看起来不那么复杂(至少在代码方面)。我建议用一些来找出,哪个更合理。它并不总是本机支持的,因此它可能会像我提到的替代解决方案那样执行类似复杂(和消耗资源)的操作

    解决办法2。用于解决检测更改的总体问题 另一个选项是重建脚本,并使用例如标志将对象标记为用户输入更改的对象。这将节省每秒处理整个对象的时间,并可能带来巨大的效率提升

    在这种情况下,您需要做的事情是:

  • 在用户输入处理程序中,每当用户更改对象的某些部分时,设置标志
  • 或者,您可以首先将特定值与原始对象进行比较(如果用户快速更改了它,然后恢复了更改,只需将该值标记为未更改)
  • 为了限制对已更改对象的处理,您甚至可以标记哪些属性已更改(因此您只处理这些属性,而不处理其他属性)
  • 要实现此解决方案的一部分,您甚至可以使用


    但是,正如我所提到的,它可能需要重建脚本(我们还没有看到,所以我们不能说它是否必要,或者它是否可以很容易地应用)。

    可能相关:寻找深度相等算法。或者构造自己的
    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