为什么在未找到的对象中x值增加?

时间:2019-09-15 03:51:23

标签: 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 而不是找到的对象中的值?

5 个答案:

答案 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值的原因。