Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.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 为什么一个值在x中递增,而在找不到的对象中却不递增?_Javascript - Fatal编程技术网

Javascript 为什么一个值在x中递增,而在找不到的对象中却不递增?

Javascript 为什么一个值在x中递增,而在找不到的对象中却不递增?,javascript,Javascript,代码: const x = [{a: 1}, {b: 2}]; let found = x.find(el => el.a === 1); if(found) found = {...found, a: found.a++}; console.log(x); // [{a: 2}, {b: 2}]; console.log(found) // {a: 1} 为什么此代码在x中更改了a的值,而在查找对象中未更改?让我们将问题分为两部分 为什么这个代码改变了x中a的值 这是因为found是指

代码

const x = [{a: 1}, {b: 2}];
let found = x.find(el => el.a === 1);
if(found) found = {...found, a: found.a++};
console.log(x); // [{a: 2}, {b: 2}];
console.log(found) // {a: 1}

为什么此代码在x中更改了a的值,而在查找对象中未更改?

让我们将问题分为两部分

为什么这个代码改变了x中a的值


这是因为
found
是指数组中的对象。因此,当您更改find
found.a++
a
属性时,它会更改数组中的对象。因为
found==x[0]

为什么
a
的值不在
found
对象中

这是指在变量之后使用增量运算符。因此,它将
a
设置为前一个值,而不是递增的值。您需要在变量之前使用
++

constx=[{a:1},{b:2}];
设found=x.find(el=>el.a==1);
如果(found)found={…found,a:++found.a};
console.log(x);//[{a:2},{b:2}];
console.log(已找到)/{a:2}
…创建一个新对象

您正在使用:

如果使用后缀,在操作数后加运算符(例如,x++),则它递增并返回递增前的值

…因此它递增
found.a
(由于
found
是对
x[0]
的引用,因此它也递增
x[0].a
),但在递增之前返回值…这是您正在创建的新对象所使用的值,该对象随后被分配给
found

如果您还想增加
found.a
,您可以使用前缀

递增并返回递增后的值

…从这里可以看出:

constx=[{a:1},{b:2}];
设found=x.find(el=>el.a==1);
如果(found)found={…found,a:++found.a};//
为什么它出现在x上

found是对
{a:1}
的引用,与
x[0]
相同,因此对
found
的任何更改也将引用
x[0]

为了证明这一点,你可以看到

constx=[{a:1},{b:2}];
设found=x.find(el=>el.a==1);
console.log(found==x[0])//相同的引用
log(found=={a:1})//不同的引用
const x=[{
a:1
}, {
b:2
}];
控制台日志(x)//原始数组
设found=x.find(el=>el.a==1);
console.log(已找到);//从类似于1的数组中获取值
如果(找到){
console.log(已找到)
found={…found,
a:found.a++//元素a的增量值为1,因此您可以使用新对象获得增量值(因此您可以使用新对象获得增量值)
}};
console.log(x);//[{a:2},{b:2}];
console.log(found)/{a:1}
让found=x.find(el=>el.a==1)
返回与条件匹配的数组元素,并声明found是对该对象的引用。 在下一个作业中:

if(found) found = {...found, a: found.a++};
首先通过将1添加到found.a属性来操作(a:found.a++)found变量(注意,此时found指向x.find()返回的元素) 在您这样做之后,您声明find now指向一个使用{…find,a:find.a++}表达式构建的对象


请注意,当您调用a:found.a++时,found.a++返回您放置它的地方递增的值,但在下一个语句中仅将更改应用于原始变量(found.a)。这就是为什么它不会将更改传播到x值。

因为
found
是对
x[0]
的引用,并且您增加了
x[0]的值。a
if(found) found = {...found, a: found.a++};