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