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.
细微变换一下:
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 }
如果是下面怎样浏览器就报错了.
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。
时间: 2024-10-05 08:06:34