Javascript-charAt不是函数错误

Javascript-charAt不是函数错误,javascript,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")); 错误:在第4行 TypeError: s.charAt i

我在下面的代码中犯了一个错误。在变量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

因为ECMAScript语言规范允许它

++一元运算符抛出SyntaxError的唯一时间是以下所有条件均为true时:

Typeexpr是引用是真的 IsStritReferenceExpr是真的 TypeGetBaseexpr是环境记录 GetReferencedNameexpr是eval或arguments 否则,它将尝试将值解析为一个数字并将其增加1。字符串不符合抛出条件,因此在您的示例中,它被解析为一个数字,结果为NaN,然后,在将其值增加1后,它仍然返回NaN

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

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

if (!Number.isNaN(s)) {
   s++
}
如果要验证字符串是否为数字,也可以使用isNaN


此外,正如其他答案所说,您可以使用类型检查选项(如Typescript)或静态类型检查程序(如flow.js)在编译时防止这些错误。

正如一些人提到的,JavaScript将允许您这样做,因为它的类型很弱。这是一篇关于它的好帖子-

你如何预防它?有一些工具可以与编辑器一起使用,比如扩展,它们可以在处理代码时突出显示这些问题。TypeScript是JavaScript的超集,是另一个很好的选择,它可以为您提供一种更强大的类型方法,看起来非常像C/Java。
.

s++的用途是什么?这是导致错误的原因,因为它只对数字有意义,所以JS以其有用的方式强制s为该行上的数字。@RobinZigmond-此代码只是更大代码的一个片段,其中两个变量具有相似的名称-s和sId。我必须增加sId,但我错误地增加了s。有强迫的术语吗?我将用谷歌搜索该术语以了解更多信息。强制是JS自动将变量转换为其他类型的通用术语。@RobinZigmond-我搜索了强制javascript。它的正式名称是类型强制。@masterjoe2 Javascript是一种弱类型语言,这意味着许多奇怪的操作都是有效的,不会直接导致错误。例如,您可以对字符串和数字求和,但不能进行减法。