子字符串参数最佳实践

4
JavaScript String对象有两个子字符串函数:substring和substr。
- substring需要两个参数beginIndex和endIndex。 - substr也需要两个参数beginIndex和length。
在两种变体之间转换很容易,但我想知道它们通常如何使用(在日常编程中)。我倾向于使用索引/长度变体,但我没有好的解释为什么。
我猜这取决于你做什么样的编程,但如果你对此有强烈的看法,我想听听你的想法。
何时使用(绝对、相对)范围比(绝对、绝对)更合适,反之亦然?
更新:
这不是JavaScript问题本身(JavaScript恰巧实现了两种变体[我认为这很愚蠢]),但相对vs.绝对范围有什么实际影响?我正在寻找为什么我们更喜欢其中一种方法的充分论据。为了扩大讨论范围,您会如何设计您的数据结构以用于任一方法?
4个回答

3

我更喜欢使用 startIndexendIndex 变量(substring)的方式,因为在 Java 中 String.substring() 的操作方式与其他语言相同,当我使用最常见的语言时,我觉得坚持相同的概念可以提高效率。

如果我做更多的 C# 工作,我可能会更多地使用另一种变量,因为这是 C# 中 String.Substring() 的工作方式。

回答关于 JavaScript 现在具有这两个函数的问题,看起来 substr() 是在 substring() 之后加入浏览器的(参考 - 似乎尽管 substr() 是 JavaScript 1.0 的一部分,但大多数浏览器供应商直到后来才实现它)。这表明即使是早期语言的实现者也认识到了功能的重复。我认为 substring() 最初是为了利用 JavaScript 商标而出现的。不过无论如何,它们似乎在 ECMA-262 中认识到了这种重复,并采取了一些小步骤来解决它。
  • substring():ECMA版本:ECMA-262
  • substr():ECMA版本:无,尽管ECMA-262 ed.3有一个非规范性部分建议substr的统一语义

就我个人而言,我不介意 substring() 的第二个参数可以为负数,这将返回第一个参数和字符串长度减去第二个参数之间的字符。当然,您已经可以更明确地实现它,而且我想设计可能会让许多开发人员感到困惑:

String s1 = "The quick brown fox jumps over the lazy dog";
String s2 = s1.substring(20, -13); // "jumps over"

我喜欢这个想法,即操作不会抛出参数超出范围异常或类似错误。 - John Leidegren

2

什么时候使用(绝对、相对)范围比(绝对、绝对)范围更合适?反之亦然。

当你知道“多少”时,使用前者;当你知道“哪里”时,使用后者。

我假设子字符串是用substr实现的:

substring( b, e ) {
  return substr( b, e - b );
}

或者在子字符串方面使用 substr:

substr( b, l)  {
  return substring( b, b + l );
}

1

我稍微更喜欢startIndex,endIndex变量,因为这样我可以轻松获取字符串的最后一部分:

string foo = bar.substring(5, foo.length());

改为:

string foo = bar.substring(5, foo.length() - 5);

“length” 应该是一个属性而不是一个函数。 - RaYell
不是在C++中,这与问题有什么关系? - Dominic Rodger

0

这取决于具体情况,但我更常见的是知道要删除多少个字符,并且更喜欢使用长度参数化。但我也可以很容易地想象一种情况,即我已经在长字符串中搜索了两个标记,现在有了它们的索引,虽然使用任何一种情况都是微不足道的数学计算,但在这种情况下,我可能更喜欢使用起始和结束索引。

此外,从文档编写者的角度来看,具有相同基本含义的两个参数可能更容易编写和记忆。

这些函数中的每一个在给定奇怪值时都会进行整洁的保存,例如结束小于开始、负长度、负开始或长度或结束超出字符串的末尾。

对于JavaScript,最佳实践是使用substring而不是substr,因为它在更多(尽管通常是较旧的)浏览器中得到支持。如果他们选择了BasicScript,那么会有MID()和MIDDLE()函数吗?谁不喜欢BASIC语法呢?


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