为什么子字符串不处理负下标

Why substring does not handle negative indices?

本文关键字:下标 处理 字符串 为什么      更新时间:2023-09-26

substr()可以很好地处理负索引,而substring()只能接受非负索引。

是否有不使用substr而使用substring的原因?在很多情况下,通过将索引空间视为循环群,使用负索引是非常有用的。为什么substr被MDN指示为"已弃用"?

substring用于指定起始和结束索引。Substr用于指定起始偏移量和长度。它们做不同的事情,有不同的用例。

编辑:为了更好地回答
为什么子字符串不处理负索引?

substring指定字符串中字符的起始和结束索引substr处理起始偏移量和长度。对我来说,substring不允许负索引是有意义的,因为确实没有负索引这样的东西(字符串中的字符从0索引到n,一个"负索引");会出界)。由于substr处理的是偏移量索引,我觉得术语偏移量足够宽松,可以允许负偏移量,这当然意味着从字符串的末尾向后计数,而不是从开始向前计数。这可能只是语义,但这就是我如何理解它的方式。

为什么不支持substr ?

我认为实际上不是不赞成。

substr MDN的修订历史表明,弃用通知是基于这篇博客文章提出的:

Aug 16, 2016, 12:00:34 AMhexalys每https://blog.whatwg.org/javascript

添加不推荐的提及

声明HTML字符串方法已弃用(它们应该弃用!)这些是将字符串包装在HTML标签中的方法,例如,"abc".sub()将返回<sub>abc</sub>。这篇博文列出了所有的HTML字符串方法,而且我认为,错误地将subtr包含为HTML字符串方法(它不是)。

所以在我看来这是一个误会。

(节选如下,重点由我加上)

亮点:

臭名昭著的"字符串HTML方法":string .prototype.anchor(name), string .prototype.big(), string .prototype.blink(),String.prototype.fixed String.prototype.bold (), (),String.prototype.fontcolor(颜色),String.prototype.fontsize(大小),String.prototype.italics (), String.prototype.link (href),String.prototype.strike String.prototype.small (), (),String.prototype.sub (), String.prototype。substr(start, length)String.prototype.sup()。浏览器稍微实现了这些不同的方式,在一种情况下导致证券问题(不只是理论上的!)这是一场艰苦的战斗,但是最终浏览器和ECMAScript规范匹配了这个行为

https://blog.whatwg.org/javascript

substr在您只对长度未知的字符串的最后N个字符感兴趣时特别有用。

例如,如果您想知道一个字符串是否以单个字符结束:

function endsWith(str, character) {
  return str.substr(-1) === character;
}
endsWith('my sentence.', '.'); // => true
endsWith('my other sentence', '.'); // => false

使用substring实现相同的函数需要先计算字符串的长度。

function endsWith(str, character) {
  var length = str.length;
  return str.substring(length - 1, length) === character;
}

两个函数都可以得到相同的结果,但是使用substr更方便。

JS中有三个函数或多或少做同样的事情:

  • substring
  • substr
  • slice

我想大多数人都使用后者,因为它匹配它的数组对应。前两个或多或少是历史遗留(substring出现在JS1中,然后substr出现在两个不同的版本中等等)。

为什么substr被MDN指示为"deprecated" ?

根据Mathias的帖子添加了通知,其中substr列在"字符串HTML方法"(?)下。弃用的原因是它属于附件B,它说:

这个附件描述了基于ECMAScript实现的web浏览器的各种遗留特性和其他特性。本附件中指定的所有语言特性和行为都有一个或多个不需要的特征,在没有遗留使用的情况下,将从本规范中删除。