话不多说,先上代码~
情景1:
var undefined = 1; alert(undefined); // chrome: undefined, ie8: 1 alert(window.undefined);
在 chrome 下运行得到的结果还是 「undefined」,但在IE8以下赋值是生效的。
可以看看 MDN 里关于这部分的描述: undefined - JavaScript
在ES3中(Firefox4之前),window.undefined就是一个普通的属性,你完全可以把它的值改变成为任意的真值,但在ES5中((Firefox4之后),window.undefined成了一个不可写,不可配置的数据属性,它的值永远是undefined.
情景2:
var obj = {}; obj.undefined = 'jirengu ruoyu'; console.log(obj.undefined) // jirengu ruoyu 在标准浏览器下作为全局作用域下 window的一个属性, undefined 不可修改;但对于一个普通对象,undefined可作为属性且可以修改。
情景3:
function fn(){ var undefined = 100; alert(undefined); //chrome: 100, ie8: 100 } fn();
不管是标准浏览器,还是老的 IE 浏览器,在函数内部 undefined 可作为局部变量重新赋值
情景4:
undefined = 100; (function(global){ alert(undefined); //chrome: undefined, ie8: 100 })(window)
在标准浏览器下输出的结果是undefined。而在ie8下为100(因为可被赋值)
所以1.x版本的 jquery 中我们会看到类似这样的代码
(function(global, undefined){ alert(undefined) })(window)
这样即使用户使用 IE8浏览器,在全局修改了undefined的值,在匿名函数内undefined 也不会发生变化。因为在匿名函数内实参只传递一个 window,而形参多了个undefined(可以把这个undefined当做一个普通参数名),这个未赋值的变量在匿名函数内就是真正的undefined。
undefined 的其他边边角角
有时候我们需要判断一个变量是不是undefined,会这样用
if(str === undefined){ console.log('I am empty'); }
但假如 str 这个变量没声明就会出现报错,用下面的方式会更好一些
if(typeof str === 'undefined'){ console.log('I am better'); }
有时候我们会看到这种写法
if(str === void 0){ console.log('I am real undefind'); }
那是因为 「void 0」的执行结果永远是「undefined」, 即使在某些老旧浏览器 或者在某个函数中 undefined被重新赋值,我们仍然可以通过 「void 0」 得到真正的「undefined」。