代码之家  ›  专栏  ›  技术社区  ›  Christian Schmidt

javascript数组值到变量

  •  0
  • Christian Schmidt  · 技术社区  · 7 年前

    我试图进入保险丝创建移动应用程序,他们使用JavaScript的逻辑。我以前从未使用过JavaScript,最近才完成了入门课程。大部分的东西都很容易理解,但是我对它们在一个点上使用变量的方式有点麻烦。如果有人能解释一下变量在javascript中的行为,那就太好了。

    所以我的问题是:

        for (var i = 0; i < hikes.length; i++){
            // A new variable gets the value of the array
            var hike = hikes[i];
    
            if (hike.id == id){
                // The variable gets a new value
                hike.name = "foo";
                break;
            }
        }
    

    因此,在我对编程的理解中,数组上升应该是不变的,只有变量的上升应该具有name值。但实际上,数组现在也有了foo的名字。

    我想这个变量可以作为指向数组值地址的指针,但是也许有人可以帮助我更好地理解这个概念。

    5 回复  |  直到 7 年前
        1
  •  1
  •   Tommos    7 年前

    是的,对象和数组始终作为引用传递:

    a = {}; // empty object
    b = a; // references same object
    b.foo = 'bar';
    a.foo; // also 'bar'
    
        2
  •  1
  •   Ankit Agarwal    7 年前

    可以使用数组创建深度副本。 JSON.parse(JSON.stringify(hikes)); 然后使用复制的数组进行操作:

    var hikes = [
      {
        'id': 10
      }
    ];
    var id = 10;
    var tempHikes = JSON.parse(JSON.stringify(hikes));
    for (var i = 0; i < tempHikes.length; i++){
        // A new variable gets the value of the array
        var hike = tempHikes[i];
        if (hike.id == id){
            // The variable gets a new value
            hike.name = "foo";
            console.log('hike is ', hike);
            break;
        }
    }
    console.log(hikes);
        3
  •  1
  •   0.sh    7 年前

    JavaScript中的数组是通过引用传递的,每当修改数组中的元素时,在访问该数组的任何地方都会发生更改,以避免使用这些问题。 Array.from(arg) 它从 arg 参数。这也适用于对象,为了避免对象出现此类问题,必须使用 Object.create(obj) 创建新的对象 obj 参数或您可以使用 let newObj = Object.assign( {} , obj ) ,每当您对 newObj 这个 OBJ 对象没有看到它,换句话说,这两个对象之间没有直接联系,同样的事情适用于数组。

        4
  •  0
  •   ᴘᴀɴᴀʏɪᴏᴛɪs    7 年前

    Boolean , null , undefined , String Number 值被调用 基本类型 .

    当你分配的东西是 原始类型,即 数组 , 功能 物体 您正在存储 参考 对此。 也就是说 hikes[i] 包含一个 参考 到目标,在那里 参考 粗略地 是指它在内存中的位置指针。

    当您分配 hike = hikes[i] 你正在复制 参考 而不是真正的对象。所以事实上 hike 仍然指向同一个对象 远足[我] 因此,在两种情况下都可以看到对该对象的任何更改。

    如果你想的话 复制 作为底层对象,有不同的方法。其中之一是 Object.assign :

    var hike = Object.assign({}, hikes[i])
    
        5
  •  0
  •   pr0p    7 年前

    这是因为通过引用传递。你只需要创建一个新的对象(字符串,数字…)就可以了。

     for (var i = 0; i < hikes.length; i++){
        var hike = hikes.slice(i,i+1)[0];
        if (hike.id == id){
            hike.name = "foo";
            break;
        }
    }

    切片也创建一个深拷贝。您可以使用splice或assign or((key1,key2)=>(key1,key2))(obj)等。