javascript数据和变量是javascript所有知识和技术的基础之基础,非常重要,那么typof作为专门用来判断变量和数据的类型的指令,就一样很重要了。本篇来“细抠”一下typeof,关于变量和数据可参考《javascript入门(1):变量和数据》
typeof的两种用法
typeof(10086)和typeof 10086是等价的。下文主要采用后一种写法。
typeof作用于谁?
既可以作用于数据,也可以作用于变量。
但严格地讲,如果你能理解var i = 10086当中,10086其实并不是数据,而只是一个“匿名变量”(i有名字,叫做i,直观地看不到它的值,必须打印i才能知道它的值;而10086有值,就是10086,但它没有名字),那么你其实就可以说,typeof只用于变量。更进一步地,程序员其实从来也没有真的“碰”过数据。
如此一来,如下代码:
var i = 10086;
console.log(typeof 10086); // number
console.log(typeof i); // number
就应该这样解读:
typeof i是指:i所指代的数据的类型是number;
typeof 10086是指:10086这个匿名变量(初级程序员更愿意认为这就是数据本身)所指代的数据的类型是number
typeof的结果是什么(返回了什么)?
typeof的结果,是变量(所指代的数据)的类型。诸如number,boolean,string,object等。
但是,typeof结果的类型又是什么?typeof (typeof 10086)的结果是什么?
console.log(typeof (typeof 10086)); // string
是的,typeof的结果,表达了数据的类型,但typeof结果本身的类型其实是一个字符串。
当typeof遇到特殊变量(1)
变量如果只声明但还没有显式赋值的情况下,变量本身所指代的数据,是undefined这个全局特殊值。
var i;
console.log(i); // undefined
那么话题可以转为“undefined和typeof能擦出什么火花?”
typeof遇到undefined
console.log(typeof undefined); // undefined。这个打印结果,并不是undefined本身,而只是一个字符串'undefined'
console.log(typeof (typeof undefined)); // string
全局特殊值undefined的类型,打印出来是undefined,然而这个打印结果并不是undefined本身,其实是个字符串。也就是说:
1、undefined的类型是string,undefined并不是你可能以为的一个什么很奇怪的东西,虽然它特殊,但是它很合群,它是个特殊的字符串
2、但undefined并不是'undefined'这个字符串,虽然它被打印时确实会显示undefined字样,这和打印'undefined'字符串的结果是完全一样的,这只是打印程序对undefined的一个特殊处理,具体undefined到底是个什么样子的字符串,它什么样子都不是!
console.log(undefined == 'undefined'); // false
console.log(undefined === 'undefined'); // false
注:关于==和===的区别,此处不展开,不了解的读者自行搜阅文献。
当typeof遇到特殊变量(2)
如果一个变量根本没有声明呢?
console.log(typeof x); // undefined
这是typeof表现得非常不合理的一点。没有声明的变量,绝大多数其他操作都会给出一个错误,但typeof会对未声明的变量给出undefined。
也就是说,无论变量声明了但还没有显式赋值,抑或根本没声明,对其执行typeof操作都得到字符串‘undefined’。因此,不要用typof来区分一个变量到底是“未声明”还是“声明了但未赋值”。正确区分的办法是:
var i;
console.log(i == undefined); // i未赋值
console.log((typeof j) == 'undefined'); // j未声明