首页 > 解决方案 > Javascript - charAt 不是函数错误

问题描述

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

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

console.log(jsFun("one"));

错误:在第 4 行。

TypeError: s.charAt is not a function

标签: javascript

解决方案


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

一元运算符唯一一次++抛出 SyntaxError 是如果以下所有条件都为真:

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

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

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

要使用纯 Javascript 防止这种行为,您可以在增加变量之前检查变量是否为非 NaN 数字

if (!Number.isNaN(s)) {
   s++
}

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

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


推荐阅读