为什么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
+ 一个 Number
,Number
将永远是隐含地 被迫 String
。
直觉是,String
和 Number
都有 +
运算符,但是 Number
总是能够被强制转换为 String
,而并非所有 String
都是 (可以强制为) 一个 Number
.
在第一个函数中,当您将 i
初始化为数字时,您将其类型设置为 number
。在第二个函数中,i
是一个可迭代对象的键,所以这意味着它的类型是 string
。根本没有类型转换。
给定两个函数(预期输出为//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
+ 一个 Number
,Number
将永远是隐含地 被迫 String
。
直觉是,String
和 Number
都有 +
运算符,但是 Number
总是能够被强制转换为 String
,而并非所有 String
都是 (可以强制为) 一个 Number
.
在第一个函数中,当您将 i
初始化为数字时,您将其类型设置为 number
。在第二个函数中,i
是一个可迭代对象的键,所以这意味着它的类型是 string
。根本没有类型转换。