var undefined = 1 这样赋值有效果吗?

话不多说,先上代码~

情景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」。