2

文字列をとして渡したい場合"this"、JavaScript関数内で型を正しく取得できないことに気づきました。

次に例を示します。

var str = 'string value';
if (typeof (str) == 'string') {
    alert('string outside');
}

var fn = function(s) {
    if (typeof (str) == 'string') {
        alert('string param');
    }

    if (typeof (this) == 'string') {
        alert('string this');
    }
    else {
        alert(typeof(this));
    }
};

fn.call(str, str);

"string outside"、、、の3つのメッセージが表示さ"string param"れます"object"

私の目標は、文字列である"if"というステートメントを書くことです。"this"のようなものif (typeof(this) == 'string')。これは機能しません。関数内で機能する正しいステートメントを教えてください。

4

4 に答える 4

6

プリミティブ値は、コンテキストとして使用されるときにオブジェクトとして埋め込まれます。

呼び出し関数のMDNから:

これはメソッドで見られる実際の値ではない可能性があることに注意してください。メソッドが非厳密モードコードの関数である場合、nullおよびundefinedはグローバルオブジェクトに置き換えられ、プリミティブ値はボックス化されます。

オブジェクトがString型であるかどうかを知りたい場合は、次を使用します。

var isString = Object.prototype.toString.call(str) == '[object String]';

これは、MDNがオブジェクトタイプの検出に推奨するソリューションです。

于 2013-02-22T15:43:09.857 に答える
5

ES仕様thisは、キーワードにオブジェクトを参照するように強制します。

  1. それ以外の場合、Type(thisArg)がObjectでない場合は、をに設定ThisBindingToObject(thisArg)ます。

を使用した1つの回避策Object.prototype.toString

Object.prototype.toString.call( this ) === '[object String]'

フィドル

于 2013-02-22T15:41:44.773 に答える
0

関数のパラメーターにアクセスするには、を使用しませんthis

代わりにこれを試してください:

var fn = function(s) {
    if (typeof (s) == 'string') { // "s" is your passed parameter there.
        alert('string param');
    }
};

(明らかに、渡されたパラメーターの名前もすでに指定しています)。

関数とパラメーターの基本については、このチュートリアルをご覧ください。

于 2013-02-22T15:47:03.003 に答える
0

その理由は、常にオブジェクトを指している必要typeof this"object"あるためです。thisここで、JavaScriptは暗黙的に文字列をオブジェクトに強制変換しています。代わりに必要なのは、オブジェクトのプリミティブ値です。これを試して:

var str = "string value";

if (typeof str === "string") alert("string outside");

function fn(str) {
    var type = typeof this.valueOf();
    if (typeof str === "string") alert("string param");
    if (type === "string") alert("string this");
    else alert(type);
};

fn.call(str, str);

お役に立てれば。デモを参照してください:http://jsfiddle.net/BuZuu/

于 2013-02-22T15:49:56.457 に答える