instanceof运算符
var arr = [1, 2];
console.log(arr instanceof Array); // true
这段代码问的是“变量arr是否为Array对象的实例?”, 而arr确实是其实例,因此结果返回true。
封装myInstanceof函数
function myInstanceof(left, right) {
var obj = right.prototype;
left = left.__proto__;
while (true) {
if (left === null) {
return false;
}
if (obj === left) {
return true;
}
left = left.__proto__;
}
}
关于instanceof更深层次的问题以及用法,请往JavaScript instanceof 运算符深入剖析
Array.isArray()
var arr = [1, 2];
console.log(Array.isArray(arr)); // true
ES5方法,IE8及以前浏览器版本不支持
constructor
每创建一个函数,就会同时创建它的prototype对象, 这个对象也会自动获得constructor属性,当这个函数作为
构造函数创建一个实例,这个实例访问constructor属性,实际上是访问它原型上的constructor属性。
function Father() {
this.name = 'kuang'
}
console.log(Father.prototype.constructor);
// ƒ Father() {this.name = 'kuang'}
var instance = new Father();
console.log(instance.constructor);
// ƒ Father() {this.name = 'kuang'}
判断数组
var arr = [1, 2];
console.log(arr.constructor === Array); // true
Object.prototype.toString.call()
var arr = [1, 2];
console.log(Object.prototype.toString.call(arr) === '[object Array]'); // true
自封装一个数组判断函数myIsArray()
Array.prototype.myIsArray = function (object) {
return object &&
typeof object === 'object' &&
typeof object.length === 'number' &&
typeof object.splice === 'function' &&
// 判断length 属性是否是可枚举的 对于数组将得到false 对象默认为true
!(object.propertyIsEnumerable('length'));
}