2016-07-10 159 views
2

具有代碼:設置一個屬性設置爲null

foo = {}; 
foo.bar = 78; 
foo.bar.baz = null; 

測試foo.bar.baznull

if(foo.bar.baz === null) 
    console.log("foo.bar.baz is null"); 
else 
    console.log("foo.bar.baz is NOT null"); 

結果 「foo.bar.baz不爲空」。爲什麼不是null,因爲我明確地設置了它?

+4

'foo.bar'不能同時是一個數字和一個對象 – tkausl

+0

@tkausl是正確的,而數字對象沒有baz屬性,所以你不能真的更新這個屬性。 –

回答

4

由於原語沒有屬性,並且foo.bar中的值是原語。

當您訪問(獲取或設置)基元的屬性時,JavaScript引擎會爲該基元創建一個對象,設置或檢索屬性值(如果有),然後丟棄該對象。 (這就是爲什麼(42).toString()作品;原始被提升爲由Number.prototype支持對象,toString從該對象檢索和調用this參照對象,然後該對象被扔掉。)

所以,雖然對象是在您的foo.bar.baz = null聲明中創建,其baz屬性設置爲null,該對象從未存儲在任何位置(當然不在foo.bar),因此它被丟棄。稍後,當您執行if (foo.bar.baz === null)時,會創建一個新的對象,該對象不具有該屬性,因此它的baz屬性(因爲它沒有)會得到undefined屬性。 (當然,JavaScript引擎可以優化這個過程以避免不必要的對象創建。)

我們可以在Number.prototype上創建一個返回創建對象的函數,以演示每次訪問屬性時確實會發生對象創建在原始:

// Add a `nifty` method to numbers 
 
Object.defineProperty(
 
    Number.prototype, 
 
    "nifty", 
 
    { 
 
    value: function() { 
 
     console.log("Number#nifty called"); 
 
     return this; 
 
    } 
 
    } 
 
); 
 

 
var n = 42;     // A primitive number 
 
console.log(typeof n);  // "number" 
 
var obj1 = n.nifty();  // Creates an object, which we keep 
 
console.log(typeof obj1); // "object" 
 
var obj2 = n.nifty();  // Do it again, and a new object is created 
 
console.log(obj1 === obj2); // false, they're not the same object

如果你想設置的許多屬性和留住他們,你可以做到這一點明確創建Number對象:

var n = new Number(42); 
 
n.baz = null; 
 
console.log(n.baz === null); // true

這是罕見想要做到這一點,但它是可能的。只是要注意,由於我們前面顯示,二Number對象用相同的原始值不==對方:

var n1 = new Number(42); 
 
var n2 = new Number(42); 
 
console.log(n1 == n2); // false 
 
console.log(n1 === n2); // false

><>=<=將迫使數回到原語並使用原始值,但=====不會。

0

foo.bar是一個數字原語,而不是一個對象。您不能在數字基元上設置屬性,但可以在數字對象上設置屬性。

foo = {}; 
foo.bar = new Number(78); 
foo.bar.baz = null; 

現在foo.bar.baz == null

0

這是因爲

foo = {}; 
foo.bar = 78; 
foo.bar.baz = null; 

console.log(foo.bar.baz); // undefined 

因爲你試圖設置的一些屬性。

1

在嚴格模式下使用數值作爲對象將會出現異常。

默認foo.bar.baz = null將不確定,因爲foo.bar不是對象,.baz將不會設置。

這是你的嚴格模式代碼:

'use strict'; 
 

 
var foo = {}; 
 
foo.bar = 78; 
 
foo.bar.baz = null; 
 

 
if(foo.bar.baz === null) 
 
    alert("foo.bar.baz is null"); 
 
else 
 
    alert("foo.bar.baz is NOT null");

這裏是解決方案:

'use strict'; 
 

 
var foo = {}; 
 
foo.bar = {}; 
 
foo.bar.num = 78; // your number here 
 
foo.bar.baz = null; 
 

 
if(foo.bar.baz === null) 
 
    alert("foo.bar.baz is null"); 
 
else 
 
    alert("foo.bar.baz is NOT null");

附:總是把'use strict'放在你的JS文件中,以便使JS更少用途。

+1

現在*這是*我不知道的嚴格模式的功能。很酷。 –