Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
Run Code Online (Sandbox Code Playgroud)
我一直在使用这段代码来创建从以前的代码继承的新对象.但是我遇到了一点意外.
a = {
foo: [1,2,3]
}
b = Object.create(a);
// b.foo -> [1,2,3]
b.foo = "test";
// b.foo -> "test"
// a.foo -> [1,2,3]
c = Object.create(a);
// c.foo -> [1,2,3]
c.foo[0] = 'test';
// c.foo -> ["test",2,3]
// a.foo -> ["test",2,3]
Run Code Online (Sandbox Code Playgroud)
在尝试改变时,c.foo
我改变了a.foo
,c.foo
显示了改变,因为它继承了a
.我现在看到的唯一解决方案是仅修改以下的直接属性b
:
d = Object.create(a);
d.foo = Object.create(a.foo);
d.foo[0] = 'text'; …
Run Code Online (Sandbox Code Playgroud) 我有这两个对象:
obj1 = {a: '', b: ''}
obj2 = {a: '1', b: '2', c: '3'}
Run Code Online (Sandbox Code Playgroud)
我想所有匹配的特性,从复制obj2
到obj1
.在Typescript中这样做的最佳方式是什么?
我的理解是Array.filter创建了对象的克隆,但在下面的示例中,type1 和 type1a 显然共享一些数据。
let initial = [
{id: 1, type: 1, name: "first", count:0},
{id: 2, type: 2, name: "second", count:0},
{id: 3, type: 1, name: "third", count:0},
{id: 4, type: 2, name: "fourth", count:0},
];
let type1 = initial.filter((item)=>item.type===1);
let type1a = initial.filter((item)=>item.type===1);
type1[0].count = 2;
console.log(type1a[0].count);
Run Code Online (Sandbox Code Playgroud)
结果:
Expected result: 0
Got: 2
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
我尝试在两个 allocateemnet 中添加扩展运算符,但结果是相同的:(
感谢@Thomas 的回答。
供您参考,正确的代码是:
let initial = [
{ id: 1, type: 1, name: "first", count: 0 },
{ id: …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建现有数组的副本,并从数组副本中删除一些项目而不影响原始数据.我试过这个:
var new_arr = old_arr; //when I remove from new array the items from old array are also removed
Run Code Online (Sandbox Code Playgroud)
如何创建现有阵列的全新副本?
更新:
当我这样做:
var new_arr = old_arr.slice();
Run Code Online (Sandbox Code Playgroud)
然后:
new_arr[0].shift();
new_arr[1].shift();
Run Code Online (Sandbox Code Playgroud)
来自old_array的项目将被删除.这是一个二维数组.
我想在浏览器中保留一些JSON信息.根据用户与应用程序的交互,我想将5-6个不同的JSON对象存储到内存中.我有什么选择来实现这个目标?请建议任何我可以在浏览器中保留信息的库或插件.
谢谢
我正在玩Chrome控制台并注意到一些我无法理解的东西.我知道JS变量是按值复制的,对象是通过引用复制的.下面的代码工作正常,输出2并证明JS对象作为参考:
var objA = {a: 1};
var objB = objA;
objA.a = 2;
objB.a; // 2
Run Code Online (Sandbox Code Playgroud)
但是,此代码无法正常工作.我期望objB.a输出,2
但它给出了1
.为什么?
var objA = {a: 1};
var objB = objA;
objA = {a: 2}; //Assigned whole object here instead property.
objB.a; //1 - Shouldn't this be 2 ??
Run Code Online (Sandbox Code Playgroud) 将数组分配给另一个变量时,将传递引用而不是值.当您使用==
运算符比较两个数组并且它返回时,会确认这一点true
var a = [[1,2],[3,4],[5,6]];
var b = a; // b = [[1,2],[3,4],[5,6]]
var c = [].concat(a); // c = [[1,2],[3,4],[5,6]]
a == b; //true
a == c; //false
Run Code Online (Sandbox Code Playgroud)
通过上面的输入,当我修改数组时b
,它会改变数组a
,但不是c
.
b.push([7,8]); // b = [[1,2],[3,4],[5,6], [7,8]]
a; //a = [[1,2],[3,4],[5,6], [7,8]]
c; //c = [[1,2],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)
但是当我在下面做的时候,它会发生变异c
.
b[0].push(5); // b = [[1,2,5],[3,4],[5,6], [7,8]]
a; //a = [[1,2,5],[3,4],[5,6], [7,8]]
c; //c = [[1,2,5],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)
为什么会这样?使用改变数组的数组方法会发生此行为.
如何在角度2中创建深层副本,我尝试使用let newObject = Object.assign({}, myObject)
但仍然myObject
反映了在newObject中完成的所有更改.
我有以下代码用于将一个关联数组复制到其他,
<script>
var some_db = new Array();
some_db["One"] = "1";
some_db["Two"] = "2";
some_db["Three"] = "3";
var copy_db = new Array();
alert(some_db["One"]);
copy_db = some_db.slice();
alert(copy_db["One"]);
</script>
Run Code Online (Sandbox Code Playgroud)
但第二个警报说"未定义"..我在这里做错了吗?任何指针请..
我看到两种复制对象的方法
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 ×8
angular ×1
angularjs ×1
extjs ×1
inheritance ×1
jquery ×1
object ×1
typescript ×1