子串参数最佳实践

时间:2009-08-14 08:15:22

标签: javascript substring

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

  • substring有两个参数beginIndexendIndex

  • substr还有两个参数beginIndexlength

转换两个变体之间的任何范围都是微不足道的,但我想知道两者通常如何使用(在日常编程中)是否有任何意义。我倾向于支持索引/长度变体,但我没有很好的解释原因。

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

(绝对,相对)范围何时更适合(绝对,绝对),反之亦然?

更新

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

4 个答案:

答案 0 :(得分:3)

我更喜欢startIndexendIndex变体(substring),因为String.substring()在Java中的运行方式相同,我觉得它更有效率地坚持使用我经常使用的任何语言的概念(如果可能的话)。

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

要回答有关同时具有这两者的JavaScript的评论,看起来substr() substring()之后substr()被添加到浏览器中 - 虽然substring()似乎是JavaScript的一部分1.0,大多数浏览器供应商直到稍后才实现它。这告诉我,即使是早期语言的实施者也认识到功能的重复。我建议substring()首先尝试利用 Java 脚本商标。无论如何,似乎他们在reference中认识到这种重复,并采取了一些小步骤来删除它:

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

我个人不介意String s1 = "The quick brown fox jumps over the lazy dog"; String s2 = s1.substring(20, -13); // "jumps over" ,其中第二个参数可以是负数,这将返回第一个参数和字符串长度减去第二个参数之间的字符。当然,您已经可以更明确地实现这一点,我想这个设计会让许多开发人员感到困惑:

{{1}}

答案 1 :(得分:2)

  

(绝对,相对)范围何时更适合(绝对,绝对),反之亦然?

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

我假设substring是以substr:

的形式实现的
substring( b, e ) {
  return substr( b, e - b );
}
根据子字符串

或substr:

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

答案 2 :(得分:1)

我稍微喜欢startIndex,endIndex变体,从那以后得到我能做的字符串的最后一位:

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

而不是:

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

答案 3 :(得分:0)

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

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

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

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

相关问题