0

問題は、何かが「設定されている」かどうかを検出するために作成できる「標準関数」がないことです。たとえば、それが本当に null オブジェクトである場合は、それを操作したくありません。ただし、キーがある場合は、それを操作したいのですが、「Object.keys()」を使用して、「typeof」が「オブジェクト」を返しても、キーがないときにキーがあるかどうかを確認しようとすると、オブジェクトではないことを示すエラーをスローします。それで、ここでキャッチ22があるようです(o_O)...オブジェクトが本当にnullかどうか、またはキーがあるかどうかをエラーをスローせずに確認するより良い方法はありますか?

私は基本的な関数を使用して、オブジェクトが有効な値を持つかどうかを確認する前にSETであるかどうかを確認しましたが、これが失敗するシナリオに遭遇しています。indexeddb シナリオと「this.items」シナリオでは、「型」が「オブジェクト」であり、「オブジェクト」がキーを持っていても、どちらも「null」と評価されます。しかし、キーがないときにキーを評価すると、別のエラーがスローされます。これは、この時点でオブジェクト TRULY が null (キー/プロパティなし) であるためです。「Object.keys」や「hasOwnProperty」などの「オブジェクト」関数を使用すると、「これはオブジェクトではありません」というエラーがスローされます。

基本的に、私がしなければならないことは、「このオブジェクトは何かに設定されているのか、それとも本当に空のオブジェクトなのか」を適切に判断できるようにすることです。この場合、これは「それぞれの値が 'null' であっても、プロパティはありますか?」という意味です。- 「try catch」ブロックを使用せず、オブジェクト関数を使用せずに、プロパティがあることを知る必要があります (オブジェクトが本当に null の場合に失敗するため)。

4

4 に答える 4

1

問題を解き、それを複製する能力を失った後、私は再び問題を発見しました。私は睡眠不足ではなかったので、それを解決しました。

var $o = {};
// THIS is the CAUSE of the problem
$o.property = [];
$key = '1234asdf';
$value = 'this is a value for 1234asdf';
$o.property[$key] = $value;
alert(Array.isArray($o.property));

しかし、さまざまなライブラリ関数は適切な識別に依存するため、すべての意図と目的のために、これは配列ではなく「オブジェクト」として渡す必要があります。「ecma」によると、それは実際には「正しい」ことを知っていますが、「オブジェクト」関数(えー:「Object.keys」)を呼び出して生成されるかどうかを確認しない限り、それを適切に検出できませんでした。致命的なエラーです。これは、それが本当に「配列」であり、「キーを持つオブジェクトに変換された配列」ではないことを意味します。

var $o = {};
// THIS is the SOLUTION to the problem
$o.property = {};
$key = '1234asdf';
$value = 'this is a value for 1234asdf';
$o.property[$key] = $value;
alert(Array.isArray($o.property));

したがって、答えは次のとおりです。可能な限り、正しいコンストラクターを使用するようにしてください。ある時点で、それが問題になるからです。jsfiddle: http://jsfiddle.net/vector_thorn/RqhBm/1/

ああ、これは、オブジェクト「$o.property」が空、null、または false として検出されたため、「無効」と評価されていた理由でもあります。== false になりますが、=== false ではありません。これは、「空の配列」が役に立たないためです。配列として検出されているため、関数は「$o.property.length」を評価しています。これは、1 である "Object.keys($o.property).length" の代わりに 0 であり、VALID および USABLE 値を持っています。

于 2013-02-08T19:13:48.970 に答える
0

カーソル オブジェクトを受け取った場合、IndexedDB API はキーがオブジェクト ストアに存在することを確認します。レコードはまだかもしれませんundefined

req = objectStore.openCursor();
req.onsuccess = function(e) {
  var cursor = e.event.target; 
  if (cursor) {
    var record = cursor.value; // record may still be undefined
    cursor.continue();
  } else {
    console.log('no more record');
  }
}

あなたが言及する問題は、存在しないキーとレコード値getを区別できないメソッドを使用する場合にのみ発生する可能性があります。スペックundefinedに明記されています(注を参照) 。

于 2013-01-29T02:12:15.067 に答える
0

のようなものを使用するのはどうですかtypeof foo === 'undefined'

于 2013-01-28T19:53:34.953 に答える
0

変数/フィールド/その他が実際のオブジェクト ( nullundefined、またはプリミティブではなく) であるかどうかを判断するには、次のような関数を記述できます。

function isActualObject(x) {
    return x && // not null, undefined, false, 0, or ''
           typeof x !== 'number' && // not a numeric primitive
           typeof x !== 'boolean' && // not true
           typeof x !== 'string'; // not a string primitive
}

これは、オブジェクトがキーを持っているかどうかを検出するのではなく、キーを持っている可能性があるかどうかのみを検出することに注意してください。キーがあるかどうかを検出するために、追加のチェックを追加できます。

function hasActualKeys(x) {
    return isActualObject(x) && Object.keys(x).length > 0;
}
于 2013-01-28T19:59:09.440 に答える