2008-12-22 32 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;