typeof
JavaScript里只有五种基本数据类型:number, string, boolean, null, undefined. 其它的都是复合数据类型object.
值和数据类型是两码事。比如:null是null类型的唯一值,undefined是undefined类型的唯一值,就如true和false是boolean类型的唯两值一样。
可以用typeof检测出以下6种数据类型:number, string, boolean, undefined, object, function.
注意:typeof null == “object”. null类型的唯一值null的类型是object类型。(很拗口,但事实就是这样)
因此,对于五种基本数据类型来说,用下面的代码就可以检测出来:
// 获取变量o的数据类型
function type(o) {
return (o === null) ? 'null' : typeof(o);
}
instanceof
typeof只能检测基本数据类型,对于复合数据类型,除了function,都通通返回'object'.
instanceof可以检测某个对象是不是另一个对象的实例,注意instanceof的右操作数必须为对象:
alert(1 instanceof Number); // false
alert({} instanceof Object); // true
instanceof还可以检测父类型:
function Animal() {};
function Pig() {};
Pig.prototype = new Animal();
alert(new Pig() instanceof Animal); // true
constructor
JavaScript里的所有对象都拥有一个constructor属性
alert(1.constructor); // 报错
var o = 1;
alert(o.constructor); // Number
o = null; // or undefined
alert(o.constructor); // 报错
alert({}.constructor); // Object
alert(true.constructor); // Boolean
可以看出,null和undefined没有constructor,number和string数据类型的字面量,也没有constructor,但number和string数据类型的变量有constructor(在寻找constructor属性时,会自动转换成Number或String对象)。
Duck Typing
在犀牛书里,提到一句老话:“如果走路像鸭子,叫声也像鸭子,那它就是一个鸭子!” 换言之,对于Array来说,如果一个对象有splice和join属性,那它就是Array. 这就是Duck Typing:
function isArray(o) {
return o != null && typeof o === ‘object’ &&
'splice' in o && 'join' in o;
}
显然,鸭子检测很容易误把自造的天鹅也当成鸭:
alert(isArray({'splice': '', 'join': ''})); // true