4

JavaScript String 对象有两个子字符串函数 substring 和 substr。

  • substring接受两个参数beginIndexendIndex

  • substr也有两个参数beginIndexlength

转换这两个变体之间的任何范围都很简单,但我想知道这两个变体通常如何使用(在日常编程中)是否有任何意义。我倾向于使用索引/长度变体,但我没有很好的解释为什么。

我想这取决于你做什么样的编程,但如果你对这件事有强烈的意见,我想听听。

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

更新:

这本身不是一个 JavaScript 问题(JavaScript 恰好实现了这两种变体 [我认为这很愚蠢]),但是相对与绝对范围有什么实际含义?我正在寻找可靠的论据来解释为什么我们更喜欢其中一个。为了扩大辩论范围,您希望如何设计数据结构以用于任何一种方法?

4

4 回答 4

3

我更喜欢startIndex,endIndex变体 ( substring) 因为String.substring()在 Java 中的操作方式相同,而且我觉得在我最常使用的任何语言中(如果可能)坚持相同的概念会让我更有效率。

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

为了回答您关于 JavaScript 两者兼有的评论,它看起来像是substr()在之后添加到浏览器中substring()参考- 似乎虽然它substr()是 JavaScript 1.0 的一部分,但大多数浏览器供应商直到后来才实现它)。这向我表明,即使是早期语言的实现者也认识到功能的重复。我建议substring()首先尝试利用Java Script 商标。无论如何,他们似乎认识到了ECMA-262中的这种重复,并采取了一些小步骤来删除它:

  • substring():ECMA 版本:ECMA-262
  • substr():ECMA 版本:无,尽管 ECMA-262 版。3 有一个非规范部分,建议 substr 的统一语义

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

String s1 = "The quick brown fox jumps over the lazy dog";
String s2 = s1.substring(20, -13); // "jumps over"
于 2009-08-14T17:27:09.210 回答
2

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

前者,当你知道多少时,后者当你知道在哪里时。

我假设 substring 是根据 substr 实现的:

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

或子字符串方面的 substr:

substr( b, l)  {
  return substring( b, b + l );
}
于 2009-08-14T08:22:06.153 回答
1

我稍微更喜欢 startIndex、endIndex 变体,从那时起我可以得到字符串的最后一位:

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

代替:

string foo = bar.substring(5, foo.length() - 5);
于 2009-08-14T08:18:58.250 回答
0

这取决于具体情况,但我更经常发现我确切地知道要取出多少个字符,并且更喜欢以长度参数化开头。但是我可以很容易地看到一个案例,我在一个长字符串中搜索了两个标记,现在有了它们的索引,而使用任何一种情况都是微不足道的数学运算,在这种情况下,我可能更喜欢开始和结束索引。

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

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

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

于 2009-12-15T23:08:52.180 回答