吃瓜,,这三者关系好乱(call apply bind)

145 阅读1分钟

-call apply bind 区别

共同点:都可以修改this指向,第一个参数都是修改的this 不同点 传参方式不同:call是逐一传参,apply是数组/伪数组传参 函数名.call(修改的this,参数1,参数2...) 函数名.apply(修改的this,数组1,数组2...) 执行机制不同:call和apply会立即执行函数,bind不会立即执行 bind会得到一个修改铜this后的新函数

判断数据类型 1.typeo有两种数据无法检测:null,array 2.Object.prototype.toString.call(数据)

代码补充

            console.log(this)
            console.log(a + b)
        }

        //(1)函数名.call(修改的this,参数1,参数2…………)
        fn.call({name:'张三'},10,20)

        //(2)函数名.apply(修改的this, 数组/伪数组 )
        // apply底层会自动遍历数组,然后按照顺序逐一传参
        fn.apply({name:'李四'},[15,25])

        //(3)函数名.bind(修改的this)
        // bind不会立即执行函数,而是返回一个修改this之后的新函数
        let newFn = fn.bind({name:'王五'})
        newFn(8,9)
        
        
        //值类型
        let bol = true
        let nul = null
        //引用类型
        let arr = [10, 20, 30]
        console.log(typeof bol)//'boolean'
        console.log(typeof nul)//'object'
        console.log(typeof arr)//'object'

        /* 万能数据类型检测 :  Object.prototype.toString.call( 数据 ) 
        原因: 在Object.prototype中有一个方法叫做toString, 返回一个固定格式字符串 
        '[object 数据类型]'
        */

        console.log(Object.prototype.toString.call(bol))//'[object Boolean]'
        console.log(Object.prototype.toString.call(nul))//'[object Null]'
        console.log(Object.prototype.toString.call(arr))//'[object Array]'