三组方法分别是
1.Object.prototype.toString.call(arr)
第一个让我想起了所有前端都会遇到的问题
想要打印一个对象查看 console.log('res:' + obj),但控制台显示结果为res: [object Object] ?
原因就出在 + 这个符号上 我们实际看到的是 console.log('res:' + obj.toString())
那么toString() 干了什么呢
- 除了null和undefined之外,其他的类型(数值、布尔、字符串、对象)都有toString()方法,它返回相应值的字符串表现(并不修改原变量)。
- 每个对象都有一个toString()方法。
- 当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。
- 默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString()返回 "[object type]",其中type是对象的类型。
所以正确的写法是
console.log(JSON.stringify(obj))
- undefined/null 是一个原始值 不是对象 就没有原型 就调用不到Object.prototype(原型链最终原型)的 toString 方法
- 这个tostring() 是object原型链上的,和数组的tostring()还是有区别的
使用 Object.prototype.toString.call() 可以判断所有数据的类型,简称无敌
Object.prototype.toString.call('An') // "[object String]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call({name: 'An'}) // "[object Object]"
2.Array.isArray(arr)
和Object.prototype.toString.call() 几乎一毛一样,属于新生代猛男,唯一的缺点是es5之后推出,可能浏览器不支持,但是现在基本没这个问题了,时代在召唤
3.arr instanceof Array
这个老哥效率据说是最好的,但是它容易被作弊 ,所以安全性最低
const obj = {}
obj.__proto__ = Array.prototype
// Object.setPrototypeOf(obj, Array.prototype)
obj instanceof Array // true
instanceof 只能用来判断对象类型,原始类型不可以。并且所有对象类型 instanceof Object 都是 true。
最后加一点是被遗弃的typeof
与instanceof 对应的 typeof
只能检测 基本数据类型,包括boolean、undefined、string、number、symbol 外加一个function
其他一律显示object