JavaScript - 确定属性是否已定义并设置为“未定义”或未定义

时间:2008-12-22 10:36:00

标签: javascript object properties undefined

说我有以下代码:

function One() {}
One.prototype.x = undefined;

function Two() {}

var o = new One();
var t = new Two();

o.xt.x都会评估为undefinedo.hasOwnProperty('x')t.hasOwnProperty('x')都会返回false;同样适用于propertyIsEnumerable。两个问题:

  • 有没有办法告诉o.x已定义并设置为undefined
  • 有没有理由? (两者在语义上应该是等价的吗?)

一个小警告:做(对于o中的propName)循环将产生'x'作为字符串之一,而在t中执行则不会 - 因此它们在内部表示的方式存在差异(至少在铬)。

7 个答案:

答案 0 :(得分:66)

比您的方法稍微简单一点的方法是使用Javascript in operator

alert('x' in o); // true
alert('x' in t); // false

答案 1 :(得分:8)

object.hasOwnProperty(name)仅对同一对象中的对象返回true,对其他所有对象返回false,包括原型中的属性。

function x() {
  this.another=undefined;
};

x.prototype.something=1;
x.prototype.nothing=undefined;
y = new x;

y.hasOwnProperty("something"); //false
y.hasOwnProperty("nothing"); //false
y.hasOwnProperty("another"); //true

"someting" in y; //true
"another" in y; //true

另外,删除属性的唯一方法是使用delete。将其设置为undefined不要删除它。

正确的方法是使用 in ,如roborg所述。

更新: 未定义是原始值,请参阅ECMAScript Language Specification第4.3.2和4.3.9节。

答案 2 :(得分:4)

Ach,一个用于那里的反模式线程。

undefined不是关键字。

当你分配写var foo = undefined;时,你正在为它指定你尚未定义的符号undefined的值,因此你得到的值是"undefined"。如果您已为其分配UnDeFiNeDNotFineAtAll_qwertyuiop

,则会产生完全相同的结果

为什么这么可怕?除了它导致对正在发生的事情的错误理解这一事实之外,如果您碰巧加载图书馆或聘请编写var undefined = true;

的开发人员会发生什么?

答案 3 :(得分:1)

这样的东西?

function isDefined(var){
   return (typeof(window[var]) == 'undefined') ? false : true;
}

或..

function isDefined(var){
   return (window.var === undefined) ? false : true;
}

答案 4 :(得分:1)

没有。我不认为等于undefined的变量应该被识别为“已定义”。

直接将其设置为undefined只是一种删除它的懒惰方式 - 与使用delete关键字相关。我相信这只意味着垃圾收集没有对变量/属性产生影响。


[修改

关于您对hasOwnPropertypropertyIsEnumerable的评论,原型方法/属性既不是对象本身也不是可枚举的。

Object.prototype.foo = 'something';

var o = {bar: 'anything'};
o.hasOwnProperty('foo');  //=> false
o.hasOwnProperty('bar');  //=> true

Object.prototype.hasOwnProperty('foo');  //=> true

答案 5 :(得分:0)

这样做的一种方法是:

var definedProperties = [];
for (var prop in o) definedProperties.push(prop);

if (o.x === undefined && contains(prop, 'x')) {
    //x is defined, but set to undefined
}

其中contains只检查数组中的任何元素是否为'x'。这是唯一的方法吗?

答案 6 :(得分:0)

您可以尝试将手表放在One.x上,但这只会在它未定义时告诉您。