2008-12-22 87 views
35

说我有下面的代码:JavaScript的 - 确定物业是否被定义并设置为“未定义”,或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
  • 是否有任何理由? (这两个语义上是否应该相同?)

一个小的警告:do他们在内部表现方式的差异(至少在Chrome中)。

回答

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'。这是唯一的方法吗?

+1

“contains”,会发生什么?那不是ECMAScript。即使是这样,你的解决方案就是减速并使用比需要更多的资源。像在其他答案中说的那样使用“x in y”。 – some 2008-12-22 16:07:22

+0

我知道,我忘了ECMAScript有一个'in'运算符= P。 – Claudiu 2008-12-22 19:41:04

0

您可以尝试在One.x上放置一块手表,但那只会告诉您当时它未定义。

+0

不,他用原始值'undefined'来定义它。 – some 2008-12-22 11:18:16

+0

定义它将使用“删除”。 – Tomalak 2008-12-22 11:27:13

1

像这样的东西?

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

或..

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

这两个变种会起到相同的作用,我认为 – Claudiu 2008-12-22 10:47:05

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 
+0

这是可能的。 – Claudiu 2008-12-22 10:49:01

8

object.hasOwnProperty(名称)只返回了在同一个对象的对象真的,假的一切,包括原型中的属性。

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 

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

正确的做法是使用之类的roborg表示。

更新: undefined是原始值,参见ECMAScript Language Specification第4.3.2节和4.3.9节。

4

Ach,其中一个用于反模式线程。

undefined不是关键字。

var foo = undefined;你分配给它,你还没有定义,因此你会得到价值"undefined"符号undefined的价值分配写入。如果分配它,你会产生完全相同的结果UnDeFiNeDNotFineAtAll_qwertyuiop

为什么这太可怕了?除了导致对错误理解的事实之外,如果您碰巧载入图书馆或雇用开发人员,他们会写入var undefined = true;