今天不扯那么多别的,直接上干货!
typeof()
- 可以判断除null之外的原始类型
- 无法判断除function之外的引用类型
let str = 'Damn'
let num = 123
let flag = false
let un = undefined
let nu = null
let obj = {}
let arr = []
let fn = function (){}
console.log(typeof (str)); // String
console.log(typeof (num)); // Number
console.log(typeof (flag)); // Boolean
console.log(typeof (un)); // Undefined
console.log(typeof (nu)); // Object
console.log(typeof (obj)); // Object
console.log(typeof (arr)); // Object
console.log(typeof (fn)); // Function
输出结果如下:
- typeof的判断原理是:将值转换为二进制后看其前三位是不是0,除了函数,所有的引用类型的二进制前三位都是0,null的二进制全部是0
instanceof()
- 只能用于判断引用类型
let str = 'Damn'
let num = 123
let flag = false
let un = undefined
let nu = null
let obj = {}
let arr = []
let fn = function (){}
console.log(str instanceof String); // false
console.log(num instanceof Number); // false
console.log(flag instanceof Boolean);// false
console.log(obj instanceof Object); // true
console.log(arr instanceof Array); // true
console.log(fn instanceof Function); // true
输出结果如下:
是通过原型链的查找来判断。
Object.protype.toString()
-
Object.protype.toString().call(x)
-
toString()
- 对象的toString():[object Object]
- 数组的toString(): 将数组中的元素用逗号的方式拼接成字符串
- 其他的toString():直接将值修改成字符串字面量
let a = [1,2,3]
let b = {a: 1}
let c = 'Damn'
console.log(a.toString());
console.log(b.toString());
console.log(c.toString());
输出结果如下:
- Object.prototype.toString(x)
- 如果 toString接受的值是 undefined,则返回“[object Undefined]”
- 如果 toString接受的值是 null,则返回“[object null]”
- 调用 ToObject(x) 将x转化为对象,此时得到的对象内部一定拥有一个属性[[class]],而该属性[[class]]的值就是 x 的类型
- 设 class是[[class]]的值
- 返回由"[object" 和 class 和 "]" 拼接得到的字符串
let a = [1,2,3]
let b = {a: 1}
let c = 'Damn'
console.log(Object.prototype.toString(b));
console.log(Object.prototype.toString.call(a));
console.log(Object.prototype.toString.call(c));
输出结果如下:
Array.isArray
只能用于判断是否为数组类型
let arr = []
let num = 0
let str = 'Damn'
console.log(Array.isArray(arr));
console.log(Array.isArray(num));
console.log(Array.isArray(str));
输出结果如下: