elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Cambiando set y eval por this[]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cambiando set y eval por this[]  (Leído 1,145 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.831


Hackentifiko!


Ver Perfil
Cambiando set y eval por this[]
« en: 28 Septiembre 2026, 17:30 pm »

Me lo recomendó la IA hace unos días.

Intentando programar otra cosa usando eso, tengo
Código
  1. NroDePasoaVariar = Pasos+1;
  2. while (NroDePasoaVariar > 1) {
  3. NroDePasoaVariar--;
  4. // Resumen:
  5. TipoDePaso_ = "TipoDePaso"+NroDePasoaVariar;
  6. while (this[TipoDePaso_] < TiposDePaso) {
  7. this[TipoDePaso_] = this[TipoDePaso_]+1;

Me genera dudas esa última línea y no entiendo la explicación de la IA.
https://share.google/aimode/cuudJrnjDdLWT9p75

Yo antes hacía
set(TipoDePaso_, eval(TipoDePaso_)+1)
o tal vez
set(TipoDePaso_, eval(eval(TipoDePaso_))+1)
La cosa es que estoy creando una variable...
cuyo nombre depende del valor de TipoDePaso_
y cuyo valor depende del valor del valor de eso.
¿No?
Si TipoDePaso_ es "TipoDePaso1" entonces el set lo que hace es
TipoDePaso1 = eval("TipoDePaso1")+1
O sea, me confunde que es como si el resultado del mismo código
this[TipoDePaso_]
dependiera de si está a la izquierda o derecha del =
Si está a la izquierda, se mira el contenido y se le quitan las comillas
Si está a la derecha, se mira el contenido y se busca el valor
Voy a intentar probar el código pero aún no estaba como para eso.


En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.460


Turn off the red ligth


Ver Perfil WWW
Re: Cambiando set y eval por this[]
« Respuesta #1 en: 29 Septiembre 2026, 05:50 am »

Los corchetes son lo mismo que el punto, la unica diferencia es que si hay una expresión dentro, la evaluan.

Por ejemplo todos las formas siguientes hacen exactamente lo mismo:
Código
  1. var Persona = {}
  2.  
  3. persona.nombre = "manolo"
  4. persona["nombre"] = "manolo"
  5. persona["nom" + "bre"] = "manolo"
  6.  
  7. var nombreDePropiedad = "nombre"
  8. persona[nombreDePropiedad] = "manolo"
  9.  
  10. var nombreDePropiedad2 = "mb"
  11. persona["no" + nombreDePropiedad2 + "re"] = "manolo"

TODAS las opciones anteriores equivalen a persona.nombre = "manolo". Es todo lo mismo escrito de distinta forma.

El equivalente de este ejemplo a tu última linea del código sería:
Código
  1. while (persona.nombre < 10) {
  2. persona.nombre = persona.nombre + 1;
  3. }

Esto siempre va a devolver "manolo" + 10, porque estás sobrescribiendo la variable/propiedad en bucle sin hacer nada con ella. Es decir, no haces nada con "manolo1", ni "manolo2", etc. El while no está haciendo nada.

Quizás lo que intentas hacer es crear 10 propiedades distintas:
Código
  1. while (persona.nombre < 10) {
  2. persona["nombre" + i] = listadoDeNombres[i];
  3. }

Esto anterior crearía:
Código
  1. persona.nombre1 = "manolo"
  2. persona.nombre2 = "alicia"
  3. persona.nombre3 = "bob"
  4. //...


Si me explicas exactamente lo que quieres lograr y pasa todo el código, te puedo ayudar.

No tengo claro si respondí a tu pregunta, porque no tengo muy claro exactamente cuales son tus dudas. Intenta organizar mejor las preguntas, o dividir tu duda en problemas mas simples.

Espero que te aclarase algo.


« Última modificación: 29 Septiembre 2026, 05:55 am por @XSStringManolo » En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Tachikomaia


Desconectado Desconectado

Mensajes: 1.831


Hackentifiko!


Ver Perfil
Re: Cambiando set y eval por this[]
« Respuesta #2 en: 29 Septiembre 2026, 10:41 am »

Los corchetes son lo mismo que el punto, la unica diferencia es que si hay una expresión dentro, la evaluan.

Por ejemplo todos las formas siguientes hacen exactamente lo mismo:
Código
  1. var Persona = {}
  2.  
  3. persona.nombre = "manolo"
  4. persona["nombre"] = "manolo"
  5. persona["nom" + "bre"] = "manolo"
  6.  
  7. var nombreDePropiedad = "nombre"
  8. persona[nombreDePropiedad] = "manolo"
  9.  
  10. var nombreDePropiedad2 = "mb"
  11. persona["no" + nombreDePropiedad2 + "re"] = "manolo"

TODAS las opciones anteriores equivalen a persona.nombre = "manolo". Es todo lo mismo escrito de distinta forma.
Hasta ahí entendí.

Te explico lo que quiero hacer.

Imagina que tienes unos datos, por ejemplo:
Input  ResultadoDeseado
1        2
2        3
3        4
Quieres que el programa averigue qué debe hacerse a cada Input para que el resultado sea su correspondiente ResultadoDeseado.
La respuesta es Input+1, pero queremos que la averigue el programa.

Contaremos con funciones como estas supongo, aún no confirmé que sirvan:
Código
  1. funtion TipoDePaso1 () {
  2.   Resultado = Input+Valor;
  3. }
  4. funtion TipoDePaso2 () {
  5.   Resultado = Input*Valor;
  6. }
  7.  
etc.

Definimos valor.
Al 1er Input le aplicaremos la 1er función.
Si el resultado sirve, al 2ndo Input le aplicaremos la misma función.
Si el resultado sirve, al 3er Input le aplicaremos la misma función.
Si el resultado sirve, hemos terminado.
Si falla en algún caso, al 1er Input le aplicamos la 2nda función.
Y así sucesivamente, vamos probando las funciones.
Si todas fallan modificamos el valor y volvemos al inicio.

Pero imagina que los datos fuesen:
Input  ResultadoDeseado
1        3
2        5
3        7
Ahora la respuesta es Input*2+1, podría servir una sola función pero lo que intento hacer es que el programa aumente el número de funciones que prueba como solución.

En fin, no sé explicarlo mejor, tengo que variar cosas:
- La cantidad de pasos u operaciones de la fórmula que se prueba.
- El nro del paso a variar de dicha fórmula.
- En qué consiste ese paso, es decir a qué función se llamará.
- El valor que usará ese paso.
- El input que se prueba.
- El paso a ejecutar.
- El resultado que debe chequearse.
En fin, acá está lo que logré, faltan las funciones y no termina, tiene algún error quizá:
Código
  1. Datos = 3;
  2. Dato1 = 1;
  3. BuenResultado1 = 2;
  4. Dato2 = 2;
  5. BuenResultado2 = 3;
  6. Dato3 = 3;
  7. BuenResultado3 = 4;
  8. TiposDePaso = 2;
  9. Pasos = 0;
  10. while (Pasos < 2) {
  11. // Se prueba un método con un paso más, para probar métodos que sólo tienen 1 paso, luego métodos que tienen 2, etc:
  12. Pasos++;
  13. // Crea nuevo paso:
  14. this["PasoaProbar"+Pasos] = 0;
  15. trace("Creado el PasoaProbar"+Pasos);
  16. trace("su valor es "+this["PasoaProbar"+Pasos]);
  17. NroDePasoaVariar = Pasos+1;
  18. // Se indica que el paso a variar sea otro, para que varíe el último hasta que no se pueda, se reseteé, luego el penúltimo, y así, para lograr todas las variaciones posibles:
  19. while (NroDePasoaVariar > 1) {
  20. NroDePasoaVariar--;
  21. // Resumen:
  22. PasoaProbar_ = "PasoaProbar"+NroDePasoaVariar;
  23. // Se modifica el paso indicado:
  24. while (this[PasoaProbar_] < TiposDePaso) {
  25. this[PasoaProbar_] = this[PasoaProbar_]+1;
  26. trace(PasoaProbar1+" y "+PasoaProbar2);
  27. ValoraProbar = -1;
  28. // Se modifica el valor que usará el paso, para que por ejemplo se pruebe +1, +2, etc:
  29. while (ValoraProbar < 1) {
  30. ValoraProbar++;
  31. BuenResultadoHallado = true;
  32. DatoaProbar = 0;
  33. // Se modifica qué "Input" se chequea:
  34. while (DatoaProbar < Datos && BuenResultadoHallado == true) {
  35. DatoaProbar++;
  36. PasoaEjecutar = 0;
  37. // Se modifica el paso a ejecutar, para ver si el método (fórmula) sirve para lograr el resultado deseado con ese dato de input:
  38. while (PasoaEjecutar < Pasos) {
  39. PasoaEjecutar++;
  40. this["TipoDePaso"+this["PasoaProbar"+PasoaEjecutar]]();
  41. }
  42. if (this["Resultado"+Pasos] != this["BuenResultado"+DatoaProbar]) {
  43. BuenResultadoHallado = false;
  44. }
  45. }
  46. }
  47. this[PasoaProbar_] = 1;
  48. }
  49. }
  50. }

¿Qué tiene que ver con la duda inicial? No sé explicarlo, pero debo variar qué hace el paso, guardo su nombre para evitar concatenar varias veces, y a ese paso que tiene un valor que indica a qué función se llamará, le debo ir variando dicho valor.
Ese valor no es el mismo que usan las funciones.

Aj, también me falta que se grabe el valor usado, además estoy usando el mismo en cada paso al ejecutar, bueh.... sí, muchas cosas para hacer.

Mira, voy a poner cómo debería ser el resultado si hubiera traces:
Se probarán métodos de 1 paso.
El tipo del paso fue variado, ahora el tipo (valor, a qué función se llamará) del paso 1 es 1
El valor a probar fue variado, es -1
Se probará el método con el input 1
Ejecutando paso 1 cuyo tipo (valor) es 1
El resultado no coincide
El valor a probar fue variado, es 0
Se probará el método con el input 1
Ejecutando paso 1 cuyo tipo (valor) es 1
El resultado no coincide
El valor a probar fue variado, es 1
Se probará el método con el input 1
Ejecutando paso 1 cuyo tipo (valor) es 1
El resultado no coincide
En el paso 1 ya se probaron todos los valores especificados, se variará el tipo de paso
El tipo del paso fue variado, ahora el tipo (valor, a qué función se llamará) del paso 1 es 2
El valor a probar fue variado, es -1
Se probará el método con el input 1
Ejecutando paso 1 cuyo tipo (valor) es 2
El resultado no coincide
(...)
En el paso 1 ya se probaron todos los valores especificados, se variará el tipo de paso
En el paso 1 ya se probaron todos los tipos de paso, se probará modificar otro paso
El método actual no tiene pasos anteriores
Se probarán métodos de 2 pasos.
El método consiste en llamar a las funciones 1 y luego a la 0 (esos son los valores de los pasos, 1 y 0).
Ahora el tipo (valor, a qué función se llamará) del paso 2 es 1
Ahora el método es 1, 1
El valor a probar fue variado, es -1
Se probará el método 1, 1 con el input 1
Ejecutando paso 1 cuyo tipo (valor) es 1
Ejecutando paso 2 cuyo tipo (valor) es 1
El resultado no coincide
(...)
Se varió el tipo del paso 2, ahora el método es 1, 2
El valor a probar fue variado, es -1
Se probará el método 1, 2 con el input 1
Ejecutando paso 1 cuyo tipo (valor) es 1
Ejecutando paso 2 cuyo tipo (valor) es 2
El resultado no coincide

Más o menos eso es lo que quiero lograr. Como dije, en la ejecución de los métodos falta que se use el valor, no está guardado.

Lamento si no se entiende, no sé explicarlo mejor.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[?]Para que sirve eval()?
PHP
braulio-- 7 10,400 Último mensaje 27 Junio 2009, 03:13 am
por HardieVon
evitar XSS en eval() « 1 2 »
Nivel Web
nØFi# 11 11,764 Último mensaje 22 Noviembre 2009, 16:25 pm
por sirdarckcat
javascript seguridad eval
Desarrollo Web
matake 3 3,939 Último mensaje 25 Julio 2016, 03:07 am
por engel lex
equivalente a eval()? | javascript
Desarrollo Web
Drakaris 3 4,259 Último mensaje 25 Enero 2021, 00:17 am
por Drakaris
[Pregunta]: Problemas con javascript (eval)
Desarrollo Web
Leguim 2 4,489 Último mensaje 14 Octubre 2021, 23:55 pm
por MinusFour
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines