JavaScript高级手记(四种数据类型检测方法)
* 数据类型检测
+ typeof 检测数据类型的运算符
+ 返回结果是一个字符串,字符串中包含了对应的数据类型
+ "number/string/boolean/symbol/bigint/object/function"
+ 多个typeof检测,结果都是字符串 typeof typeof xxx => 'string'
【有BUG】
+ typeof null => 'object'
+ 不能具体检测出对象类型 typeof arr => 'object'
+ instanceof 检测当前实例是否属于某个类,并不是用来检测数据类型的
+ 用它来检测,一般是应用于普通对象/数组对象/正则对象/日期对象等的具体细分的
+ 结果返回的是boolean类型值(不是true就是false)
【有BUG】
+ 不能证明 xxx instanceof Object 为true就说 xxx是普通对象
arr instanceof Array => true
arr instaceof Object => true
+ 不能检测字面量创建的基本类型值 10 instanceof Number =>false
+ constructor 用来获取实例的构造函数
+ 比 instanceof 好用一点
+ 但是也不准确:constructor 也是可以被随意修改的
+ Object.prototype.toString.call([value])
+ 专门用来检测数据类型的
+ Number/String/Boolean/Symbol/BigInt/Function/Array/Date/RegExp/Object......的原型上都有toString,除了Object.prototype.toString不是用来转换为字符串的,其余的都是
+ 返回结果 "[object 对象[Symbol.toStringTag] || 对象.构造函数 || Object]"
function fn(){}
console.log(typeof fn);
console.log(typeof null);
let arr = [10,20];
console.log(typeof arr);
let arr = [10,20];
console.log(arr instanceof Array);
console.log(arr instanceof Object);
let m = 10;
console.log(m instanceof Number);
m = new Number(10);
console.log(m instanceof Number);
function P(){}
P.prototype = Array.prototype;
let p = new P;
console.log(p instanceof Array);
let arr = [10];
console.log(arr instanceof Array);
console.log(Array[Symbol.hasInstance](arr));
let obj = {};
let arr = [10];
let obj = {};
console.log(arr.constructor === Array);
console.log(arr.constructor === Object);
console.log(obj.constructor === Object);
function Person(){}
Person.prototype = Array.prototype;
let p = new Person;
console.log(p.constructor === Array);
let m = 10;
console.log(m.constructor === Number);
let valType = {},
toString = valType.toString;
console.log(toString.call([10]));
console.log(toString.call(10));
console.log(toString.call(30n));
console.log(toString.call(null));
function Person(){}
let p = new Person;
console.log(toString.call(p));
class QQ{
get [Symbol.toStringTag](){
return 'QQ'
}
}
let q = new QQ;
console.log(toString.call(q));
function myInstanceof(obj, constructor) {
if(obj == null || !/^(object|function)$/i.test(typeof obj)) return false;
if(typeof constructor !== 'function') throw new TypeError('请传入一个函数');
let proto = Object.getPrototypeOf(obj),
prototype = constructor.prototype;
while(1) {
if(proto === null) return false;
if(proto === prototype) return true;
proto = Object.getPrototypeOf(proto)
}
}
console.log(myInstanceof([], Array));
console.log(myInstanceof([], Object));
console.log(myInstanceof(10, Number));
console.log(myInstanceof(new Number(10), Number));
console.log(myInstanceof([], {}));