如何通过引用递增变量?代码实现场景咨询
如何在JavaScript中通过引用递增变量?
嘿,这个问题我太懂了!首先得明确:JavaScript里没有像C++那样直接的变量引用语法(就是你写的let &sum这种形式),不过我们有几种替代方案,能实现你想要的“在forEach里操作外部累加变量”的效果,甚至还有更优雅的写法!
方案1:直接使用外部变量(你的原代码其实已经可行)
你原来的写法本身就完全没问题!因为箭头函数会捕获外部作用域的sum变量,直接在forEach里修改它就可以:
let sum = 0; this.rows.forEach(model => { sum += model.hours; }); return sum;
这里箭头函数的作用域链包含了外部的sum,所以每次累加都会直接更新外部的变量,根本不需要什么“引用”语法~
方案2:用对象包裹变量(模拟引用效果)
如果你非要追求类似“传递引用”的方式,可以把sum放到一个对象里。因为对象是引用类型,在forEach里修改对象的属性时,外部的对象也会同步更新:
const sumWrapper = { value: 0 }; this.rows.forEach(model => { sumWrapper.value += model.hours; }); return sumWrapper.value;
这种方式相当于通过对象的引用间接操作变量,达到类似“引用传递”的效果。
方案3:用reduce替代forEach(更优雅的函数式写法)
其实对于数组累加这种场景,JavaScript提供了更合适的方法——Array.reduce(),代码更简洁,还不需要单独声明累加变量:
return this.rows.reduce((total, model) => total + model.hours, 0);
- 第一个参数是累加器函数:每次迭代把当前元素的
hours加到total上 - 第二个参数
0是累加的初始值
这是处理数组累加的标准做法,可读性和简洁性都比forEach更好~
为什么let &sum不行?
JavaScript的参数传递规则是:
- 基本类型(比如number、string)是按值传递,传递的是变量的副本,修改副本不会影响原变量
- 对象类型是按引用传递(准确说是传递引用的值),所以修改对象的属性会影响外部的对象
所以你想的let &sum这种直接引用变量的语法在JS里是不存在的,不过上面的方案完全能满足你的需求!
内容的提问来源于stack exchange,提问作者dooglu
相关产品推荐
相关产品推荐

