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.这个是没有意义的.因此是NaN console.log(undefined);//print "undefined" ;表示变量声明在.可是不知道不肯定变量究竟是个什么东西.
上面我在代码里面经过注释大概解释了why. javascript
细微变换一下: html
console.log(var10);//undefined.注意这里的var10是在这个语句的后面声明的.为何不是is not defined呢?由于Javascript语言是"先解析,后运行",运行时就已经完成了变量声明,这实际上是javascript的"代码提高"(hoisting)功能.如今只对var声明的变量作hoisting var 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);//3
var ufo4; if(ufo4) { console.log("yes"); }else{ console.log("no");//print no.undefined相对与false }
若是是下面怎样浏览器就报错了. java
if(ufo3){//ufo3 is not defined. }
工做中咱们常常须要判断某个变量或者属性是否为undefined。一般使用以下方法:(这里是变量age声明的状况下) 浏览器
var age; //方法1 console.log(typeof age === 'undefined');//只能用 === 运算来测试某个值是不是未定义的,由于 == 运算符认为 undefined 值等价于 null。
//方法2 console.log(age === undefined);//null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。若是不声明age.方式2会报错.这就是前面说过的.未声明的变量(is not defined)参与typeof运算是能够的.
第一种方式是先阶段应用最广且不容易犯错的方式.推荐使用. 框架
undefined是没法使用 for/in 循环来枚举的,也不能用 delete 运算符来删除它。undefined 不是常量,能够把它设置为其余值。因此不少框架代码作当即执行的时候都会把undefined作为参数传入.怎样能够避免其余人去修改undefined的原始值.我的以为ECMA应该把这个修改成只读.当尝试读取不存在的对象属性时也会返回undefined。
测试
关于判断问题请扩展阅读这篇文章. spa