• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Pruebas Online
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

207
Vistas
¿Array.map() usa un iterador como constructor?

Normalmente, este es un detalle que está oculto para el programador, pero como prueba, hice una nueva clase de matriz de extensión vectorial que cambió el constructor para desempaquetar una matriz de entrada y ahora Vector.map() dejó de funcionar:

 class Vector extends Array { constructor(array) { console.assert(Array.isArray(array), `Vector constructor expected Array, got ${array}`); // ignore special case of length 1 array super(...array); } add(other) { return this.map((e, i) => e + other[i]); } } let a = new Vector([1,2,3]); console.log(a.add(a));

Supongo que lo que sucedió en base a mi experiencia con Python es que Array.map() construye internamente un nuevo Array con un iterador, como el de Array.prototype[@@iterator]() , pero mi constructor Vector en su lugar toma un objeto Array. ¿Es esto correcto? Tal vez el mapa es una primitiva de la implementación de JS.

almost 3 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Esto no tiene nada que ver con los iteradores, es por la forma en que Array.prototype.map() crea el resultado.

El resultado será la misma subclase que el objeto al que se llama, por lo que llama a su constructor para crear el resultado. Espera que cualquier subclase de Array admita los mismos parámetros que Array : o bien el argumento es un entero único que es del tamaño de la matriz que se va a crear, o son varios argumentos para proporcionar el contenido inicial de la matriz.

Dado que la matriz sobre la que está mapeando tiene 3 elementos de largo, quiere crear un Vector con 3 elementos, por lo que llama a Vector(3) para crear esto.

Debe redefinir su clase para aceptar argumentos como Array :

 class Vector extends Array { constructor(...args) { // Allow it to be called with an Array argument and convert it to Vector. if (args.length == 1 && Array.isArray(args[0])) { if (args[0].length == 1) { // need to handle 1 element specially so it's not used as the length super(1); self[0] = args[0]; } else { super(...args[0]); } } else { super(...args); } } add(other) { return this.map((e, i) => e + other[i]); } } let a = new Vector([1, 2, 3]); console.log(a.add(a));

Esta implementación acepta todos los argumentos de Array y, además, acepta un array como único argumento para convertirlo en un vector.

almost 3 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda