javascript arrays function

javascript - ¿Cómo join() produce diferentes resultados dependiendo de los argumentos?



arrays function (6)

Cuando se pasa una matriz para test , el objeto de arguments convierte en una matriz de matrices , no en una matriz simple de valores simples. Es la diferencia entre

arguments = [[1,2,3]];

y

arguments = [1,2,3];

Cuando se llama a .join en una matriz de matrices, cada matriz interna se convierte de forma implícita en una cadena, lo que da como resultado ''1,2,3'' : los valores de las matrices internas no se .join Los hijos inmediatos de la matriz externa se .join por el delimitador.

No puedo entender por qué la llamada join () a continuación produce resultados diferentes, dependiendo del tipo de argumento (s) proporcionado.

Esto es lo que encontré:

var test = function() { var args = Array.prototype.join.call(arguments,"_"); return args }; console.log(test([1,2,3])) // #1: returns 1,2,3 console.log(test(1,2,3)) // #2: returns 1_2_3

Dada la unión (argumentos, ''_''), ¿no debería producir una cadena delimitada por _ en las dos pruebas anteriores? ¿Por qué # 1 devuelve un valor delimitado por comas en su lugar?


El primero, el primer argumento es [1,2,3] que se une con el segundo argumento, que no es nada -> la salida es [1,2,3].toString() .

La segunda llamada, en realidad está uniendo los 3 argumentos, dando como resultado una salida de 1_2_3 .


El resultado es diferente, porque los arguments son diferentes.

En la primera llamada ( test([1,2,3]) , tiene un argumento que es una matriz. En la segunda llamada, tiene 3 argumentos, cada uno de los cuales es un número.

Array.prototype.join está destinado a ser llamado sobre arreglos. Stringificará cada uno de los elementos de la matriz.

En su primer caso, sus argumentos "array" solo tienen un miembro, que es un array en sí mismo. Este argumento será stringfied. Un array stringfied se convierte exactamente en lo que se registra en su código.


En el primer ejemplo, no está llamando a .join en la matriz sino a los arguments . Esa variable se rellenará con un objeto similar a una matriz que tiene una matriz como primer índice, en esencia, está llamando al equivalente de:

let myArguments = [[1, 2, 3]]; console.log(myArguments.join("_"));

en lugar de lo que haces (el equivalente a) en el segundo ejemplo:

let myArguments = [1, 2, 3]; console.log(myArguments.join("_"));


En su código, solo tiene un argumento en el primer ejemplo, que es una matriz. Unir un solo elemento eliminará los paréntesis:

var test = function() { var args = Array.prototype.join.call(arguments,"_"); return args }; console.log(test([1,2,3])) // args = [[1,2,3]] console.log(test(1,2,3)) // args = [1,2,3] console.log([[1,2,3]].join(''_'')) console.log([1,2,3].join(''_''))

Otra forma de ver esto es proporcionar otra matriz como un argumento para test() :

var test = function() { var args = Array.prototype.join.call(arguments,"_"); return args }; console.log(test([1,2,3], [4,5,6]))


Porque está pasando un argumento que es una matriz, por lo que lo convierte en una cadena, luego intenta unirlo a los otros argumentos (no hay ninguno), por lo que simplemente devuelve la cadena.

var test = function() { var args = Array.prototype.join.call(arguments, "_"); return args }; console.log(test([1, 2, 3])); console.log(test(1, 2, 3));

Puedes resolver esto comprobando si solo se ha pasado un argumento.

var test = function() { var args = arguments.length == 1 ? arguments[0].join("_") : Array.prototype.join.call(arguments, "_"); return args; }; console.log(test([1, 2, 3])); console.log(test(1, 2, 3));