格式: 对象 instanceof Date/Array/Object,如果对象属于Date/Array/Object的话,返回true,否则返回false。
注意,数组、对象在instanceof Object的判断下都是true,即复杂类型皆对象
作用:用来判断是不是某种复杂类型,如果是得到true,如果不是得到false
为什么不用typeof?
因为typeof只对基本数据类型比较精准,复杂类型不行,复杂类型都只会得到Object
console.log(typeof 10)
console.log(typeof 'abc')
console.log(typeof true)
console.log(typeof {
name: 'jack',
age: 16
})
console.log(typeof new Date())
console.log(typeof [10, 20, 30])
原理:判断某个对象在不在构造函数的原型对象的原型链上,在得到true,不在得到false
console.log( { name:'jack', age: 16 } instanceof Object ) // true
console.log( new Date() instanceof Date ) // true
console.log( [10,20,30] instanceof Array ) // true
console.log( [10,20,30] instanceof Date ) // false
万物皆对象
console.log( new Date() instanceof Object ) // true
console.log( [10,20,30] instanceof Object ) // true
// // 基本数据类型连原型都没有,那么肯定不在原型链上
// // 用instanceof的时候是没有自动包装成对应的复杂类型
// console.log('abc' instanceof String) // false
// console.log(true instanceof Boolean) // false
// console.log(10 instanceof Number) // false
// // 肯定有原型属性,所以在原型链上
// console.log( new String('abc') instanceof String ) // true
// console.log( new Number(10) instanceof Number ) // true
// console.log( new Boolean(true) instanceof Boolean ) // true
// // 基本数据类型连原型都没有所以不在任何原型链上
// console.log('abc' instanceof Object) // false
// console.log(true instanceof Object) // false
// console.log(10 instanceof Object) // false
// 因为调用valueOf以后得到的是他们对应的基本数据类型
// 基本数据类型连原型都没有,所以不在任何原型链上
console.log( new String('abc').valueOf() instanceof String ) // false
console.log( new Number(10).valueOf() instanceof Number ) // false
console.log( new Boolean(true).valueOf() instanceof Boolean ) // false