substr()
完美处理负指数,但substring()
只接受非负指数。
是否有理由不使用substr
支持substring
?通过将索引空间视为循环组,负指数的使用在很多情况下非常有用。为什么MDN会将substr
表示为“已弃用”?
答案 0 :(得分:4)
substring是指定开始和结束索引的时间。 substr是指定起始偏移量和长度的时间。他们做不同的事情,并有不同的用例。
编辑: 为了更好地回答确切的问题 为什么substring不处理负指数?
substring
指定字符串中字符的起始和结束索引。 substr
处理起始偏移量和长度。我认为substring
不允许负索引是有道理的,因为实际上不存在负索引(字符串中的字符从0到n索引,“负索引”会超出界限)。由于substr
正在处理偏移与索引,我觉得术语偏移足够松散以允许负偏移,这当然意味着向后计数从字符串的末尾而不是从头开始。这可能只是语义,但它是我如何理解它。
为什么substr
已被弃用?
我认为实际上不已弃用。
revision history的substr MDN表示根据此博文发布了弃用通知:
2016年8月16日上午12:00:34 hexalys 根据{{3}}
添加弃用的提及
其中声明不推荐使用HTML字符串方法(它们应该是!)。这些是将字符串包装在HTML标记中的方法,即"abc".sub()
将返回<sub>abc</sub>
。博客文章列出了所有HTML字符串方法,并且imho错误地将subtr
包含为HTML字符串方法(事实并非如此)。
所以这看起来像是对我的误解。
(摘录如下,我强调的重点)
亮点:
臭名昭着的“字符串HTML方法”:String.prototype.anchor(name),String.prototype.big(),String.prototype.blink(), String.prototype.bold(),String.prototype.fixed(), String.prototype.fontcolor(color),String.prototype.fontsize(size), String.prototype.italics(),String.prototype.link(href), String.prototype.small(),String.prototype.strike(), String.prototype.sub(), String.prototype.substr(start,length),以及 String.prototype.sup()。浏览器略微实现了这些 以各种方式不同,在一种情况下导致安全 问题(而不只是在理论上!)。这是一场艰苦的战斗,但是 最终浏览器和ECMAScript规范匹配的行为 JavaScript标准定义了。
答案 1 :(得分:3)
substr
特别有用。
例如,如果您想知道字符串是否以单个字符结尾:
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
更方便。
答案 2 :(得分:3)
JS中有三个函数或多或少相同:
substr
slice
substring
我猜大多数人都使用后者,因为它与数组匹配。前两个是或多或少的历史遗留物(substr
在JS1中,然后substr
有两种不同的风格等。)
为什么MDN表示substr被“弃用”?
this post按Mathias添加了通知,其中sudo adduser john
列在“字符串HTML方法”(?)下。弃用的原因是它属于Annex B,其中包含:
本附件描述了基于Web浏览器的ECMAScript实现的各种遗留功能和其他特性。本附录中指定的所有语言功能和行为都具有一个或多个不良特征,并且在没有遗留用法的情况下将从本规范中删除。