Function.prototype 的 aplicar y llame al (.apply.call ())

Sus funciones están cambiando la función de este punto

function.call (thisArg, arg1, arg2, ...)
func.apply (thisArg, [argsArray])


Primero en una pregunta: decir la siguiente código produce resultados y las razones para la
referencia stackoverflow

let myArray = Array.apply(null, {length: 10}).map(Number.call, Number);
myArray //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

análisis:

La fórmula anterior se divide en dos partes:

Array.apply(null, {length: 10}) //[undefined X 10],10个undefined的数组

y

.map(Number.call, Number)

Como todos sabemos,

Array(10) //[,,,,,,,,,]
Array.prototype.slice.call({length: 3, 0:1, 1:2, 2:3}) //[1, 2, 3]

Sobre el uso de una gran variedad de clases, hay muchos

for (var i=0; i<arr.length; i++) {
  console.log(arr[i]) // logs 1 .. 2 .. 3
}
Array.prototype.forEach.call({length: 3, 0: 1, 1: 2, 2: 3}, function(x) {
  console.log(x) // 1  2  3
})

MDN:
Desde el inicio ECMAScript quinta edición, (Aplicar el segundo parámetro) puede ser utilizado para cualquier tipo de matriz de objetos, una longitud que es tan larga como
las propiedades y gama (0 ... longitud-1) es un número entero de propiedades. Por ejemplo NodeList ahora puede usar su propia o una definición similar { 'longitud': 2,
'0': 'EAT',' 1' .: 'Plátanos fueron'} en la forma de los objetos.

Aplicar utilizado aquí, sólo se transmite a una matriz de clase de longitud, la matriz se convierte en indefinido composición de 10

Y luego analizar la segunda parte

.map(Number.call, Number)

El primer mapa es su función de devolución de llamada de devolución de llamada, y los parámetros por defecto para pasar función de devolución de llamada de tres; segundo parámetro es una función de cambio de la devolución de llamada interno este punto

El-el Mapa-Array MDN
función de devolución de llamada se pasa automáticamente tres parámetros: los elementos de la matriz, índice de elemento, la propia matriz original.
arr.map new_array = var (función de devolución de llamada (CurrentValue [, índice [, Array]] ) {
// para la new_array elemento de retorno
} [, thisArg] )
método Mapa da a cada elemento en la matriz original se denominan secuencialmente una vez devolución de llamada función. cada valor de retorno de devolución de llamada después de la ejecución (incluyendo sin definir) combinados para formar una nueva matriz

Number.call equivalente a la Function.prototype.call anteriores se pueden cambiar:

.map(function() {
    return Function.prototype.call.apply(this,arguments)
},Number)

Y luego cambiarlo (para reemplazar el segundo número de parámetros fuera de este):

.map(function() {
    return Number.call(arguments[0],arguments[1],arguments[2])
})

Además de la primera parte:

[undefined,undefined,...].map(function() {
    return Number.call(arguments[0],arguments[1],arguments[2])
})

En este punto los argumentos [0] no está definido, ya saben:

Number.call(undefined,1) //1  => Number(1)

Desde Number () acepta un solo parámetro, es decir, los argumentos [2] se ignora
hay

[undefined,undefined,...].map(function() {
    return Number(arguments[1]) //这里的第二个参数是数组索引(0,1,2,3.....)
})

Por último, el resultado natural de [0,1,2,3,4,5,6,7,8,9] salió!

Si no está lo suficientemente familiarizado js método, y estos ya no son un problema!


Una vez más una matriz plana de funciones
function Fuente: ¿realmente lo entiende ES6 (b)

function flatten(arr) {
    while(arr.some(res => Array.isArray(res))) {
        arr = Function.apply.call([].concat, [], arr)
    }
    return arr
}
flatten([1,[2,[4,5]]]) //[1, 2, 4, 5]

Se recomienda su primera ola de análisis.

análisis:

ARR-algunos-el MDN
arr.some (devolución de llamada (Element [, índice [, Array]]) [, thisArg])
Este método es a la acción iterate para ver si al menos una condición está presente dentro de la devolución de llamada satisfecho, es decir, la presencia de retornos verdaderos, de lo contrario Volver a falso
el MDN la concat-ArR-
var = new_array old_array.concat (VALUE1 [, valor2 [, ... [, valueN]]])
se combinaron 2+ array, sin cambiar la matriz original, una nueva rendimientos de matriz

La extracción de parte clave

// 如果arr成员中存在数组,就一直执行while内部代码块
while(arr.some(res => Array.isArray(res))) {
   arr = Function.apply.call([].concat, [], arr)
}

Para arr = Function.apply.call ([]. Concat , [], arr) simplificarse

arr = [].concat.apply([], arr)
//为了便于理解再变一下
arr = Array.prototype.concat.apply([],arr)
//在变一下,结合上面实例
arr = [].cancat(arr[0],arr[1]) // arr[0]代表的是1+个arr的非数组类型成员,
//arr[1]则代表的是1+个arr的数组类型成员

Cuando hay una gran variedad arr miembros, continuará concat,
hacer una pequeña demostración:

Array.prototype.concat.apply([],[1,[2,[3,4]]]) //[1, 2, Array(2)]
var step1 = Array.prototype.concat.apply([],[1,[2,[3,4]]])
step1 //[1, 2, [3, 4]]
var step2 = Array.prototype.concat.apply([],s1) 
step2 // [1, 2, 3, 4]

El siguiente es el uso de dos propiedades

//1
[].concat(1,[1,2]) // [1,1,2]
//2
function f(){ this.name = 'xx'; }
f.apply(thisArg,arr) => f(arr[0],arr[1],...) { thisArg.name = 'xx'};

Entender los lugares equivocados ven Dime lo que nos ha educado

¿Te gusta bolos? Tengo una jirafa, se puede exprimir usted!

Publicado 15 artículos originales · ganado elogios 3 · Vistas 3436

Supongo que te gusta

Origin blog.csdn.net/qq_39370934/article/details/103633484
Recomendado
Clasificación