2013年12月5日 星期四

關於 JavaScript 的 undefined 屬性是否能被覆蓋

之前一直以為 JavaScript 的 undefined 屬性可以被覆蓋,
後來才知道,較新的瀏覽器 undefined 屬性已經不能被覆蓋了。

MDN 裡面有一段說明
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
In modern browsers (JavaScript 1.8.5 / Firefox 4+), undefined is a non-configurable, non-writable property per the ECMAScript 5 specification. Even when this is not the case, avoid overriding it.

另外,若是舊的瀏覽器(IE8以下),在 undefined 屬性被覆蓋的情況下
想取得真正的 undefined ,可以使用 void(0) 或 void 0 取得 (void expression 總是回傳真正的undefined)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void

用 IE11、chrome、Firefox 做了以下測試
var a;
console.log(a); // undefined
console.log(undefined === a); // true

// 嘗試覆蓋掉 undefined
undefined = 10;

console.log(undefined); 
// IE5、IE7、IE8 得到 10
// IE9、IE10、IE11、Firefox、chrome 依然為 undefined

console.log(undefined === a);
// IE5、IE7、IE8 console.log 得到 undefined(奇怪?),但用 alert(undefined === a) 得到 false
// IE9、IE10、IE11、Firefox、chrome 得到 true

console.log(void(0)); // 所有瀏覽器都回傳 undefined
console.log(void(0) === a); // 所有瀏覽器都回傳 true

用 IE11 的開發人員工具模擬 IE5、IE7、IE8 測試時,發現一個奇怪的地方
console.log(undefined === a) 回傳 undefined,有點奇怪
但是用 alert(undefined === a) 會回傳預期中的 false
// IE5、IE7、IE8
var a;
undefined = 10;
console.log(undefined);  // 10

console.log(undefined === a); // undefined
alert(undefined === a); // false

console.log((undefined === a) === void(0)); // undefined
alert((undefined === a) === void(0)); // false
IE11 的開發人員工具 console.log 的結果,似乎會怪怪的。

其他參考:
http://www.ptt.cc/bbs/Ajax/M.1385957592.A.D1C.html

沒有留言:

張貼留言