Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中,push和concat在类中的工作方式如何不同_Javascript_Arrays - Fatal编程技术网

在JavaScript中,push和concat在类中的工作方式如何不同

在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

出于某种原因,当我在类定义中有一个数组,然后使用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 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是的,有些时候小事情弄糊涂了,谢谢你的反馈,祝你的项目好运。