[Javascript] Hilo General

Dashielle

#270 No sé si entiendo del todo tu pregunta, pero me da la sensación de que estás confundiendo parámetro con argumento.

En tu caso en nextInLine(arr), arr es el parámetro y como tal te tienes que referir a lo que pases como arr en el resto de la función - de ahí que tengas que hacer arr.push() o arr.unshift() y no testArr.push() o testArr.unshift()

testArr es el argumento, es decir, lo que le estás pasando a la función, que en este caso es una variable que guarda el array [1, 2, 3, 4, 5].

Te dejo esto por si te ayuda a aclarar el concepto, que cuando practicas acaba siendo muy obvio pero al principio puede ser algo lioso:

https://developer.mozilla.org/en-US/docs/Glossary/Parameter

1 1 respuesta
tuskas

#271 Perdon, es que me explico como el culo yo creo. Es que no entiendo la logica de programacion como tal yo creo. Estoy empezando y voy muy perdido.

El problema que tengo y que no entiendo es por que hay una const testArr con un array, y despues en una funcion que seria nextInLine(arr, item) no hay nada que se refiera al testArr. Como sabe que hay que coger o usar el testArr? por eso yo hacia push al testArr.

Es decir, tengo la funcion nextInLine(arr, item) hago el push y el shift al arr. Por que al arr y no al item, por ejemplo? no se, creo que todo esto me supera (o yo soy muy tonto, que puede ser).

Cuando he hecho una funcion alguna vez con por ej: function hola(a, b) luego en los ejemplos me han mandado cosas sencillas tipo suma = a + b y abajo pones hola(2, 3) y suma da 5, pero aqui me veo descolocado totalmente.

No se si te estoy liando mas todavia o hay algo que me falta de entender xD. Esto desmoraliza a cualquiera joder.

EnderFX

#270 Cuál es tu duda exactamente? Parece que tu problema es comprender bien lo que hacen push y shift.

Push añade un elemento al array sobre el cual estás llamando la función.

const arr = [1,2,3]
arr.push(5) // arr ahora contiene[1,2,3,5]

Así que lo primero que haces es añadir un elemento al array.

Shift() es una función que elimina el primer elemento de un array, y lo devuelve.

const arr = [1,2,3]
arr.shift() // arr ahora contiene [2,3]
const segundoValor = arr.shift() //  segundoValor es 2, y arr ahora contiene [3]

Push añade un elemento al final del array ("a la derecha"), mientras que shift extrae un elemento del inicio ("a la izquierda").
Así que nextLine lo único que hace es añadir el elemento que te pasan en item a arr, y a continuación extraer el primer elemento y devolverlo.

1 1 respuesta
Vedrfolnir

A ver, creo que la confusión que tiene es mucho más simple.

#270 Dices que pusiste push y shift, pero a testArr, no?
La cosa es que dentro del método nextInLine, los nombres de lo que recibes son arr e item.
Esos nombres se declaran cuando haces: function nextInLine(arr, item) {
Cuando se llama a: console.log(nextInLine(testArr, 6));
Le estás pasando testArr, pero luego dentro de la función, el nombre que va a usar es arr, a secas.
Por eso se le hace arr.push(item), y arr.shift. Y esto afecta al original que le has pasado, que es testArr.

Van por ahí los tiros?

2 1 respuesta
tuskas

#273 El shift, push, pop y unshift si lo entiendo, lo que no entiendo es por que se hace push al arr y eso se suma al array de constArr.

Como coño sabe esa funcion que pusheando el arr de nextInLine se ha de sumar al constArr?

EDIT: #274 eeeeexactamente creo que ese era mi problema!

2 2 respuestas
Vedrfolnir

#275 Efectivamente, léeme en #274 que creo que esa es tu confusión xD
Fuera de la función tiene un nombre (testArr), y dentro tiene otro (arr), pero en resumidas cuentas, es el mismo.

1 1 respuesta
TheBrotha

#275 Tu trabajo es coger un COCHE y hacerle lo que te pidan, cambio de aceite, cambio de llantas, etc. Los clientes vienen y te dejan un Ford, un Kia, un Mercedes, lo que sea, pero es un COCHE. Pues lo mismo aquí, tu no quieres cambiar en especifico el array que te van a pasar como testeo, porque entonces tu funcion solo serviría para ese array en concreto. Lo que quieres es que dado cualquier array, cogerlo y hacer lo que tengas que hacer. Por eso apuntas al argumento de la función.

1
tuskas

#276 Muchas gracias macho, de verdad.

Me estaba volviendo loco. Yo no se si estoy ya muy mayor para aprender estas cosas xD, le desmotivan a uno en dos segundos. Menuda tarde ayer para esto..

1 respuesta
Vedrfolnir

#278 Na, ni te rayes xD
Dudas así es normal al empezar (y también cuando ya sabes, no nos engañemos xD)

Cualquier cosica tú pregunta, que ya has visto que gente no falta para ayudar ;)

2
13 días después
widim

Buenas, una duda respecto a las arrow functions.

Tengo esto, un objeto literal cualquiera

const obj = {
 a: 'something',
 printProp: () => {
  console.log(this.a) 
 }
}

obj.printProp() // -----> undefined

Luego tengo una clase + objeto instanciado

class SomeClass {
  a = 'something'

  printField = () => {
    console.log(this.a)
  }
}

const sc = new SomeClass();

sc.printField()  // -----> 'something'

¿Por qué dentro de un objeto literal la arrow function no encuentra la propiedad y me tira undefined, pero creando un objeto mediante clase sí encuentra el field/propiedad?

Gracias.

1 respuesta
isvidal

#280 Es tema de scope, el this en un arrow function no referencia al objeto, si no al scope superior que normalmente sera el objeto window.

En una clase el this es una referencia la clase

1 1 respuesta
widim

#281 perfecto, gracias!

entonces en un objeto literal no se lleva a cabo el bindeo entre la arrow function y el objeto como tal, pero en los objectos instanciados de una clase sí

me gustaría saber el razonamiento que hay detrás de esta decisión XD

Soumynon

#258 Personalmente no estoy de acuerdo con lo que comentas, para mi al hacer uso de TypeScript debería ser obligatorio tipar lo que devuelve la función. La definición no debería depender de lo que devuelve, lo que devuelve debería de depender de la definición. Yo me atrevería a decir que es como una especie de test unitario que te asegura en todo momento que estás devolviendo lo que realmente quieres devolver, y a partir de ahí que TypeScript tome implícito lo que quiera más adelante. Si no se tipa, se está definiendo como any, y para eso no usaría TypeScript. Es más creo que prefiero el any a no poner nada xD

2 respuestas
Zoko

#283

Decir que si no tipas el ReturnType de una función estás definiendolo como any no es sólo un error, si no que es una barbaridad.
: /

1 respuesta
isvidal

#283 Veo tu punto, pero el propio TypeScript te va a petar por todos lados si cambias, por ejemplo, el valor de esa funcion de string a number, porque en todos los sitios donde la usas y donde asumia que devolvia string ya no lo devuelve. Pusieras o no pusieras el tipo que devolvia, por lo tanto, muchas veces se puede considerar solo ruido.

Y si de verdad tienes que ser muy claro con lo que devuelve, por X razon (libreria publica, api...) pues lo que haces son interfaces con absolutamente todo definido y donde typescript no tiene que adivinar nada.

Pero por ejemplo esta function

const juntaStrings = (string1, string2) : string => `${string1}${string2}`

Poner el : string es puro ruido que no aporta nada

1 1 respuesta
Soumynon

#284 Entiendo que lo dices porque sin any te infiere. Para mi es que es lo mismo, si no se tipa, dentro puede pasar cualquier cosa, y a mi lo que importa realmente es la firma de la función.

#285 Comprendo también vuestro punto, pero es que en mi opinión eso no es ruido, es simplemente la sintaxis de TypeScript y las consecuencias de hacer uso de él (sintaxis que a mi me parece muy buena). Considero que debe avisarte cuanto antes, tratando de seguir un poco la política de 'fail fast', y para mi el fallo ha de producirse en la propia función, no en quien haga uso de ella.

1 respuesta
Zoko

#286

Pero es que no es lo mismo y dentro no puede pasar cualquier cosa. Si yo he decidido que una funcion va a devolver un tipo en concreto no tengo por que tiparla al definirla y es exactamente igual de segura ya que para algo tenemos el typechecking y donde se use esa funcion ya chillará si he dejado de devolver un tipo concreto.

Siguiendo tu regla tambien tendrias que hacer esto, no?

const foo: string = 'foo';
2 respuestas
mrbeard

#287 Yo tipo incluso el ejemplo que has puesto, es una mala práctica?

1 respuesta
EnderFX

#288 Es redundante e innecesario. Si quieres tipar todo, adelante, pero es más normal dejar al compilador de TS que haga su trabajo. Si inicializas una variable a string, el compilador infiere fácilmente que es de tipo string. En algunos casos, como valores de retorno de una función, es entendible que quieras añadir tipos para que quien vaya a consumir el código sepa qué retorna, pero si declaras e inicializas una constante a un tipo primitivo, no tanto.

También harías esto (mismo caso)?

const a: string[] = ['a', 'b', 'c'];
const b: string[] = a;
1 1 respuesta
mrbeard

#289 Si, es algo que hago, no llego mucho con TS, creía que más que redundante era una buena práctica.

1 respuesta
EnderFX

#290 Cuando sea algo como una función, que tú o alguien vaya a querer re-utilizar, hazlo. Pero te diría que al menos, como regla general, dentro del cuerpo de una función tengas solo lo necesario. No vas a ganar mucho, el IDE sabe autocompletar (y tú mismo con ctrl/cmd+click normalmente puedes ver dónde se define cada variable o tipo) y una función tiene un contexto muy aislado (sus variables no existen fuera de ella o sus closures).

Soumynon

#287 Pondría el límite precisamente en tu ejemplo, no tiparía asignaciones directas de datos primitivos. No me da valor. Una función que devolviera un string tras realizar una determinada lógica sí, ya que primero programo la definición de lo que quiero y luego lo implemento. Al final como digo, yo lo que busco es que si cometo un error me avise en el nivel más bajo posible

EnderFX

En mi caso, para mí es mucho más importante otras prácticas como intentar no usar any/never. Al final, yo lo que quiero es que TS sepa el tipo de todas las variables y funciones que voy a utilizar, no escribir más código. Si todo pasa los checks de TS es porque TS sabe qué valor tiene todo, ya sea inferido o no.
Es decir, te va a avisar igual ya sea por inferencia de tipos que porque lo has puesto a manubrio

1 respuesta
Soumynon

#293 Avisar te va a avisar igualmente, es correcto, pero si una función no devuelve lo que tú quieres te va a avisar más adelante, cuando trates el dato devuelto. Para mí debe avisarte en la propia función, no veo razón para que un error se propague fuera de ella.

1 respuesta
Wei-Yu

un poco bikeshedding no

1
EnderFX

#294 depende de lo que hagas y quieras. No te va a avisar en la propia función porque una función puede devolver tipoA | tipo B | tipoC. Si lo que quieres es que te controle, te doy la razón. Y de hecho en valores de retorno de funciones no veo mal añadir el tipo. Aún así, para funciones sencillas con un único return claro (por ejemplo, utilidades para strings) te lo puedes fumar fácil.

Pero obviamente, cada uno pone la línea donde quiere y le busca una utilidad distinta, lo cual no tiene ningún problema.

1
12 días después
Runt

Buenas. ¿Hasta qué punto es buena práctica/recomendable tener una sola función donde creas un elemento padre con unos cuantos hijos?

section>h1+p*5+progress

Ahora mismo tengo una función que se encarga de crear tanto el padre como los hijos, dar valores correspondientes y añadirlos al DOM. ¿Debería hacer funciones independientes para la creación de los elementos y la asignación de valores y por último, otra función que se encargue de añadir los elementos al DOM, o quizás esto último es añadir demasiada complejidad?

29 días después
Wei-Yu

Me encontré el artículo por reddit y está bastante guay para nubs como yo.

https://frontendmastery.com/posts/the-new-wave-of-react-state-management/

2
Simdrom

Buenas! Una preguntilla, me he puesto a estudiar web dev (vengo del backend típico de Java+Spring+SQL, de fintechs cárnicas de mierda) y después de un curso muy interesante de Angela Yu (https://www.udemy.com/course/the-complete-web-development-bootcamp/) estoy haciendome otro curso que tenía ya comprado de Maximilian Schwarzmüller (https://www.udemy.com/user/maximilian-schwarzmuller/) y tengo pensado hacerme un último curso de CSS (https://www.udemy.com/course/advanced-css-and-sass/) ya que es lo que más más más flojeo.

Teniendo un poco este contexto, me sabríais decir páginas o repos de Katas y estos temas? Estoy muy perdido y quiero hacerme katas, ya sean diaras, semanales o mensuales pero no tengo ni idea, ¿alguina recomendación?

1 respuesta
RedSpirit

#299 No sé si es lo que buscas pero por ejemplo:

https://www.frontendmentor.io/
https://100dayscss.com/days/1/
https://www.codewell.cc/

1