代码:
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 而不是找到的对象中的值?
答案 0 :(得分:4)
让您将问题分为两部分
为什么此代码更改了x中a的值?
这是因为found
是指数组内部的对象。因此,当您更改找到的a
的{{1}}属性时,它将更改数组内的对象。因为found.a++
为什么
found === x[0]
的值不在a
对象中?
这是在变量后面使用增量运算符。因此它将found
设置为先前值而不是增量值。您需要在变量前使用a
。
++
答案 1 :(得分:1)
data = stream.read(chunk, exception_on_overflow = False)
...创建一个新对象。
您正在使用postfix increment operator:
如果使用后缀,则在操作数后加上运算符(例如x ++),则它将递增并在递增之前返回值。
...因此它递增found = {...found, a: found.a++}
(并且由于found.a
是对found
的引用,因此它也会递增x[0]
),但返回值 before 递增...这是用于创建的新对象的值,然后将其分配给x[0].a
。
如果您还想增加found
,则可以使用前缀其中
增加并在增加后返回值
...在这里可以看到:
found.a
答案 2 :(得分:1)
为什么它出现在x上?
found是指与{a: 1}
相同的x[0]
引用,因此对found
的任何更改也将引用x[0]
,
要证明这一点,您可以看到这一点
const x = [{a: 1}, {b: 2}];
let found = x.find(el => el.a === 1);
console.log(found === x[0]) // same reference
console.log(found === {a:1}) // different reference
为什么没出现?
您正在使用帖子增量,它将先分配值,然后再增量
如果需要先增加值,则可以使用预增加
const x = [{a: 1}, {b: 2}];
let found = x.find(el => el.a === 1);
if (found) {
found = { ...found, a: ++found.a};
}
console.log(x);
console.log(found)
您可以阅读它,以进一步了解Pre-increment vs post-increment
答案 3 :(得分:1)
const x = [{
a: 1
}, {
b: 2
}];
console.log(x); //original array
let found = x.find(el => el.a === 1);
console.log(found);// fetch value from array which is similar as 1
if(found){
console.log(found)
found = { ...found,
a: found.a++ //incremented value of element a with 1 so you get increamented value with new object(so you get the increamented value with new object)
}};
console.log(x); // [{a: 2}, {b: 2}];
console.log(found) // {a: 1}
答案 4 :(得分:1)
let found = x.find(el => el.a === 1)
返回匹配条件的数组元素,并声明找到的对象是对该对象的引用。
在下一个作业中:
if(found) found = {...found, a: found.a++};
您首先通过在found.a属性中添加1来操纵(a:found.a ++)find变量(请注意,此时find指向x.find()返回的元素) 完成此操作后,您声明Found现在指向使用{... found,a:found.a ++}表达式构建的对象。
请注意,正如您所说的a:found.a ++,found.a ++返回的值将在您放置它的位置递增,但仅将更改应用于下一个语句中的原始变量(found.a)。这就是为什么它不会将更改传播到x值的原因。