後來才知道,較新的瀏覽器 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)); // falseIE11 的開發人員工具 console.log 的結果,似乎會怪怪的。
其他參考:
http://www.ptt.cc/bbs/Ajax/M.1385957592.A.D1C.html
沒有留言:
張貼留言