angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?
Posted
技术标签:
【中文标题】angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?【英文标题】:Differences between angular.copy() and JSON.parse(JSON.stringify())? 【发布时间】:2015-06-29 02:18:45 【问题描述】:有人能解释一下 angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别吗?有吗?你会推荐使用什么? angular.fromJson(angular.toJson()) 和 JSON.parse(JSON.stringify()) 一样吗? 顺便提一下,我已经阅读了 How do I correctly clone a javascript object? 的 JSON.parse(JSON.stringify()) 和 angular.copy() reference 的 angular.copy()。
【问题讨论】:
【参考方案1】:JSON.parse(JSON.stringify())
不会复制的内容:
Date
(它会被复制,但不会被复制为 Date
)
属性值为undefined
angular.fromJson(angular.toJson())
基本相同,只是 angular.toJson()
省略了 Angular 内部使用的属性(以 $$
开头的属性)。
【讨论】:
我们什么时候只需要复制没有函数引用、日期、未定义值的数据,那么最好的方法是什么? angular.copy() 或 JSON.parse(JSON.stringify())【参考方案2】:我可以非常具体地回答您的问题,指出他们对待 undefined
的方式不同:
> JSON.parse(JSON.stringify(undefined))
SyntaxError: Unexpected token u
更一般地说,我更喜欢 angular.copy:
angular.copy 正是你想要的; JSON.parse * JSON.stringify 从可读性的角度来看是一种 hack。 angular.copy 几乎可以肯定性能更高,因为它是您尝试执行的更高级别的规范。如果编写它的工程师写了一些性能不太的东西,他们会用 JSON 版本来实现它......话虽如此,他们是否以同样的方式处理更深奥的数据,例如函数?我无法回答这个问题,但我会在决定之前研究(或等待另一个答案)。
【讨论】:
angular.copy 复制函数指针,+1 表示 hack 注释。即使你故意想要一个没有函数的副本,我也会编写一个函数来做到这一点。不要用这些 hack 乱扔你的代码库。把它们放在一个地方 angular.copy 也会正确复制 Date 实例。 Liviu T 说得好,要了解 JSON.parse 的局限性,您应该研究 JSON 中可以包含的内容。 w3schools json 也许他们没有用 JSON 版本实现它,因为他们希望它的行为有点不同。所以 JSON 版本可能会更快。以上是关于angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章