0

问题是,没有可以编写的“标准函数”来检测是否“设置”了某些东西。例如,如果它确实是一个空对象,那么你就不想使用它;但是,如果它有键,那么您确实想使用它 - 但是,如果您尝试查看它是否有键而它没有,即使“typeof”返回“object”,使用“Object.keys()”抛出一个错误,说它不是一个对象。所以,我们似乎在这里有一个catch 22(o_O)......有没有更好的方法来查看一个对象是否真的为空,或者它是否有键,而不会引发错误?

我一直在使用一个基本函数来查看一个对象是否甚至是 SET,然后再查看它是否具有有效的 VALUE,但是,我遇到了失败的情况。在 indexeddb 场景和“this.items”场景中,即使它们的“类型”是“对象”,并且它们的“对象”有键,它们的计算结果都为“null”;但是如果我在没有键时评估键,它将引发另一个错误,因为此时对象 TRULY 为空(没有键/属性)。使用“对象”函数,例如“Object.keys”或“hasOwnProperty”等会引发“这不是对象”错误。

本质上,我需要做的是能够正确确定:“这个对象是否被设置为任何东西,或者它是一个真正的空对象?”。在这种情况下,这意味着“它是否具有任何属性,即使它们各自的值为‘null’?” - 我只需要知道它们确实有属性,而不使用“try catch”块,也没有使用对象函数(因为如果对象真的为空,它们就会失败)。

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”,这实际上是“正确的”,但是,如果不调用“对象”函数(eh:“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”,它是 0,而不是“Object.keys($o.property).length”,它是 1 - 它具有 VALID 和 USABLE 值。

于 2013-02-08T19:13:48.970 回答
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 回答
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 回答