【问题标题】:Differences between angular.copy() and JSON.parse(JSON.stringify())?angular.copy() 和 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()。

【问题讨论】:

    标签: javascript json angularjs object clone


    【解决方案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 版本可能会更快。
    猜你喜欢
    • 2022-01-25
    • 2014-01-11
    • 2014-03-26
    • 2014-07-06
    • 1970-01-01
    • 2018-03-10
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多