2

テストした後instasnceof、引数が配列またはオブジェクトリテラルの場合はtrueが返されることがわかりました。

function test(options){
  if(options instanceof Object){alert('yes')}//this will alert for both arrays and object literals
}
test({x:11})// alerts
test([11])// alerts as well but I do not want it to

引数「options」がオブジェクトリテラルであるかどうかをテストする方法はありますか?

PSユーザーが構成オプションにアクセスできるようにするモジュールを作成していますが、引数がオブジェクトリテラルのみであるかどうかをテストしたいですか?

4

3 に答える 3

11

引数「options」がオブジェクトリテラルであるかどうかをテストする方法はありますか?

いいえ、意味がないからです。それがオブジェクトであるかどうかをテストできますが、それがどのように作成されたか(関数の呼び出しでリテラルを介して、他の場所でリテラルを介してnew Object、JSON文字列を逆シリアル化することによって...)は維持される情報ではありません。

instasnceofをテストした後、引数が配列またはオブジェクトリテラルの場合はtrueが返されることがわかりました

正しい。JavaScriptの配列はオブジェクトです(実際には配列ではありません)。

オブジェクトが単純な古いオブジェクトであることをテストする場合は、次のように実行できます。

if (Object.prototype.toString.call(options) === "[object Object]") {
    // It's a plain object
}

しかし、それを行う理由は本当にありません。それはあなたの問題ではありません。それらが渡すものが期待するプロパティを持っている限り、オブジェクトをさらに制限しようとしないでください。

psユーザーが構成オプションを渡すことができるモジュールを作成していて、引数がオブジェクトリテラルのみであることを確認するためにテストしたいと思います。

なんで?ユーザーがその場でリテラルとして宣言されていないオブジェクトを使用したい場合、なぜ気にするのでしょうか。別のコンストラクター関数を介して作成したオブジェクト(たとえば、単なるオブジェクトではなく)を使用したい場合も、なぜ気にするのでしょうか。

于 2012-05-24T16:35:18.077 に答える
2
function isPlainObject(o) {
     return Object(o) === o && Object.getPrototypeOf(o) === Object.prototype;
}

ただし、リテラルとして宣言されているか、他の方法でインスタンス化されているかをテストすることはできません。コンストラクタがなくても、プレーンオブジェクトoであるかどうかをテストできます。Object

于 2012-05-24T16:35:24.360 に答える
1

配列を禁止しようとしている場合は、次のようにすることができます。

var isObject = options instanceof Object;
var isArray = options instanceof Array;
if(isObject && !isArray)
{
    alert('yes');
}
于 2012-05-24T16:34:54.107 に答える