51

这里的 ECMAScript 标准中提到:

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

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

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

4

2 回答 2

49

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

ECMAScript 的一些实现包含一些标准本机对象的附加属性。该非规范性附件建议此类属性的统一语义,而不使属性或其语义成为本标准的一部分。

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

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


¹ 该措辞最近更改为:

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


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

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


于 2018-10-04T06:27:53.410 回答
0

我已将此声明添加为顶级ambient.d.ts文件中的环境声明:

interface String {
  /**
   * Gets a substring beginning at the specified location and having the specified length.
   * (deprecation removed)
   * @param from The starting position of the desired substring. The index of the first character in the string is zero.
   * @param length The number of characters to include in the returned substring.
   */
  substr(from: number, length?: number): string;
}

我觉得substr非常有用。指定字符串的长度而不是字符串的结束索引通常要简洁得多。如果substr真的从浏览器或 Node.js JavaScript 支持中删除,我怀疑我们中的许多人substr无论如何都会简单地通过猴子补丁恢复存在。

于 2022-02-13T19:46:19.907 回答