克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));被使用,但这是非标准的,只有Firefox支持.
我做过类似的事情,obj = JSON.parse(JSON.stringify(o));但质疑效率.
我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.
为什么有人更喜欢lodash.js或underscore.js实用程序库而不是另一个?
Lodash似乎是下划线的替代品,后者已经存在了更长时间.
我认为两者都很精彩,但我对他们如何努力进行有根据的比较并不了解,我想更多地了解这些差异.
...每个对象还引用同一数组中的其他对象?
当我第一次想出这个问题时,我就是这样的
var clonedNodesArray = nodesArray.clone()
Run Code Online (Sandbox Code Playgroud)
将存在并搜索有关如何在javascript中克隆对象的信息.我确实在StackOverflow上找到了一个问题(由同样的@JohnResig回答)他指出用jQuery你可以做的
var clonedNodesArray = jQuery.extend({}, nodesArray);
Run Code Online (Sandbox Code Playgroud)
克隆一个对象.我试过这个,但这只复制了数组中对象的引用.所以,如果我
nodesArray[0].value = "red"
clonedNodesArray[0].value = "green"
Run Code Online (Sandbox Code Playgroud)
nodesArray [0]和clonedNodesArray [0]的值都将变为"绿色".然后我试了一下
var clonedNodesArray = jQuery.extend(true, {}, nodesArray);
Run Code Online (Sandbox Code Playgroud)
哪个深层复制了一个Object,但我分别从Firebug和Opera Dragonfly 那里得到了" 过多的递归 "和" 控制堆栈溢出 "的消息.
你会怎么做?这是不应该做的事吗?在Javascript中是否有可重用的方法?
如果我克隆一个数组,我会使用 cloneArr = arr.slice()
我想知道如何克隆nodejs中的对象.
我正在尝试为我的Redux项目创建一个深度复制映射方法,该方法将使用对象而不是数组.我读到在Redux中,每个州都不应该改变以前的状态.
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
output[key] = callback.call(this, {...object[key]});
return output;
}, {});
}
Run Code Online (Sandbox Code Playgroud)
有用:
return mapCopy(state, e => {
if (e.id === action.id) {
e.title = 'new item';
}
return e;
})
Run Code Online (Sandbox Code Playgroud)
但是它没有深层复制内部项目所以我需要调整它:
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
let newObject = {...object[key]};
newObject.style = {...newObject.style};
newObject.data = {...newObject.data};
output[key] = callback.call(this, newObject);
return output;
}, {});
}
Run Code Online (Sandbox Code Playgroud)
这不太优雅,因为它需要知道传递了哪些对象.ES6中是否有一种方法可以使用扩展语法来深度复制对象?
我刚刚遇到了这个概念
var copy = Object.assign({}, originalObject);
Run Code Online (Sandbox Code Playgroud)
它会将原始对象的副本创建到" copy"对象中.但是,我的问题是,这种克隆对象的方式是创建深拷贝还是浅拷贝?
PS:令人困惑的是,如果它创建了一个深层副本,那么它将是克隆一个对象的最简单方法.
我从Dmitriy Pichugin 的现有答案中复制了下面的功能.此函数可以深度克隆对象而无需任何循环引用 - 它可以工作.
function deepClone( obj ) {
if( !obj || true == obj ) //this also handles boolean as true and false
return obj;
var objType = typeof( obj );
if( "number" == objType || "string" == objType ) // add your immutables here
return obj;
var result = Array.isArray( obj ) ? [] : !obj.constructor ? {} : new obj.constructor();
if( obj instanceof Map )
for( var key of obj.keys() )
result.set( key, deepClone( …Run Code Online (Sandbox Code Playgroud) 我一直在这里冲浪一段时间,仍然没有找到适合我的答案.
有没有办法在JS中深层复制非普通对象?
我已经尝试了,jQuery.extend(true, {}, this)但它只克隆了一些,剩下的仍然是另一个对象的参考.
我看到两种复制对象的方法
1.
var a={c:1}
var b=a;
alert(b.c);//alert 1
Run Code Online (Sandbox Code Playgroud)
2.
var a={c:2};
var b={};
for (i in a)
{b[i]=a[i];}
alert(b.c);//alert 1
Run Code Online (Sandbox Code Playgroud)
第一个比第二个短,那么第二个例子的效率是多少?
在javascript控制台中,如果我这样做,
a = [1,2,3]
Object.prototype.toString.call(a) // gives me "[object Array]"
typeof a // gives me "object"
Run Code Online (Sandbox Code Playgroud)
如果我在GWT中创建一个arraylist并将其传递给本机方法并执行此操作,
// JAVA code
a = new ArrayList<Integer>();
a.push(1);
a.push(2);
//JSNI code
Object.prototype.toString.call(a) // gives me "[object GWTJavaObject]"
typeof a // returns "function"
Run Code Online (Sandbox Code Playgroud)
两者之间究竟有什么区别?是GWTJavaObject完全同样阵?
为什么在纯JavaScript中typeof返回" 对象 "而在GWT中返回" 功能 "?
总结问题是,在Javascript中转换为GWT对象究竟是什么?完整代码在这里.
public void onModuleLoad()
{
List<Integer> list = new ArrayList<Integer>();
list.add( new Integer( 100 ) );
list.add( new Integer( 200 ) );
list.add( new Integer( 300 ) …Run Code Online (Sandbox Code Playgroud) javascript ×10
object ×4
clone ×3
node.js ×2
deep-copy ×1
ecmascript-6 ×1
gwt ×1
lodash ×1
redux ×1
shallow-copy ×1