类型判断
typeof
使用场景:基本类型判断
typeof 'Jian' // string
typeof 123 // number
typeof true // boolean
typeof Symbol() // symbol
typeof undefined // undefined
不适用场景:引用类型
typeof [] // object
typeof {} // object
typeof new Date() // object
typeof /^\d*$/; // object
instanceof
instanceof 的运算规则很复杂:
假设instanceof运算符左边是L,右边是R
L instanceof R //instanceof运算时,通过判断L的原型链上是否存在R.prototype
L.__proto__.__proto__ ..... === R.prototype ? //递归查找,找到顶层为止,如果存在返回true 否则返回false
一句话理解 instanceof 的运算规则为:
instanceof 检测左侧的 __proto__
原型链上,是否存在右侧的 prototype 原型。
我的理解就是:
判断右侧的构造函数能不能一步一步构造出的左侧这个实例
[] instanceof Array // true
[] instanceof Object // true Object->Array->[]
function(){} instanceof Object // true
toString
每一个引用类型都有toString方法,默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。
Object.prototype.toString.call(1); '[object Number]'
Object.prototype.toString.call('1'); '[object String]'
Object.prototype.toString.call(NaN); '[object Number]'
Object.prototype.toString.call(foo); '[object Function]'
Object.prototype.toString.call([1,2,3]); '[object Array]'
Object.prototype.toString.call(undefined); '[object Undefined]'
Object.prototype.toString.call(null); '[object Null]'
Object.prototype.toString.call(true); '[object Boolean]'
constructor
实际情况下,constructor属性可以被随意修改,而且你在原型继承中,很容易忽略掉constructor的正确指向
// constructor即构造函数
console.log("测试 Number ->", (1).constructor === Number); // true
console.log("测试 Boolean ->", true.constructor === Boolean); // true
console.log("测试 String ->", "".constructor === String); // true
// console.log('测试 null ->', null.constructor === null); // TypeError: Cannot read property 'constructor' of null
// console.log('测试 undefined ->', undefined.constructor); // TypeError: Cannot read property 'constructor' of undefined
console.log("测试 NaN ->", NaN.constructor === Number); // true 注意:NaN和infinity一样是Number类型的一个特殊值
console.log("测试 function ->", function() {}.constructor === Function); // true
console.log("测试 Object ->", {}.constructor === Object); // true
console.log("测试 Array ->", [].constructor === Array); // true
console.log("测试 Date ->", new Date().constructor === Date); // true
console.log("测试 Error ->", new Error().constructor === Error); // true
console.log("测试 RegExp ->", new RegExp().constructor === RegExp); // true
console.log("测试 Symbol ->", Symbol().constructor === Symbol); // true
console.log("测试 Map ->", new Map().constructor === Map); // true
console.log("测试 Set ->", new Set().constructor === Set); // true
console.log("------------------------------------")