1、类型判断有哪些方法,各有什么局限性(至少3个)
答:
- typeof: 局限性不能判断是否为数组
- instanceof
instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型.instanceof 操作符的问题在于,它假定只有一个全局执行环境。
(3) constructor
(4) Object.prototype.toString
详细解答及引申问题:
(1)typeof: 局限性不能判断是否为数组
返回的结果用该类型的字符串(全小写字母)形式表示,包括以下 7 种:number、boolean、symbol、string、object、undefined、function 等
举例:
var a = "iamstring.";
var b = 222;
var c= [1,2,3];
var d = new Date();
var e = function(){alert(111);};
typeof a ------------> “string”
typeof b ------------> “number”
typeof c ------------> “object”
typeof d ------------> “object”
typeof e ------------> “function”
注意:考察特例
typeof null;
// “object”
typeof undefined
// "undefined"
typeof []
// "object"
(2)instanceof
instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,instanceof 检测的是原型.
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型.
instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。
c instanceof Array ---------------> true
d instanceof Date ---------------> true
f instanceof Function------------> true
注意:不能判断基本类型
b instanceof Number; // false
a instanceof String;// false
(3)constructor
a.constructor == String // true
b.constructor == Number // true
c.constructor === Array ----------> true
d.constructor === Date -----------> true
e.constructor === Function -------> true
注意: constructor 在类继承时会出错 eg:
function A(){};
function B(){};
A.prototype = new B(); //A继承自B
var aObj = new A();
aobj.constructor === B -----------> true;
aobj.constructor === A -----------> false;
(4) Object.prototype.toString
Object.prototype.toString.call(a) === ‘[object String]’ -------> true; Object.prototype.toString.call(b) === ‘[object Number]’ -------> true; Object.prototype.toString.call(c) === ‘[object Array]’ -------> true; Object.prototype.toString.call(d) === ‘[object Date]’ -------> true; Object.prototype.toString.call(e) === ‘[object Function]’ -------> true;
2、判断是否为数组的方法(至少3个)
答:
(1)[] instanceof Array
(2)[].constructor === Array
(3)Array.isArray([])
(4) Object.prototype.toString.call([]) ; // [object Array]
3、判断是否为JS原生函数
Function (value) {
return Object.prototype.toString.call(value) === “[object Function]”;
}