Javascript - charAt 不是函数错误

Mas*_*oe2 0 javascript

我在下面的代码中犯了一个错误。在变量“x”中,我存储了字符串“s”中的一个字符。然后,我错误地增加了“x”,这导致了代码后给出的错误。为什么 JS 允许我首先增加一个字符变量?如何防止发生此类错误?

function jsFun(s){
    var x = s.charAt(0);
    s++;//Wrong !
    x = s.charAt(1);
    return x;
}

console.log(jsFun("one"));
Run Code Online (Sandbox Code Playgroud)

错误:在第 4 行。

TypeError: s.charAt is not a function
Run Code Online (Sandbox Code Playgroud)

Alb*_*era 5

因为 ECMAScript 语言规范允许https://www.ecma-international.org/ecma-262/5.1/#sec-11.4.4

++一元运算符抛出 SyntaxError的唯一时间是以下所有情况都为真:

  • Type(expr) is 引用为真
  • IsStrictReference(expr) 为真
  • Type(GetBase(expr)) 是环境记录
  • GetReferencedName(expr) 是“eval”或“arguments”

否则,它会尝试将该值解析为一个数字并将其加一。字符串不符合抛出标准,因此它被解析为一个数字(导致NaN您的示例),然后在将其值增加 1 后,它仍然返回NaN.

如果字符串是数字,例如"1234",您会看到它变成了一个数字并增加了 1,正如您对数字所期望的那样。charAt但是,一旦您尝试调用该函数,您的代码就会出错,因为数字没有该函数。

为了使用普通的 Javascript 防止这种行为,您可以在增加变量之前检查变量是否为非 NaN 数

if (!Number.isNaN(s)) {
   s++
}
Run Code Online (Sandbox Code Playgroud)

isNaN如果您想验证字符串是否为数字,您也可以使用。

另外,就像其他答案所说的那样,您可以使用类型检查的替代方法(例如 Typescript)或静态类型检查器(例如 flow.js)来防止在编译时出现这些错误。