问题是,没有“标准函数”你可以编写来检测某些东西是否“已设置”。例如,如果它确实是一个空对象,那么,你不想使用它;但是,如果它有键,那么你想要使用它 - 但是,如果你试图看它是否有键,当它没有时,即使“typeof”返回“object”,使用“Object.keys()”抛出一个错误,说它不是一个对象。所以,我们似乎在这里有一个catch 22(o_O)...有没有更好的方法来查看一个对象是否真的为null,或者它是否有键,而不会抛出错误?
我一直在使用一个基本函数来查看一个对象是否是SET,然后再查看它是否具有有效的VALUE,但是,我正在遇到失败的情况。在indexeddb场景和“this.items”场景中,两者都评估为“null”,即使它们的“类型”是“对象”,它们的“对象”也有关键;但是如果我在没有的情况下评估密钥,它将抛出另一个错误,因为此时对象TRULY为空(没有键/属性)。使用“object”函数,例如“Object.keys”或“hasOwnProperty”等会抛出“this is not object”错误。
基本上,我需要做的是能够正确地确定:“这个对象被设置为任何东西,或者它是一个真正的EMPTY对象?”。在这种情况下,这意味着“它是否具有任何属性,即使它们各自的值为'null'???” - 我只需要知道他们有没有使用“try catch”块的属性,而不使用对象函数(因为如果对象真的为null则它们会失败)。答案 0 :(得分: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”)来看看它是否会产生一个致命的错误,意味着它是TRULY一个“数组”,而不是“一个数组转换成一个带键的对象”。
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/
哦,而且,由于被检测为空或null或false,这也是对象“$ o.property”被评估为“无效”的原因。它将== false,但不是=== false,这是因为“空数组”对我来说没用,因此,由于它被检测为数组,因此函数正在评估“$ o.property.length”,它是0,而不是“Object.keys($ o.property)。length”,它是1 - 它有一个VALID和USABLE值。
答案 1 :(得分:0)
如何使用typeof foo === 'undefined'
答案 2 :(得分:0)
要确定变量/ field / what是否是实际对象(与null
,undefined
或原语相对),您可以编写如下函数:
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;
}
答案 3 :(得分: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
记录值。 the spec (see Note)清楚地说明了这一点。