类型判断
typeof
只能判断原始类型且除了 null,typeof可以判断 function
let str = 'awei'
console.log(typeof str);
instanceof
只能判断引用类型,不能判断原始类型,返回的是布尔值
// 不能判断
// console.log(str instanceof String);
// console.log(num instanceof Number);
// console.log(flag instanceof Boolean);
// console.log(n instanceof Null);
// console.log(u instanceof undefined);
// 能判断
console.log(obj instanceof Object);
console.log(arr instanceof Array);
//也能判定成对象object,因为insranceof是按照原型链往上找,下同,例外:object.create(null)没有原型object
console.log(fn instanceof Function);
console.log(date instanceof Date);
console.log(reg instanceof RegExp);
内部机制
function instance_of(L, R) {
let O = R.prototype
L = L.__proto__
while (L !== null) {
if (L === O) return true
L = L.__proto__
}
return false
}
console.log(instance_of(arr, Object));
Object.prototype.toString.call()
最佳,返回一个字符串
call表示把作用域指到谁身上
- 如果this值是undefined,就会返回 [object Undefined]
- 如果this值是null,就会返回 [object Null]
let str = 'hello' //可改为undefined和null
console.log(Object.prototype.toString.call(str));
// '[object String]'
如果()内的值不为undefined和null,则执行接下来的步骤:
- 生成变量O,让O成为ToObject(this)的结果(即成为一个对象)
- 让class成为O的内部属性 [[class]]的值
- 最后返回由 "[object" 和 class 和 "]" 三个部分组成的字符串(class为识别对象类型的关键)
let O = {
[[class]]: String
}
例题:切割结果,判断是否为string类型
if (Object.prototype.toString.call(str).slice(8, -1) === 'String') { // -1表示倒着数第一个
console.log('yes');
}
Array.isArray()
数组独有的方法