为什么 String.prototype.substr() 被弃用?

问题描述 投票:0回答:4

ECMAScript 标准这里提到了:

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

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

有谁知道为什么(ECMAScript 标准这么说)程序员不应该使用或假设

String.prototype.substr
的存在?

javascript substring ecma
4个回答
118
投票

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

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

此外,

substr
substring
slice
在很大程度上是多余的,但第二个参数具有不同的含义。

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


¹ 该措辞最近已更改为:

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


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

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



19
投票

substr
的主要优点是您可以指定负的起始位置! 对
substring
做同样的事情太糟糕了。


8
投票

我已将此声明添加为顶级

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
打回原形。


0
投票

Yo lo sustitui por un slice y me funcino Perfecto,asi:

text.slice(0, 30)

© www.soinside.com 2019 - 2024. All rights reserved.