【问题标题】:Why is String.prototype.substr() deprecated?为什么 String.prototype.substr() 似乎已被弃用?
【发布时间】:2019-03-09 11:09:50
【问题描述】:

ECMAScript 标准here 中提到:

... 这些功能不被视为核心 ECMAScript 的一部分 语言。程序员不应使用或假设存在这些 编写新的 ECMAScript 代码时的特性和行为。 ECMAScript 不鼓励实现这些特性 除非实现是 Web 浏览器的一部分或需要 运行与 Web 浏览器相同的旧版 ECMAScript 代码。

MDN 上还有一个红色警告:String.prototype.substr() MDN doc

有谁知道为什么(ECMAScript 标准这么说)程序员不应该使用或假设String.prototype.substr 的存在?

【问题讨论】:

  • 我怀疑 substring 打算替换它 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - 子字符串采用比开始 + 字符数更传统的开始和结束位置。
  • 不知道,但我会避免它的一个原因是因为.substring 方法听起来非常相似,但使用结束索引 作为第二个参数,而不是 length。容易混淆,可能,最好只使用一种方法,如果可能的话
  • @eddiewould - “替换”在这里是一个奇怪的术语,因为substring 自从有标准化语言以来就一直使用标准化语言,但substr 从来没有。 :-)

标签: javascript standards ecma


【解决方案1】:

因为它从来都不是标准化语言的一部分。它根本不在 ECMAScript 1 或 2 规范中,只出现在第 B.2 节(“附加属性”)的 ECMAScript 3 中(以及类似附件中的后续版本直到 today [撰写本文时的 ES2022 草案) ]),其中说:¹

ECMAScript 的一些实现包含一些标准原生对象的附加属性。此非规范性附件建议此类属性的统一语义,但未将属性或其语义作为本标准的一部分。

此外,substrsubstringslice 在很大程度上是多余的,但第二个参数的含义不同。

从实用的角度来说,如果你发现一个完整的主流 JavaScript 引擎没有提供它,我会感到惊讶。但如果针对嵌入式/受限环境的 JavaScript 引擎使用没有提供它,我不会感到惊讶。


¹该措辞最近更改为:

当 ECMAScript 主机是 Web 浏览器时,需要本附件中定义的 ECMAScript 语言语法和语义。如果 ECMAScript 主机不是 Web 浏览器,则本附件的内容是规范性的,但可选。


注意 本附件描述了 Web 浏览器 ECMAScript 主机的各种遗留特性和其他特性。本附件中规定的所有语言特性和行为都有一个或多个不受欢迎的特性,如果没有遗留使用,将从本规范中删除。然而,大量现有网页对这些功能的使用意味着网络浏览器必须继续支持它们。本附件中的规范定义了这些遗留功能的互操作实现的要求。

这些功能不被视为核心 ECMAScript 语言的一部分。程序员在编写新的 ECMAScript 代码时不应使用或假设存在这些特性和行为。不鼓励 ECMAScript 实现实现这些功能,除非该实现是 Web 浏览器的一部分,或者需要运行 Web 浏览器遇到的相同的旧版 ECMAScript 代码。


【讨论】:

  • 有什么理由说弃用它比将它添加到标准化语言中更好?如果知道新字符串的所需长度,foo.substr(startPos, newLen); 似乎比foo.substring(startPos, startPos+newLen); 干净; startPos 尤其如此,这是一个更复杂的表达式。
  • @supercat - 它没有被弃用,它从一开始就不是标准库的一部分。至于放在标准库中是否更好,那是对TC39的判断。由于 TC39 对标准库没有任何政策(例如,应该大还是小)......(我问过一次。答案是:他们无法就方向达成一致,所以这都是个案和 [外部] 风向何方,是否是星期二。:-))
  • 方向的不确定性是委员会设计的一个主要问题。对于 C 语言来说尤其糟糕,目前尚不清楚标准是试图定义一种核心语言,在该语言上可以构建方言,最大限度地适用于广泛的个人目的,还是定义一种语言,包括为大多数人服务所必需的一切用例(恕我直言,C89 基本原理的作者明确表示他们打算使用前者,但编译器编写者将 C 标准视为后者)。恕我直言,编写语言标准的人需要要么承认当前的做法......
  • ...或明确说明这样做的责任在于实现,或者可能认识到当前的实践是什么,并指出质量实现应该坚持实践,因为这样做是有用和实用的,但是如果根据实施者的判断,坚持特定实践的成本将超过其收益,则不需要这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
相关资源
最近更新 更多