在JavaScript中,push和concat在类中的工作方式如何不同
出于某种原因,当我在类定义中有一个数组,然后使用push()函数附加到数组中时,数组变量似乎会为我创建的该类的所有未来对象更新 以下是我正在使用的代码:在JavaScript中,push和concat在类中的工作方式如何不同,javascript,arrays,Javascript,Arrays,出于某种原因,当我在类定义中有一个数组,然后使用push()函数附加到数组中时,数组变量似乎会为我创建的该类的所有未来对象更新 以下是我正在使用的代码: var CircleSprite = cc.Class.extend({ circles:[], thing: "", ctor:function(target, n, x, y) { this.num = n; //This should always print 0 whenever a new object is
var CircleSprite = cc.Class.extend({
circles:[],
thing: "",
ctor:function(target, n, x, y) {
this.num = n;
//This should always print 0 whenever a new object is created, but it's storing the object from the previous creation as well
cc.log("num circles: " + this.circles.length);
for(var i=0; i<n; i++)
{
var circleSprite = new cc.Sprite.create(res.circle);
circleSprite.setPosition(cc.p(x, y+circleSprite.height*this.circles.length));
this.circles.push(circleSprite); //doesn't work like I want
//this.circles = this.circles.concat(circleSprite); works well
}
//This code works as expected for each object
cc.log("this thing: " + this.thing); //prints ""
this.thing = "hi"+n;
cc.log("this thing: " + this.thing); //print "hi2", "hi3", etc.
},
var CircleSprite=cc.Class.extend({
圆圈:[],
事情:“,
ctor:功能(目标、n、x、y){
this.num=n;
//无论何时创建新对象,都应始终打印0,但它也存储了以前创建的对象
cc.log(“num circles:+this.circles.length”);
对于(var i=0;i,因为所有实例都引用相同的变量。push
附加到现有数组,而concat
使用组合值创建一个副本
这是一个问题,因为类的每个实例都持有对同一数组的引用。它们都有不同的变量,因此您可以复制并替换该引用,但最初它们都引用完全相同的数组。JS中的对象是可变的,因此您可以修改数组并影响类的每个实例。字符串为not,所以任何附加或赋值都将创建一个副本,并且只有一个实例将引用该副本,所以您不会看到这个问题
因为您已经在类定义中声明了数组,所以它相当于Java或C/++中的静态字段。该类的所有实例都将共享相同的值
要解决此问题,您应该在构造函数中声明变量(this.circles=[]
),在该构造函数中,变量将针对每个实例进行初始化,并仅分配给该特定实例。除了另一个很好的答案外,您还想添加Microsoft文档中带有参考链接的两个方法的以下说明:
concat()
push()
方法将一个或多个元素添加到数组的末尾,并返回数组的新长度
参考资料:
但问题是,我还在类定义中声明了其他变量,这些变量似乎是每个对象的局部变量,这就是为什么我感到困惑的原因。具体来说,这是因为您使用的是一个对象。如果要使用字符串,您可以附加到它或重新分配它,这没有问题,因为字符串是不可变的,您必须为每个对象创建一个副本时间并将其分配给字段。当您使用一个对象时,您可以在不复制或分配的情况下对该对象进行变异,这是由持有同一对象引用的任何其他人拾取的。啊,好吧,这很有意义,因此所有的基元类型(如int)也会有所不同。JS没有很多基元类型,但有字符串、数字(动态int/float)和布尔值都是不可变的。所有对象,包括数组和函数,都会有这种行为。push
对数组进行变异,concat
返回一个新的(并且赋值会创建自己的属性)对吧,我知道如何使用concat()和push()函数我只是不知道类定义中声明的对象是静态的variables@rasen58是的,有些时候小事情弄糊涂了,谢谢你的反馈,祝你的项目好运。