为什么使用javascript';带字符串的s charAt()返回第一个字母

为什么使用javascript';带字符串的s charAt()返回第一个字母,javascript,Javascript,我在我的面向对象javascript书中做了一些练习,我注意到: var a = "hello"; a.charAt('e'); // 'h' a.charAt('adfadf'); //'h' 对于字符串的charAt()方法,为什么参数中的字符串似乎被计算为整数0 编辑:我知道charAt()的用法通常是一个整数,而这个练习为charAt()提供了一个字符串,我还知道这个字符串很可能首先被强制转换成一个整数,我确实验证了它是NaN。感谢Kendall,他建议将这一缺失的信息正确地放在问题中

我在我的面向对象javascript书中做了一些练习,我注意到:

var a = "hello";
a.charAt('e'); // 'h'
a.charAt('adfadf'); //'h'
对于字符串的charAt()方法,为什么参数中的字符串似乎被计算为整数0

编辑:我知道charAt()的用法通常是一个整数,而这个练习为charAt()提供了一个字符串,我还知道这个字符串很可能首先被强制转换成一个整数,我确实验证了它是NaN。感谢Kendall,他建议将这一缺失的信息正确地放在问题中


谢谢

函数采用整数而不是字符串作为参数:

"hello".charAt(0) // 'h'
"hello".charAt(1) // 'e'
"hello".charAt(2) // 'l'
当您给它一个字符串时,它基本上会将其解释为0并返回第一个字符。

因为
Number('e')
NaN
,并且

String.prototype.charAt(位置) 当使用一个参数pos调用charAt方法时,将执行以下步骤:

  • 调用传递值作为其参数
  • 让我们作为调用的结果,将this值作为其参数
  • 让位置为(pos)
  • 设size为S中的字符数
  • 如果位置<0或位置≥ 大小,返回空字符串
  • 返回一个长度为1的字符串,其中包含来自S的一个字符,即位置处的字符,其中S中的第一个(最左侧)字符被认为位于位置0,下一个字符位于位置1,依此类推
  • 第三步是问题的关键
    ToInteger
    'e'
    'adfadf'
    都是
    0
    。为什么?再一次,是时候:

    托因特尔 抽象操作ToInteger将其参数转换为整数。此抽象操作的功能如下:

  • 让number作为调用输入参数的结果
  • 如果数字为NaN,则返回+0
  • 如果数字为+0-0+∞−∞,返回号码
  • 返回计算结果(数字)×((数字))
  • 我们需要更深入!什么是ToNumber('e'),什么是ToNumber('adfadf')?如果你感到惊讶,我又一次要这么做了,我做错了什么:

    应用于字符串类型的ToNumber 应用于字符串将以下语法应用于输入字符串。如果语法无法将字符串解释为StringNumericLiteral的扩展,则结果为NaN

    …我不会引用StringNumericLiteral的全部语法。因为
    'e'
    'adfadf'
    既不是标准整数也不是十六进制整数,所以这两个值的数目都是NaN。最后我们进行了转换:从字符串到
    NaN
    0
    ,这使我们回到
    charAt
    :位置是
    0
    ,因此
    charAt('e')
    charAt('adfadf')
    都返回S中最左边的字符

    现在,如果这些字符串是有效的strnumeric文本,例如
    '0xe'
    '0xadfadf'

    > 'hello'.charAt('0xe')
      ""
    > 'hello'.charAt('0xadfadf')
      ""
    
    对于不同的答案,情况就不同了。

    JavaScript核心方法将整数参数作为要返回的字符的索引

    'abc'.charAt(0); // => 'a'
    
    如果给它一个非整数参数,那么它可能会尝试使用
    number(arg)
    转换器或
    parseInt(arg,10)
    将参数转换为数字。如果给定的字符串不解析为整数,则这两个函数都返回
    NaN
    ,因此
    charAt()
    函数必须自动将
    NaN
    转换为零:

    Number('e'); // => NaN
    parseInt('e', 10); // => NaN
    'abc'.charAt(NaN); // => 'a'
    
    可能是直接相关的,在没有参数的情况下调用
    charAt()
    将返回第一个字符:

    'abc'.charAt(); // => 'a'
    

    因为
    charAt
    试图将你给它的东西转换成一个数字。将“adfadf”转换为一个数字将为您提供
    NaN
    ,或者不是一个数字。
    charAt
    NaN
    的定义行为是返回第一个字符。

    charAt()方法将整数作为其参数。传递字符串将计算为NaN、false和0。因此,字符串中的第一个字符将始终返回。

    e和adfadf都是字符串。当字符串作为整数值输入时,总是返回0作为值


    由于“hello”本身是一个字符数组,它将返回第一个索引“h”(从0开始)。

    Friend charAt方法如下

    string.charAt(index)
    
    i、 e.您需要将索引传递给方法

    如果你想做同样的事情,而不是像这样使用代码

    string.charAt(string.indexOf('a'));
    

    希望这能对您有所帮助。

    当您调用String.charAt(pos)时,它首先计算pos的toInteger值,由于您给了它“e”,它的计算结果为0,从而得出您的答案。有关更多信息,请参见以下内容:


    返回一个字符串,该字符串包含将此对象转换为字符串所产生的字符串中位置pos处的字符

    如果pos是整数类型的数值,则x.charAt(pos)的结果等于x.substring(pos,pos+1)的结果

    使用一个参数pos调用charAt方法时,将执行以下步骤:

  • 调用checkObjectImpressible,将此值作为其参数传递
  • 让我们作为调用ToString的结果,将此值作为 它的论点

    3。将位置设置为整数(pos)。

  • 设size为S中的字符数
  • 如果位置<0或位置≥ 大小,返回空字符串
  • 9.4托因特尔

    抽象操作ToInteger将其参数转换为整数。此抽象操作的功能如下:

  • 让号码作为呼叫的结果
    String.prototype.charAt (pos)