【发布时间】:2014-01-03 18:31:52
【问题描述】:
我正在用 JavaScript 编写编译器,而对于优化器,我遵循通常的模式,即重复运行优化列表直到没有任何反应。检测“什么都没有发生”情况的明显方法是让每个优化设置一个标志,如果它成功地做某事。我想知道是否有更优雅的方式来解决它。
在摘要中,问题可以这样表述:给定一个复杂对象(具有许多级别的子对象,包括具有循环引用的数组等),通过可能的转换运行它,然后检测是否有任何变化。所以问题是是否有一种简单的方法来检测复杂对象的变化。
Watch.js 提供了检测对象变化的方法,但仅限于顶层,并且会在字段发生变化时触发,即使该字段随后返回其原始值。
另一种方法是制作对象的深层副本,然后与原始对象进行深层比较。但是,从这里的其他问题来看,深度复制看起来是一项不平凡的操作,深度比较也有其自身的挑战。
我是否缺少一个优雅的技巧,或者我应该坚持让每个优化通过做自己的记账?
【问题讨论】:
-
Backbone.js 有这个内置的。 backbonejs.org/#Model-changedAttributes
-
@Diodeus 有趣!我从文档中得到的印象是它只看到顶级属性更改,但没有子对象的更改?
-
头脑风暴:无论您使用什么来检测顶层的变化,您不能简单地将其应用于原始对象中的每个数组和子对象吗?
-
你看过Object.observe吗?不过现在它在旗帜后面。
标签: javascript deep-copy