因为在函数作用域或者块级作用域中也定义了一个undefined变量,在此作用域中就会优先使用新定义的变量,而不会去使用window.undefined,从而造成一种我们将window.undefined的值改变了的假象。

我们平时用到的\(\color{#FF3030}{undefined}\)只是\(\color{#FF3030}{window}\)对象下的一个属性。

Object.getOwnPropertyDescriptor(window, undefined);//{value: undefined, writable: false, enumerable: false, configurable: false}

也正是因为如此,导致它在函数作用域中是可以修改。
但前提要加声明,因为不加声明,操作的\(\color{#FF3030}{window.undefined}\),而\(\color{#FF3030}{window.undefined}\)的属性描述符是:

属性
valueundefined
writablefalse
enumerablefalse
configurablefalse

\(\color{#FF3030}{value}\)不能修改,不能遍历,并且\(\color{#FF3030}{属性描述符}\)也不能修改(不能用\(\color{#FF3030}{Object.defineProperty}\)来修改\(\color{#FF3030}{writable、enumerable、configurable}\)的值)。

但是我们是可以在\(\color{#FF3030}{函数作用域}\)或者\(\color{#FF3030}{块级作用域}\)对\(\color{#FF3030}{undefined}\)的值进行\(\color{#FF3030}{“修改”}\)的,比如:

function fn(){    undefined = 1111;    console.log('undefined : ' + undefined);}fn();//undefined : undefinedfunction fn(){    var undefined = 1111;    console.log('undefined : ' + undefined);}fn();//undefined : 1111{    let undefined = 1111;    console.log('undefined : ' + undefined);//undefined : 1111}

这是因为在\(\color{#FF3030}{函数作用域}\)或者\(\color{#FF3030}{块级作用域}\)中也定义了一个\(\color{#FF3030}{undefined}\)变量,在此作用域中就会优先使用新定义的变量,而不会去使用\(\color{#FF3030}{window.undefined}\),从而造成一种我们将\(\color{#FF3030}{window.undefined}\)的值改变了的假象。

所以我们在判断变量的类型时,最好使用:

var obj;typeof obj ===  'undefined';

而不要去使用:

var obj;obj === undefined;

使用\(\color{#FF3030}{void关键字}\)也是可以的,因为\(\color{#FF3030}{void关键字}\)无论如何都会返回\(\color{#FF3030}{undefined}\):

var obj;obj === void(0);

这也是在实际开发中经常使用\(\color{#FF3030}{void(0)}\)来代替\(\color{#FF3030}{undefined}\)的原因了。

©著作权归作者所有:来自51CTO博客作者wx60877cc7b61d6的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. JavaScript中是如何定义私有变量的
  2. c语言指针学习
  3. 210402 JavaScript 作用域 闭包 原型 构造函数
  4. shell编程及自动化运维----变量
  5. 变量系列教材 (八)- 什么是Java的表达式
  6. 变量系列教材 (七)- Java 中final修饰变量
  7. 变量系列教材 (六)- 什么是Java的作用域
  8. 变量系列教材 (五)- Java的命名规则
  9. 变量系列教材 (四)- 在Java中进行基本类型的类型转换

随机推荐

  1. ListView使用完全讲解
  2. Android(安卓)VideoView播放视频
  3. Android API开发之TTS开发之Android TTS
  4. Android处理EditText键盘自动隐藏
  5. Android开发艺术探索 第2章 IPC机制(部分
  6. Android中判断网络功能是否可用
  7. Android 系统字体和颜色样式
  8. Android(安卓)面试题及答案(英文)
  9. 在android 中开发java.net.SocketExcepti
  10. Android 网络多线程断点下载