Tengo un archivo js con opciones y funciones predeterminadas importadas como se muestra a continuación. Estoy tratando de obtener todos los argumentos en la función, sin embargo, parece que no se pueden usar.
import {defaultOptions} from "../defaults.js" export function getConfig({ width = defaultOptions.width, height = defaultOptions.height, fontsize = defaultOptions.fontsize } = {}) { console.log(width); //shows width // I want to get all the arguments console.log(arguments); } Cuando llamo a la función sin parámetros como getConfig() y console.log(width) , muestra el ancho de las defaultOptions predeterminadas de defaults.js . Sin embargo console.log(arguments) devuelve el objeto Argumentos con una longitud de 1 donde el índice 0 : undefined .
¿Hay alguna manera de obtener todos los argumentos en tal función?
Actualización: consulte este JSFiddle para ver algo similar donde los valores predeterminados se especifican antes que la función, por ejemplo. https://jsfiddle.net/coolakul/fa9muzwh/8/
Para esta pregunta, es importante distinguir entre argumentos y parámetros . Los argumentos son lo que se pasa a la función cuando se invoca, sin tener en cuenta cómo la función se desestructura o establece los valores predeterminados en esos valores. Entonces, cuando llama a getConfig() sin argumentos y registra arguments.length , debe ser 0, independientemente de cómo getConfig desestructura o establece los valores predeterminados.
Los parámetros , por otro lado, son las variables en la definición de función que utiliza. Se les pueden asignar valores predeterminados o se pueden derivar de un argumento desestructurado.
No está claro lo que está buscando, si es un objeto que refleja los parámetros que usa la función o si es un objeto que refleja los valores pasados a la función (incluidas las variables no definidas desestructuradas). Voy a repasar ambos casos.
Para reconstituir los parámetros, una forma bastante torpe es usar las variables desestructuradas en un nuevo objeto:
import {defaultOptions} from "../defaults.js" export function getConfig({ width = defaultOptions.width, height = defaultOptions.height, fontsize = defaultOptions.fontsize } = {}) { // just assign them to parameters var parameters = { width, height, fontsize }; console.log(parameters); } Alternativamente, si defaultOptions representa todos y solo los parámetros pasados a la función (es decir, solo tiene width , height , tamaño de fontsize ), puede asignarlos con sintaxis extendida :
import {defaultOptions} from "../defaults.js" export function getConfig(options = {}) { var calculatedParameters = { ...defaultOptions, ...options }; var { width, height, fontsize } = calculatedParameters; console.log(calculatedParameters); } Para reconstituir los valores pasados, puede desestructurar el argumento y luego asignarlo nuevamente a una variable. Esta variable es casi idéntica al argumento en sí. En el siguiente ejemplo, los calculatedArguments son casi idénticos a options , excepto que ahora tendrán propiedades de ancho, alto y tamaño de fuente, incluso si representan valores indefinidos:
import {defaultOptions} from "../defaults.js" export function getConfig(options = {}) { var { width, height, fontsize } = options; var calculatedArguments = { width, height, fontsize }; console.log(calculatedArguments); // can also assign width, height, fontsize with default values ({ width = defaultOptions.width, height = defaultOptions.height, fontsize = defaultOptions.fontSize } = options); }let defaults = { width: 300, height: 500, symbsize: 25, margin: { top: 10, bottom: 10 } } class Config { constructor({ width = defaults.width, height = defaults.height, symbsize = defaults.symbsize, margin = defaults.margin } = defaults) { this.width = width this.height = height this.symbsize = symbsize this.margin = margin } getConfig() { return { width: this.width, height: this.height, symbsize: this.symbsize, margin: this.margin } } } const config = new Config({height: 1}) console.log(config.getConfig());usar la clase debería hacer el trabajo, o prefiero usarlo
Si no me equivoco, prueba esto:
import { defaultOptions } from "../defaults.js"; export function getConfig(arguments = {}) { const { width, height, fontsize } = arguments; console.log(width); console.log(arguments); } getConfig(defaultOptions);