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

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

作者: 陆碌 | 来源:发表于2021-01-26 09:27 被阅读0次

    三组方法分别是

    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 个判断数组的方法

          本文链接:https://www.haomeiwen.com/subject/bpcizktx.html