Las diferencias y el uso de call(), apply() y bind() en JS

1. Diferencia

1.1 Las similitudes entre los tres: todas se utilizan para cambiar la dirección de este

1.2 La diferencia entre call() y apply():

Similitud: todos llaman a un método de un objeto y reemplazan el objeto actual con otro objeto (misma función)

Por ejemplo : B.call(A, args1,args2); es decir, el objeto A llama al método del objeto B
F.apply(G, argumentos); es decir, el objeto G aplica el método del objeto F

Diferencia: diferentes formas de escribir parámetros.

El primer parámetro de call() es el objeto al que apunta, y la lista de parámetros se pasa más adelante. Los parámetros pueden ser de cualquier tipo. Cuando el primer parámetro es nulo o no está definido, apunta a la ventana de forma predeterminada;

apply(): el primer parámetro es el objeto al que apunta y el segundo parámetro es la matriz.

//例如:
var obj = {}//定义一个空的对象
function f(x,y){
console.log(x,y)
console.log(this) //this是指obj
}
f.apply(obj,[1,2]) //后面的值需要用[]括起来
f.call(obj,1,2) //直接写

1.3 La diferencia entre call() y bind():

Similitud: ambos se utilizan para cambiar el puntero de este

La diferencia: después de que call() cambie el puntero de this, la función se ejecutará nuevamente. Después de que bind() cambie esto, la función no se ejecutará y se devolverá una función vinculada al nuevo this.

//例如:
function f(){
console.log("看我怎么被调用");
console.log(this) //指向this
}
var obj = {};
f.call(obj) //直接调用函数
var g = f.bind(obj); //bind()不能调用函数
g();  //此时才调用函数

2. Uso

2.1 Aplicación de llamada ()

2.1.1 Utilice call() para determinar el tipo de datos

Usar typeof para determinar la forma de una clase de datos generalmente no es muy preciso. Podemos usar el método Object.prototype.toString.call() para determinar el tipo de datos de un dato.

console.log(Object.prototype.toString.call("qq"))            // [Object String] 返回值都是字符串类型
console.log(Object.prototype.toString.call(12))              // [object Number]
console.log(Object.prototype.toString.call(false))           // [object Boolean]
console.log(Object.prototype.toString.call(undefined))       // [object Undefined]
console.log(Object.prototype.toString.call(null))            // [object Null]
console.log(Object.prototype.toString.call(function(){}))    // [object Function]
console.log(Object.prototype.toString.call([]))              // [object Array]
console.log(Object.prototype.toString.call({}))              // [object Object]

 Podemos utilizar el contenido de salida anterior para encapsular una función para determinar el tipo básico de datos de entrada.

   function getType(a){
       var obj = Object.prototype.toString.call(a); //区分对象类型  确定当前的数据的类型
       var sub = obj.substr(8); 
       // stringObject.substr(start,length)  start 要抽取的子符串的起始下标,
       // length 截取的长度,如果不写则表示从start开始截取到最后 ,stringObject表示某一字符串
      var len = sub.length;
      var sub = sub.substr(0,len-1)
      var rs =  sub.toLowerCase(sub) //转换成小写
      return rs ;
    }
     console.log(getType("a")); //string

2.1.2 Utilice call() para invertir la cadena

//思路:将字符串转化为数组,借用数组中的reverse,将字符串翻转过来
 var str = "abcdefg";
 console.log(Array.prototype.reverse.call(str)); //此时会报错误,即引用类型错误,就是说只有数组才能使用reverse这个方法;(错误写法)
    //方法一:这种方法内有使用call()
 var arr =  Array.from(str).reverse().join("") //将字符串转化为数组,在进行翻转,然后在进行拼接
 console.log(arr) //gfedcba
 console.log(typeof arr) //string
     //方法二:
var rs = Array.prototype.reverse.call(str.split("")).join(""); 
    //splice(start,length)方法用于把一个字符串分割成字符串数组,start 表示从指定的地方分割字符串    length表示分割的长度。
    //返回一个一个字符串数组 如果把空字符串 ("") 用为参数那么字符串中的每个字符之间都会被分割
console.log(rs); //gfedcba
console.log(typeof arr) //string

2.2Aplicación de aplicar()

2.2.1 Utilice apply() para encontrar el valor máximo

var arr =[2,6,8,3,4,9,7,23,56,889]; 
console.log(Math.max.apply(arr,arr)) //第一个arr表示让arr借用max这个方法,第二个arr表示传给max的数据

//apply()所执行的操作:1.执行Math.max(1,2,3,5,4) 2.把内部的this改成arr

Nota: las matemáticas son un objeto, no un constructor.

Supongo que te gusta

Origin blog.csdn.net/m0_74265396/article/details/132564814
Recomendado
Clasificación