木易杨前端面试题第 21 题:有以下 3 个判断数组的方法

三组方法分别是

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

你可能感兴趣的:(木易杨前端面试题第 21 题:有以下 3 个判断数组的方法)