Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JavaScript undefined的故事

  阅读本文前建议先看看昨天的那篇文章,从弱类型与强类型说JavaScript的数据类型判断
  不罗嗦,直接切入正题吧。undefined的数据区域和null一样,都是一个空指针。既然说是指针,那就说明它是对象类型的。两个对象类型用“==”来运算,就是用它们数据区域的指针来比较的,如果指针上的地址相同那么比较运算就可以成立。由于null和undefined都是空指针,所以null==undefined是成立的。 alert({}=={}); //false
alert(null==undefined); //true
  本文既然是说undefined,那就必须先搞清楚undefined到底是什么,这个问题大多数人都没搞明白。其实有三个东西都叫做undefined,直接说undefined是什么肯定会有歧义的。先来说其中的一个undefined,它是一个数据类型。那么什么是类型呢?类型是逻辑层面上的东西,比如常量1,它的数据类型就是number,而1就是number这个数据类型的一个值。有些类型有很多值,比如number、string,等。unmber的值在JavaScript中就是64位的IEEE754标准的所有值,数量是非常多的。而string它的值就多的数不清了,只要引擎和硬件允许它就可以有无限多。也有值很少的数据类型,比如boolean,它只有两个值true和false。那么,undefined类型的值是什么呢?这就是undefined第二个含义,表示undefined类型的值。第二层含义下undefined是我们的语言中描述undefined这个类型的值时使用的,它不存在代码中。undefined这个值是用来表示一个变量声明以后没有初始化时的值,所以我们var a;的时候,变量a中保存的就是一个undefined的值。但是这个值是无形的,只要没有初始化的变量都会是undefined这个值。不像1、2、3,这样的数字常量,它们是数字,是有实体的。因为undefined是无形的,所以要把一个已经初始化过的变量赋上undefined的值是很困难的。所以为了编程的方便,引入了undefined的第三层含义。它是一个全局(Global)对象的属性。我们平时在代码中使用的“undefined”就是第三层含义的undefined了。记住,它是一个全局对象的属性,或者叫做全局变量。这个变量有点特殊,而且还有点浏览器差异。
alert("undefined" in window); //true

undefined="次碳酸钴";
alert(undefined);
/*
输出
IE<9:次碳酸钴
IE9+,Chrome,FF:undefined
*/
  在目前的新版JavaScript标准中,这个特殊的undefined内置全局变量是无法被用户修改的。而旧版本的没有这个限制。undefined这个数据类型还有很多特殊性质。主要表现在运算表达式上。前面我们说了“==”这个比较运算符,它和null可以做正常的比较。但是其他运算符就没这么顺利了。除了判断不等和前面说过的和null的空指针比较,其它比较运算一律不通过。而且算数运算也只是会让结果变成NaN,和字符串连接会把"undefined"这个字符串连接上后面的字符串。这些东西我说了也没意思,只有自己去尝试才会记的住。最后仔细斟酌这些运算符的工作,你会发现它们是非常符合逻辑的。
  先说到这儿吧,要是还有什么以后再补充。
网名:
54.226.58.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^