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()) 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

Angular.js 中 copy 赋值与 = 赋值 区别

AngularJS方法 —— angular.copy

大型数组的 angular.copy 面临非常糟糕的性能

为啥以及何时使用 angular.copy? (深拷贝)

angular.js 的angular.copy angular.extend angular.merge

angularjs 的笔记