typeof 返回值有六种可能: "number," "string," "boolean," "object," "function," 和 "undefined."我们可以使用typeof来获取一个变量是否存在,如if(typeof a!="undefined"){},而不要去使用if(a)判断,因为如果a不存在(未声明)则会出错,typeof的运算数未定义,返回的就是 “undefined”.
运算数为数字 typeof(123)=='number'
字符串 typeof("123")=='string'
布尔值 typeof(true)=='boolean'
对象,数组和null typeof(对象,函数或者null值) = “object”
函数 typeof(一个函数) = “function”
undefined typeof(undefined)="undefined"
typeof 运算符返回一个用来表示表达式的数据类型的字符串。对于Array,Null等特殊对象使用typeof一律返回object,这正是typeof的局限性。
2.instanceofinstanceof用于判断一个对象是否是数组,或判断某个变量是否是某个对象的实例
例如:var a=new Array(); console.log(a instanceof Array); //true
console.log(a instanceof Object); //true,这是因为Array是object的子类
再如:function test(){}; var a=new test(); console.log(a instanceof test); //true
上面a instanceof Object 得到true并不是因为 Array是Object的子对象,而是因为 Array的prototype属性构造于Object,Array的父级是Function。
补充说明:
Array.prototype
应该是叫做“数组的原型”。在 JS 中所有使用new
创建的对象,都会生成一个以这个函数为原型的对象,比如arr = new Array
。表现就是arr.__proto__ === Array.prototype
。只是new Object,new Array,new Function, new RegExp
等都有其他的写法。
当访问一个对象的属性,比如arr.toString
,其实访问的是arr.toString? arr._proto_.toString? arr._proto_._proto_.toString?....
(按照这个顺序查找到的第一个)。又因为arr.__proto__ === Array.prototype
,而Array.prototype
具有toString
,所以arr.toString
访问的就是这里定义的那个函数,这样就实现了继承。