首页 > 代码库 > javascript 中 "undefined" 与 "is not defined" 分析

javascript 中 "undefined" 与 "is not defined" 分析

 
var var1;console.log( typeof var0);//print "undefined",主要看下面对var0单独的输出console.log( typeof var1);//print "undefined"console.log( typeof true);//print "boolean"console.log( typeof false);//print "boolean"console.log( typeof 1);//print "number"console.log( typeof "string");//print "string"console.log( typeof (new Object()));//print "object"console.log( typeof null);//print "object"console.log( typeof NaN);//print "number"console.log( typeof undefined);//print "undefined" //console.log(var0);//Uncaught ReferenceError: var0 is not defined 浏览器直接报错.且终止程序.因为var0从未声明过.而且更未赋值.但是可以参与typeof运算.程序不会终止.console.log(var1);//undefined,不是is not defined.也即使说已经声明.但是未赋值.这样就是undefined.console.log(true);//print "true"console.log(false);//print "false"console.log(1);//print "1"console.log("string");//print "string"console.log((new Object()));//print "object"console.log(null);//print "null";null 表示不存在.console.log(NaN);//print "NaN" ;是number类型里面的概念.当两个数字运算结果居然不是数字了.即非数字not a number.NaN.比如0/0.这个是没有意义的.所以是NaNconsole.log(undefined);//print "undefined" ;表示变量声明在.但是不知道不确定变量到底是个什么东西.

 

上面我在代码里面通过注释大概解释了why.

细微变换一下:

console.log(var10);//undefined.注意这里的var10是在这个语句的后面声明的.为什么不是is not defined呢?因为Javascript语言是"先解析,后运行",运行时就已经完成了变量声明,这其实是javascript的"代码提升"(hoisting)功能.现在只对var声明的变量做hoistingvar var10;

如果不是变量.而是对象里面的属性.

var obj1 = {};console.log(obj1.attr1);//undefined,对象里面的属性没有.虽然attr1从来没有声明过.但是却未报错is not defined.引擎对此网开一面了.
function Fun1() {}var fun1 = new Fun1();console.log(fun1.attr1);//undefined,这里用function.其实function本也是对象.new完就是object.

 undefined参与运算的情况:

  

var ufo2=ufo2||3;//运算的地方肯定是undefined;因为前面有做ufo2的声明.但是运算的时候还未赋值.所以undefined相当于false.console.log(ufo2);//3var ufo4;if(ufo4) {    console.log("yes");}else{    console.log("no");//print no.undefined相对与false}

如果是下面怎样浏览器就报错了.

if(ufo3){//ufo3 is not defined.}

工作中我们经常需要判断某个变量或者属性是否为undefined。通常使用如下方法:(这里是变量age声明的情况下)

var age;//方法1console.log(typeof age === ‘undefined‘);//只能用 === 运算来测试某个值是否是未定义的,因为 == 运算符认为 undefined 值等价于 null。//方法2console.log(age === undefined);//null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。

如果不声明age.方式2会报错.这就是前面说过的.未声明的变量(is not defined)参与typeof运算是可以的.

 

第一种方式是先阶段应用最广且不容易犯错的方式.推荐使用.

undefined是无法使用 for/in 循环来枚举的,也不能用 delete 运算符来删除它。undefined 不是常量,可以把它设置为其他值。所以很多框架代码做立即执行的时候都会把undefined做为参数传入.怎样可以避免其他人去修改undefined的原始值.个人觉得ECMA应该把这个修改为只读.当尝试读取不存在的对象属性时也会返回undefined。

 

javascript 中 "undefined" 与 "is not defined" 分析