String[int]
使用を避けるために定義できる方法はありますString.CharAt(int)
か?
4 に答える
いいえ、これを行う方法はありません。
これは、別の言語からJavaScriptを使用する開発者からのよくある質問です。ここでは、特定のタイプの演算子を定義またはオーバーライドできます。
operator*
C ++では、オーバーロードすることは完全に問題外ではなくMyType
、タイプのオブジェクトを含む操作の一意のアスタリスク演算子で終わりますMyType
。この慣習の読みやすさはまだ疑問視されているかもしれませんが、それでも言語はそれを可能にします。
JavaScriptでは、これは単純に不可能です。String
角かっこを使用して文字にインデックスを付けることができるメソッドを定義することはできません。
@Lee Kowalkowskiは、ブラケットを使用してJavaScriptのメンバーにアクセスできるため、ある意味でブラケットを使用して文字にアクセスできるという良い点を示していますArray
。これには、新しいを作成しArray
、文字列の各文字をメンバーとして使用してから、にアクセスすることが含まれArray
ます。
これはおそらく紛らわしいアプローチです。JavaScriptの実装の中には、角かっこを介して文字列へのアクセスを提供するものと提供しないものがあるため、標準的な方法ではありません。オブジェクトは文字列と混同される可能性があり、JavaScriptは緩く型付けされた言語であるため、型を誤って表現するリスクがすでにあります。言語がすでに提供しているものとは異なる構文を使用する目的でのみ配列を定義することは、このタイプの混乱を促進するためのゴングにすぎません。これにより、@AndrewHedgesの質問「なぜ言語と戦うのか」が生じます。
JavaScriptには、正当な関数のオーバーロードとポリモーフィックな継承のための便利なパターンがあります。これはどちらの例でもありません。
すべてのセマンティクスはさておき、演算子はまだオーバーライドされていません。
補足:強い型チェックと古典的な継承の規則に慣れている開発者は、JavaScriptのCファミリー構文に混乱することがあります。内部では、見慣れない方法で動作しています。混乱を防ぐために、JavaScriptを明確で明確な方法で作成することをお勧めします。
注意:他の誰かが私の答えに投票する前に、私が答えた質問は次のとおりでした:
IEjavascript文字列インデクサ
string.CharAt(int)の使用を回避するためにstring [int]を定義できる方法はありますか?」
角かっこ、構文、またはベストプラクティスを具体的にオーバーライドすることについては何も、質問は「何らかの方法」を求めただけです。(そして、他の唯一の答えは「いいえ、ありません」と言った。)
ええと、実際には、次のようなものがあります。
var newArray = oldString.split('');
...配列に変換したばかりなので、角かっこ表記を使用してnewArrayにアクセスできるようになりました。
String.charAt()を使用する
これは標準で、すべてのブラウザで動作します。
IE 以外のブラウザーでは、ブラケット表記を使用して次のような文字にアクセスできます。
"TEST"[1]; // = E
これを行うと、文字列を文字の配列に変換できます。
var myString = "TEST";
var charArray = myString.split(''); // charArray[1] == E
これらは落胆するでしょう。charAt() メソッドを使用しない理由はありません。また、他のことを行うメリットもありません。
これは答えではなく、単なるトリックです (強く推奨されません!)。特に、Javascript ではやりたいことが何でもできることを示しています。それはあなたの幻想の問題です。
他のすべてのプロパティと同様に、追加のプロパティを String オブジェクトに設定できるという事実を利用できるため、String.0、String.1、... プロパティを作成できます。
String.prototype.toChars = function() {
for (var i=0; i<this.length; i++) {
this[i+""] = this.charAt(i);
}
};
これで、次を使用して単一の文字にアクセスできます。
var str = "Hello World";
str.toChars();
var i = 1+"";
var c = str[i]; // "e"
アクセスにのみ役立つことに注意してください。このような方法で文字列文字を割り当てるために定義された別の方法である必要があります。
また、文字列を変更するたびに .toChars() メソッドを呼び出す必要があることに注意してください。