我有一个对象,x.我想把它复制为对象y,这样改变y就不要修改了x.我意识到复制从内置JavaScript对象派生的对象将导致额外的,不需要的属性.这不是问题,因为我正在复制我自己的一个文字构造的对象.
如何正确克隆JavaScript对象?
原始类型(Number,String等)按值传递,但是对象是未知的,因为它们可以是值传递(如果我们认为持有对象的变量实际上是对象的引用)并且通过引用传递(当我们认为对象的变量保存对象本身时).
虽然最后并不重要,但我想知道提交传递约定的参数的正确方法是什么.是否有JavaScript规范的摘录,它定义了与此相关的语义?
...每个对象还引用同一数组中的其他对象?
当我第一次想出这个问题时,我就是这样的
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中是否有可重用的方法?
我正在寻找一些很好的综合阅读材料,当Javascript按值传递某些内容时,以及何时通过引用和修改传递的项目时会影响函数外部的值,何时不会.我还对通过引用与值分配另一个变量以及是否遵循任何不同的规则而不是作为函数参数传递感兴趣.
我已经做了很多搜索并找到了很多具体的例子(其中很多都是在SO上),我可以从中开始拼凑出真正的规则,但我还没有找到一个单一的,写得很好的文档,描述了这一切.
此外,语言中是否有方法可以控制是通过引用还是通过值传递某些内容?
以下是我想要了解的一些问题类型.这些只是示例 - 我实际上是在了解语言所遵循的规则,而不仅仅是具体示例的答案.但是,这里有一些例子:
function f(a,b,c) {
a = 3;
b.push("foo");
c.first = false;
}
var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);
Run Code Online (Sandbox Code Playgroud)
对于所有不同类型,x,y和z的内容何时在f的范围之外变化?
function f() {
var a = ["1", "2", "3"];
var b = a[1];
a[1] = "4";
// what is the value of b now for all possible data types that the array in "a" might hold?
}
function f() {
var a = [{yellow: "blue"}, {red: …Run Code Online (Sandbox Code Playgroud) 无论Object.assign和对象传播只能做一浅合并.
问题的一个例子:
// No object nesting
const x = { a: 1 }
const y = { b: 1 }
const z = { ...x, ...y } // { a: 1, b: 1 }
Run Code Online (Sandbox Code Playgroud)
输出是你所期望的.但是如果我试试这个:
// Object nesting
const x = { a: { a: 1 } }
const y = { a: { b: 1 } }
const z = { ...x, ...y } // { a: { b: 1 } }
Run Code Online (Sandbox Code Playgroud)
代替
{ a: …Run Code Online (Sandbox Code Playgroud) 我试图通过使用这样的嵌套属性来组织我的状态:
this.state = {
someProperty: {
flag:true
}
}
Run Code Online (Sandbox Code Playgroud)
但是像这样更新状态,
this.setState({ someProperty.flag: false });
Run Code Online (Sandbox Code Playgroud)
不起作用.怎么能正确完成?
我有一个扁平的JS对象:
{a: 1, b: 2, c: 3, ..., z:26}
Run Code Online (Sandbox Code Playgroud)
我想克隆除一个元素之外的对象:
{a: 1, c: 3, ..., z:26}
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么(如果可能,最好使用es6/7)?
可能重复:
克隆JavaScript对象的最有效方法是什么?
我需要复制一个(有序的,非关联的)对象数组.我正在使用jQuery.我最初尝试过
jquery.extend({}, myArray)
Run Code Online (Sandbox Code Playgroud)
但是,当然,这给了我一个对象,我需要一个数组(顺便说一句,真的很喜欢jquery.extend).
那么,复制数组的最佳方法是什么?
在node.js中克隆对象的最佳方法是什么
例如,我想避免以下情况:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
Run Code Online (Sandbox Code Playgroud)
该对象可能包含复杂类型作为属性,因此简单的(obj1中的var x)无法解决.我是否需要自己编写一个递归克隆,或者是否有内置的东西我没有看到?
我在这里编写了一个快速的jsfiddle ,我将一个小的json对象传递给一个新的变量并修改原始变量(而不是新变量)的数据,但新变量的数据也会更新.这必须意味着json对象是通过引用传递的,对吧?
这是我的快速代码:
var json_original = {one:'one', two:'two'}
var json_new = json_original;
console.log(json_original); //one, two
console.log(json_new); //one, two
json_original.one = 'two';
json_original.two = 'one';
console.log(json_original); //two, one
console.log(json_new); //two, one
Run Code Online (Sandbox Code Playgroud)
有没有办法制作json对象的深层副本,以便修改原始变量不会修改新变量?
javascript ×10
ecmascript-6 ×2
clone ×1
ecmascript-7 ×1
jquery ×1
node.js ×1
object ×1
reactjs ×1
reference ×1
setstate ×1