You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript for...of循环首字母大写修改数组失效问题求助

为什么for...of循环无法修改原数组元素?

先看你提供的代码:

let days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];

/*for (var index = 0 ; index < days.length ; index++)
{
let test = Array.from(days[index]);
//console.log(test);
let x = days[index].charCodeAt(0)-32;
//console.log(x);
test[0] = String.fromCharCode(x);
//console.log(test);
days[index] = test.join("");
}*/

for (let index of days)
{
    //console.log(index);
    let test = Array.from(index);
    //console.log(test);
    let x = index.charCodeAt(0)-32;
    //console.log(x);
    test[0] = String.fromCharCode(x);
    //console.log(test);
    index = test.join("");
}
console.log(days);

核心原因

  • for...of的迭代变量是元素的副本:在for (let index of days)中,index是数组对应元素的值拷贝。因为字符串是JavaScript的原始类型,原始类型的值按值传递,修改index的赋值只会改变这个局部变量,完全不会影响原数组里的元素。
  • 传统for循环直接操作数组索引:传统循环里days[index]是直接访问数组的索引位置,给这个位置重新赋值时,是直接修改原数组的对应元素,所以能生效。

解决方法

方法1:用entries()获取索引修改原数组

通过entries()同时拿到元素的索引和值,再通过索引修改原数组:

for (let [idx, item] of days.entries()) {
    let test = Array.from(item);
    let x = item.charCodeAt(0) - 32;
    test[0] = String.fromCharCode(x);
    days[idx] = test.join("");
}

方法2:简化首字母大写逻辑

其实不需要转数组,用字符串原生方法就能实现首字母大写,代码更简洁:

// for...of结合entries的简化版
for (let [idx, item] of days.entries()) {
    days[idx] = item.charAt(0).toUpperCase() + item.slice(1);
}

// 传统循环简化版
for (let i = 0; i < days.length; i++) {
    days[i] = days[i].charAt(0).toUpperCase() + days[i].slice(1);
}

内容的提问来源于stack exchange,提问作者Mahmoud Farid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:55:20