我正试图进入Fuse来创建移动应用程序,并且它们使用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;
}
}
因此,据我对编程的理解,数组加长应保持不变,只有变量加长应具有foo作为名称值。但是实际上,该数组现在还具有名称foo。
我猜该变量可以用作指向数组值地址的指针,但是也许有人可以帮助我更好地理解该概念。
答案 0 :(得分:1)
是的,对象和数组始终作为引用传递:
a = {}; // empty object
b = a; // references same object
b.foo = 'bar';
a.foo; // also 'bar'
答案 1 :(得分:1)
您可以使用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);
答案 2 :(得分:1)
数组是通过引用传递的,每当您修改数组中的元素时,更改都会在您访问该数组的任何地方发生,为避免此类问题,您必须使用Array.from(arg)
来创建一个来自的新数组arg
参数。这也适用于对象,为避免对象发生此类问题,无论何时进行任何修改,都必须使用Object.create(obj)
从obj
参数创建新的obj,或者可以使用let newObj = Object.assign( {} , obj )
对于newObj
的成员,obj
对象看不到它,换句话说,这两个对象之间没有直接链接,同样的情况适用于数组
答案 3 :(得分:0)
Boolean
,null
,undefined
,String
和Number
的值称为原始类型。
当您分配不是 基本类型的东西时,即数组,函数和对象,您就是存储对此的引用。
这意味着hikes[i]
包含对该对象的引用,其中 reference 大约表示指向其在内存中位置的指针。>
当您分配hike = hikes[i]
时,您将复制引用而不是实际对象。因此实际上hike
仍与hikes[i]
指向同一对象,因此对该对象的任何更改在两种情况下都是可见的。
如果您要复制基础对象,则有不同的方法。其中之一是Object.assign:
var hike = Object.assign({}, hikes[i])
答案 4 :(得分:0)
这是因为通过引用传递。您需要做的就是创建一个可以使用的新对象(字符串,数字...)。
for (var i = 0; i < hikes.length; i++){
var hike = hikes.slice(i,i+1)[0];
if (hike.id == id){
hike.name = "foo";
break;
}
}
切片还会创建一个深层副本。您可以使用拼接或分配或(((key1,key2)=>(key1,key2))(obj)等。