为什么JS不强制"for in loop"中i的值?

Why JS doesn't coerce the value of i in a "for in loop"?

给定两个函数(预期输出为//d):

function fearNotLetter(str) {

  for (let i = 0; i < str.length; i++) {
    let code = str.charCodeAt(i)
    if (code !== str.charCodeAt(0) + i) {
      return String.fromCharCode(str.charCodeAt(0) + i)
    }
  }
  return undefined
}

fearNotLetter("abce");

// d

function fearNotLetter(str) {

  for (let i in str) {
    let code = str.charCodeAt(i)
    if (code !== str.charCodeAt(0) + i) {
      return String.fromCharCode(str.charCodeAt(0) + i)
    }
  }
  return undefined

}

fearNotLetter("abce");

// ϊ

我发现 i 的值是使用 for...in 循环强制转换为字符串的。在我的理解中,if 语句失败了,因为 i 的值不再是数字,因此无法求和。 我的问题是,为什么 JS 不强制 i 回到 if 语句 (str.charCodeAt(0) + i ) 中的数字?并让求和方式和他一样for...loop? 是不是因为,一旦i在函数内部被强制转换,就不能再被强制转换了?

你试过了吗:

str.charCodeAt(parseInt(i, 10))

基本上就是coercion rule。正如您在 table + 中看到的那样,一个 String + 一个 NumberNumber 将永远是隐含地 被迫 String

直觉是,StringNumber 都有 + 运算符,但是 Number 总是能够被强制转换为 String,而并非所有 String 都是 (可以强制为) 一个 Number.

在第一个函数中,当您将 i 初始化为数字时,您将其类型设置为 number。在第二个函数中,i 是一个可迭代对象的键,所以这意味着它的类型是 string。根本没有类型转换。