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
相关产品推荐
相关产品推荐

