2

次のように定義された関数があるとします。

var x = function (options, callback) { /* ... */ }

optionsはプロパティfooとを持つ必要がありますbar。ここで、fooはタイプnumberでありbar、タイプはstringです。

したがって、基本的には、次のコードを使用してこれを確認できます。

var x = function (options, callback) {
  if (!options) { throw new Error('options is missing.'); }
  if (!options.foo) { throw new Error('foo is missing.'); }
  if (!options.bar) { throw new Error('bar is missing.'); }
  if (!callback) { throw new Error('callback is missing.'); }
  // ...
}

ただし、これは存在を確認するだけで、正しいタイプはまだ確認していません。もちろん、さらにチェックを追加することもできますが、これはすぐに長くなり、あまり読みにくくなります。オプションのパラメーターについて話し始めると、パラメーターのシフトなどでぐちゃぐちゃになります…</p>

これに対処する最善の方法は何ですか(確認したい場合)?

アップデート

私の質問を明確にするために:typeof演算子があることを知っており、オプションのパラメーターを処理する方法も知っています。しかし、これらのチェックはすべて手動で行う必要があり、これは - 確かに -私たちが思いつく最善の方法ではありません。

私の質問の目標は次のとおりです。既製の関数/ライブラリ/特定のタイプの5つのパラメーター、必須、オプション、および関数/ライブラリ/チェックとあなたのためにマッピングして、これがすべてワンライナーになるようにしますか?

基本的には、次のようなものです。

var x = function (options, callback) {
  verifyArgs({
    options: {
      foo: { type: 'number', mandatory: true },
      bar: { type: 'string', mandatory: true }
    },
    callback: { type: 'function', mandatory: false }
  });
  // ...
};
4

7 に答える 7

1

JavaScriptが持っているtypeof

console.log( typeof '123' ); // string
console.log( typeof 123 ); // number
console.log( typeof undefinedVar); // undefined


var x = function (options, callback) {
  if (typeof options =='undefined' { throw new Error('options is missing.'); }
  if (typeof options.foo !='number') { throw new Error('foo is missing.'); }
  if (typeof options.bar !='string') { throw new Error('bar is missing.'); }
  if (typeof callback!= 'function') { throw new Error('callback is missing.'); }
  // ...
}
于 2013-08-26T07:57:49.897 に答える
1

あなたはこのようにすることができます:

var x = function (options, callback) {
    var options = options || {};
    if (typeof options.foo != 'number') {
        throw new Error('foo need to be a number.');
    }
    if (typeof options.bar != 'string') {
        throw new Error('bar need to be a string.');
    }
    // ...
}
于 2013-08-26T07:58:49.107 に答える
0
if (myObj.hasOwnProperty(myProp)) { //to check whether mentioned property exist
    if (typeof myObj[myProp] == "string") { //or integer
        // your code to be executed!!!
    } else {
        //ERROR!!!
    }
}
于 2013-08-26T08:00:20.323 に答える
0

typeofを使用

// Numbers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // Despite being "Not-A-Number"
typeof Number(1) === 'number'; // but never use this form!

...

于 2013-08-26T07:58:54.307 に答える
0

さて、私は自分でやりたいことを行うライブラリを見つけました.ArgueJSと呼ばれています:

function range(){ 
  arguments = __({start: [Number, 0], stop: Number, step: [Number, 1]})

  for(var i = arguments.start; i < arguments.stop; i += arguments.step)
    console.log(i);
}
于 2013-08-26T08:53:23.600 に答える
0

これは正確には JavaScript の型モデルの背後にある考え方ではありませんが、私は通常for、to-check-object のデータ メンバーを反復処理するために -loop を使用しました。

/* (.startsWith has to be implementes somehow) */
for (key in my_object_with_data) {
    if (!key.startsWith(typeof my_object_with_data[key]+"_") {
        /* The member "key" has wrong type. */
    }
}

オブジェクトのメンバーは、number_aたとえば、そのタイプが数値であることを確認するために名前を付ける必要があります。

追加の検証は、値に応じて for ループ内で適用できるいくつかの一般的なチェック メソッドを介して行うことができtypeofます。

于 2013-08-26T08:20:14.040 に答える
0

タイプ、文字列、または整数をチェックするには、次の例を参照してください。

if(typeof(somevar) === 'string') alert('string');
if(typeof(somevar)==="number" && Math.round(somevar) == somevar) alert('is int');
于 2013-08-26T08:02:45.853 に答える