3

さまざまな JavaScript アプリケーションで、私が作成した isBlank() という小さな関数をよく使用します。

isBlank = function(text) {
    while(text[0] == ' ') text = text.substr(1);
    return (text === '');
}

この関数は、入力文字列の先頭からすべてのスペースを削除するだけで、結果が空白かどうかに応じて true または false を返します。そこで、次のようにこの関数を String プロトタイプにしようとしました。

String.prototype.isBlank = function() {
    while(this[0] == ' ') this = this.substr(1);
    return (this === '');       
}

ただし、プロトタイプ バージョンでは、次のようなことを試みると「無効な左手の代入」エラーが発生します。

"      ".isBlank();

ReferenceError: Invalid left-hand side in assignment

この問題は、while ループで「this」オブジェクトを再割り当てしているという事実に起因していると思いますが、まだ Java スクリプトを学習しているので、誰かがなぜこのプロトタイプが機能しないのかについて、より詳細な説明を提供できるかどうか疑問に思っていました。動作しません。私はこの質問の理論面にもっと興味があり、 isBlank() 関数を自分が望むことを行う文字列プロトタイプにする方法にはあまり興味がありません。

ありがとう!

4

3 に答える 3

3

これを再割り当てすることはできません。それがエラーが言っていることです。

ECMAScript 仕様

10.1.7 これ

すべてのアクティブな実行コンテキストに関連付けられた this 値があります。this の値は、呼び出し元と実行されるコードのタイプによって異なり、制御が実行コンテキストに入ったときに決定されます。実行コンテキストに関連付けられた this 値は不変です。

これを説明する別のリンク

于 2012-10-02T17:09:18.527 に答える
2

thisキーワードに割り当てることはできません。割り当てたい場合は、次のように追加の変数を作成する必要があります。

String.prototype.isBlank = function() {
    var text = this;
    while(text[0] == ' ') text = text.substr(1);
    return (text === '');       
}

ところで: すべてのブラウザーがブラケット表記による単一文字へのアクセスをサポートしているわけではありません。使用する必要があります.charAt()。また、正規表現を使用するとライブが簡単になる場合があります。

String.prototype.isBlank = function() {
    return /^ *$/.test(this);
}
于 2012-10-02T17:09:53.960 に答える
1
String.prototype.isBlank = function() {
    return (this.trim() === '');       
}
于 2012-10-02T17:11:27.000 に答える