JavaScript中charAt方法的替代方案

3

以下是需要翻译的内容:

编写一个名为charAt的函数,该函数接受一个字符串和一个索引(数字),并返回该索引处的字符。

如果数字大于字符串长度,则函数应返回空字符串。

关键是您不能使用内置的charAt方法。

除未包括if语句外,我的理解正确吗?那正确的实现应该是什么?(刚学JS,先谢罪)。

function charAt(string, index) {
  var charAt = string[index];
  return charAt;
}

它是否满足要求? - Dave Newton
你试过运行代码了吗?那不是会回答你的第一个问题吗?至于正确的方法,有不同的变量和思想流派认为什么才是正确的。有些代码不能产生正确的输出,有些代码在空间/时间复杂度上不够优化,有些代码不够易读。你想要实现什么目标呢? - Matthew Moran
仅仅使用[index]而不是.charAt(index)似乎太简单了,以至于不可能是正确答案,但谁知道呢?只有编写该任务的人才知道这是否是他们可以接受的解决方案。 - JLRishe
你可以参考这个链接 link,它可能对你有所帮助。 - Shusang
1个回答

7

除了一个问题以外,看起来大部分都很好——存在一些奇怪的字符(由代理对组成的字符,有时称为多字节字符),它们占用了字符串中不止一个索引位置。例如 。如果字符串包含这样的字符,则将其计为字符串中的两个索引位置:

function charAt(string, index) {
  var charAt = string[index];
  return charAt;
}
console.log(
  charAt('foobar', 3), // Broken character, wrong
  charAt('foobar', 4), // Broken character, wrong
  charAt('foobar', 5), // Wrong character (should be "a", not "b")
  charAt('foobar', 6), // Wrong character (should be "r", not "a")
);

如果这对你的情况可能会造成问题,可以考虑使用Array.from先将其转换为数组:

function charAt(string, index) {
  var charAt = Array.from(string)[index];
  return charAt;
}
console.log(
  charAt('foobar', 3),
  charAt('foobar', 4),
  charAt('foobar', 5),
  charAt('foobar', 6),
);

当索引不存在时,可以返回空字符串:

function charAt(string, index) {
  return Array.from(string)[index] || '';
}
console.log(
  charAt('foobar', 3),
  charAt('foobar', 4),
  charAt('foobar', 5),
  charAt('foobar', 6),
);
console.log(charAt('foobar', 123));


1
“某些奇怪的字符” - 您是指在 U+10000U+10FFFF 之间的所有字符吗? - chharvey
点赞,值得一提的是为了吸引更多关注此主题的人,应该在某处提到“多字节”字符集。 - axelduch
是的,实际上有很多这样的情况,但(至少在我的经验中)它们很少遇到。 - CertainPerformance
整个表情符号表都在里面,所以它越来越常用(如果我没记错的话,它们在用户定义块中?我忘了,需要再读一遍)。 - ASDFGerte
这取决于你来自哪里,很多语言主要只使用该字符集中的字符(例如任何基于西里尔字母的语言)。 - axelduch
@CertainPerformance 你说得对。我们遇到的大多数字符都在U+0和U+7F之间,而且很多字符在U+0和U+FFFF之间。根据UTF-16编码算法,U+10000到U+10FFFF之间的字符(正好是U+0到U+FFFF之间的字符数量的16倍)占用字符串中的2个索引。 - chharvey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接