ウェブサイト検索

javascript - なぜ String.prototype.substr() は非推奨になったのですか?


ここで ECMAScript 標準に次のように記載されています:

これらの機能は、コアのECMAScript言語の一部とは見なされません。プログラマーは、新しいECMAScriptコードを書く際に、これらの機能や挙動を使用したり、その存在を前提としたりすべきではありません。ECMAScriptの実装は、これらの機能を実装することは推奨されません。ただし、実装がウェブブラウザの一部である場合、あるいはウェブブラウザが扱う同じレガシーなECMAScriptコードを実行するために必要である場合は除きます。

MDNにも赤い警告があります: String.prototype.substr() MDN ドキュメント

誰か、なぜ(ECMAScript標準が言うように)プログラマーが String.prototype.substr を使ったり、その存在を前提とすべきでないのか知っていますか?

回答 #1

標準化された言語の一部になったことがないからです。ECMAScript 1や2の仕様にはまったく含まれておらず、ECMAScript 3の付録B.2(「追加のプロパティ」)にのみ登場します(およびその後の版も今日まで同様の付録に掲載されています[執筆時点でのES2022ドラフト])、そこには次のように記載されています:¹

ECMAScriptのいくつかの実装では、標準のネイティブオブジェクトのいくつかに追加のプロパティが含まれています。この非規範的な付録は、そのようなプロパティの意味論を標準の一部とせずに、統一された意味論を提案します。

さらに、substr は substring や slice とほとんど冗長ですが、2番目の引数は異なる意味を持ちます。

実際的な観点から言えば、これを提供していない完全な主流のJavaScriptエンジンを見つけたら驚くでしょう。しかし、組み込み用や制約のある環境を対象としたJavaScriptエンジンがこれを提供していない場合は驚かないでしょう。


¹ その文言は最近、次のように変更されました:

この付属書で定義されているECMAScript言語の構文および意味論は、ECMAScriptホストがウェブブラウザである場合に必要とされます。ECMAScriptホストがウェブブラウザでない場合、この付属書の内容は規範的ですが任意です。


注:この付属書は、ウェブブラウザのECMAScriptホストにおけるさまざまなレガシー機能およびその他の特性について説明します。この付属書で指定されているすべての言語機能および動作には、望ましくない特性が1つ以上あり、レガシーな使用がなければ本仕様から削除されるでしょう。しかし、これらの機能が多数の既存のウェブページで使用されているため、ウェブブラウザはそれらを引き続きサポートする必要があります。この付属書の仕様は、これらのレガシー機能の相互運用可能な実装に関する要件を定義します。

これらの機能は、コアのECMAScript言語の一部とは見なされません。プログラマーは、新しいECMAScriptコードを書く際に、これらの機能や挙動を使用したり、その存在を前提としたりすべきではありません。ECMAScriptの実装は、これらの機能を実装することは推奨されません。ただし、実装がウェブブラウザの一部である場合、またはウェブブラウザが遭遇する同じレガシーなECMAScriptコードを実行するために必要である場合は除きます。


回答 #2

substr の主な利点は、開始位置を負の値で指定できることです! substring で同じことをするのはひどいです。

関連記事