JavaScript代码中let number = 0的作用存疑:移除后代码仍可运行
代码中
let number = 0的作用详解 先拆解下你这段代码的逻辑:它用for...in遍历字符串的索引(不是字符本身),每次循环把当前索引转成数字赋值给number,最终返回的number其实是字符串最后一个字符的索引值(比如传入'the best day',最后一个索引是11,所以输出{ number: 11 })。
这行代码的核心作用
let number = 0同时完成了两个关键操作:
- 声明块级作用域变量:用
let在函数内部声明了number,确保它是函数内的局部变量,避免后续赋值时隐式创建全局变量(非严格模式下会污染全局作用域,严格模式下直接报错)。 - 提供初始兜底值:给
number设置初始值0,当传入的sentence是空字符串时,for...in循环不会执行,此时函数会返回{ number: 0 },而不是因为number未定义抛出错误或返回undefined。
移除这行代码的后果
如果删掉let number = 0,代码会出现两个明显问题:
- 变量未声明错误:循环内的
number = Number(letter)会因为number没被提前声明,在严格模式下直接抛出ReferenceError;非严格模式下会隐式创建全局变量,导致全局作用域被污染,后续其他代码可能意外修改这个变量,引发难以排查的bug。 - 空字符串场景失效:当传入空字符串时,循环不执行,
return { number }会因为number未定义,要么抛出错误,要么返回{ number: undefined },破坏了函数的容错性。
移除后的错误代码示例(非严格模式):
const countLetter = (sentence) => { for (const letter in sentence){ number = Number(letter) } return { number } } // 传入空字符串时返回 { number: undefined },且全局新增了一个number变量
特殊场景对比
- 传入非空字符串时:看起来移除初始值后代码能正常输出结果,但本质上是依赖了隐式创建的全局变量,属于严重的不良编码习惯。
- 传入空字符串时:保留初始值会返回
{ number: 0 },移除后则会出现未定义问题。
内容的提问来源于stack exchange,提问作者Brisa Queque
相关产品推荐
相关产品推荐

