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

ElJ*_*ste 7 javascript standards ecma

这是mentionned在ECMAScript标准在这里说:

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

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

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

小智 21

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

  • `.slice` 支持负开始(和结束)位置。 (9认同)
  • @NicoleAshley,现在我们有两个函数做几乎相同的事情(“切片”和“子字符串”),但不完全一样。是啊!如果没人关心的话我会继续使用“substr”。另外,这个“答案”应该是一条评论,因为它没有回答问题^^' (6认同)

ksh*_*ine 9

我已将此声明添加为顶级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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然我支持你对它进行猴子修补的想法,但我不建议你在没有polyfill的情况下使用你的方法,以防突然不再支持“.substr”。简单地“隐藏”弃用通知是鲁莽的。 (8认同)

T.J*_*der 8

因为它从未成为标准化语言的一部分.它根本不在ECMAScript 1或2规范中,只出现在B.2.2节("附加属性")中的ECMAScript 3中(以及类似附件中的后续版本),其中说:

ECMAScript的一些实现包括一些标准本机对象的附加属性.这个非规范性附件提出了这些属性的统一语义,而没有使这个属性或它们的语义成为本标准的一部分.

而且,substr在很大程度上是多余的substring,但第二个论点具有不同的含义,以及与slice.

从实用的角度来说,如果你找到一个没有提供它的主流JavaScript引擎,我会感到惊讶.

  • 方向的不确定性是委员会设计的一个主要问题。C 的情况尤其糟糕,目前尚不清楚该标准是否试图定义一种核心语言,可以在其上构建最适合各种个人目的的方言,或者定义一种包含服务大多数人所需的一切的语言用例(恕我直言,C89 基本原理的作者非常清楚地表明他们的意图是前者,但编译器编写者将 C 标准视为后者)。恕我直言,编写语言标准的人需要认识到当前的做法...... (4认同)
  • 在我的大部分工作中,我更喜欢 substr() 而不是 substring() - 如果将其编入语言中,那就太好了。如果 MDN 指出它在技术上不标准或已弃用,那就太好了。已弃用完全表明它在某些时候“是”有效的。Grep 在我的代码中指出只有 9,036 个对 `.substr(` 的引用......是的,这需要对 Cow Path 进行编码。 (4认同)
  • @supercat - 它并没有被弃用,它从一开始就不是标准库的一部分。至于是否直接将其放入标准库会更好,嗯,这是针对 TC39 的判断。由于TC39对标准库没有政策(例如,应该大还是小)...(我问过一次。答案是:他们不能就一个方向达成一致,所以这都是个案分析和[外部] 风向吹向以及是否是星期二。:-) ) (3认同)
  • 有什么理由不推荐使用它而不是将其添加到标准语言中吗?如果知道新字符串的期望长度,则foo.substr(startPos,newLen);看起来比foo.substring(startPos,startPos + newLen);更干净。“ startPos”尤其如此,这是一个更复杂的表达式。 (2认同)