为什么 jQuery 扩展深拷贝不递归复制对象
Why does jQuery Extend Deep Copy not recursively copy an object?
我到处搜索并找到了类似的问题,其答案并没有真正解决我的问题,所以如果这看起来像是重复,我深表歉意,但从我的实验来看,jQuery 的深度复制函数实际上并没有像它描述的那样工作(或者我可能误读了它的描述)。
下面是一个演示我遇到的问题的示例:http://jsfiddle.net/wcYsH/
或者这个下载:https://github.com/kevroy314/jQuery-Extend-Test
为什么在操作深层副本时,上一个副本中的数据会发生变化?
首先,您没有创建普通对象。
我正在查看jQuery 1.7.2的源代码以进行扩展。
https://github.com/jquery/jquery/blob/master/src/core.js
我注意到了这行:
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy))
必须评估true
才能进行深度复制。 复制只是正在复制的当前对象的一部分。
但是您不是在创建"普通"对象。 您正在创建通过使用 new 运算符调用构造函数生成的对象。
现在,在isPlainObject中,似乎必须评估这些行。 (其中 hasOwn 是hasOwn = Object.prototype.hasOwnProperty
try {
// Not own constructor property must be Object
if ( obj.constructor &&
!hasOwn.call(obj, "constructor") &&
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
它的结论是它不是一个"普通对象"。
当您考虑可能应该通过该构造函数创建具有构造函数的对象或至少使用某种"克隆"方法时,这是有意义的,就像您在其他语言/框架中看到的那样。
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 递归|两个函数名
- 有没有一种方法可以在Javascript中进行可变递归currying
- 如何对不同的表递归使用以下代码
- 将jQuery对象传递到setTimeout递归函数中
- 有更好的方法吗?(递归解析HTML unicode实体)
- 为什么递归生成器函数没有't在ES2015工作
- 使用递归实现加性持久性
- javascript中递归复制二维数组的算法
- 为什么jQueryExtend无法递归复制这两个对象文字
- 为什么 jQuery 扩展深拷贝不递归复制对象