Foros del Web » Programando para Internet » Javascript »

No entiendo esta sintaxis

Estas en el tema de No entiendo esta sintaxis en el foro de Javascript en Foros del Web. Hola estoy aprendiendo sobre las cookies en W3schools y se me prensento una sintaxis que no tengo ni idea que significa Cita: function setCookie(c_name,value,expiredays) { ...
  #1 (permalink)  
Antiguo 07/12/2010, 16:37
 
Fecha de Ingreso: abril-2009
Mensajes: 75
Antigüedad: 15 años, 8 meses
Puntos: 0
Pregunta No entiendo esta sintaxis

Hola estoy aprendiendo sobre las cookies en W3schools y se me prensento una sintaxis que no tengo ni idea que significa

Cita:
function setCookie(c_name,value,expiredays)
{
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}
El codigo completo esta en http://www.w3schools.com/js/js_cookies.asp

Porque esta encerrado en 2 parenteis y que significa ese signo de interrogacion y el : que no estan entre comillas...

Alguien me explica profavor
  #2 (permalink)  
Antiguo 07/12/2010, 16:48
Avatar de echoTREBOR  
Fecha de Ingreso: marzo-2010
Ubicación: Venezuela inc.
Mensajes: 56
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: No entiendo esta sintaxis

Ese es un Operador Condicional nativo de Javascript.

http://www.w3schools.com/js/js_comparisons.asp
  #3 (permalink)  
Antiguo 07/12/2010, 17:02
 
Fecha de Ingreso: diciembre-2010
Mensajes: 22
Antigüedad: 14 años
Puntos: 1
Respuesta: No entiendo esta sintaxis

entre 2 parentesis es que es una operacion...
en este caso compara expiredays con null...de ahi la interrogacion y puede coger 2 valores V-F que son los separados por los dospuntos

Si expiredays es nulo entonces la cokie vale c_name+ "=" +escape(value)+ ""
si no lo es vale c_name+ "=" +escape(value)+ ;expires="+exdate.toUTCString()

creo....
  #4 (permalink)  
Antiguo 07/12/2010, 17:06
 
Fecha de Ingreso: abril-2009
Mensajes: 75
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: No entiendo esta sintaxis

Ok haber si entendí... si la variable expiredays es null devuelve "" si esto es falso devuelve ;expires=(la fecha)

Pero todavia sigo sin entender el porqué de esos parentesis externos osea no debesira ser simplemente +
(expiredays==null) ? "" : ";expires="+exdate.toUTCString(); :(
  #5 (permalink)  
Antiguo 07/12/2010, 17:14
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 6 meses
Puntos: 310
Respuesta: No entiendo esta sintaxis

Los paréntesis exteriores están porque si expiredays no es null coge un string y lo concatena con otro, pero si no estuvieran esos paréntesis lo concatenaría sin importar lo que fuera expiredays. A ver si así lo ves mejor:
Cita:
// aquí se concatenan los dos strings del final si expiredays no es null
document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
// aquí el último string se suma siempre
document.cookie=c_name+ "=" +escape(value)+(expiredays==null) ? "" : ";expires="+exdate.toUTCString();
// igual que aquí
document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires=")+exdate.toUTCString();
Los paréntesis interiores están para que se vea mejor cuál es la expresión a evaluar, pero en este caso no harían falta.
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #6 (permalink)  
Antiguo 07/12/2010, 17:53
 
Fecha de Ingreso: abril-2009
Mensajes: 75
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: No entiendo esta sintaxis

muchisimas gracias ya entendí a la perfección!!
  #7 (permalink)  
Antiguo 07/12/2010, 18:23
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 7 meses
Puntos: 1485
Respuesta: No entiendo esta sintaxis

a nivel técnico, los paréntesis exteriores son para modificar el orden de la operación puesto que los operadores tienen un orden de precedencia. o sea, es como en la álgebra, para resolver un problema hay que seguir un orden específico: comienzas por paréntesis más internos, luego exponentes, multiplicación o división, y suma o resta. en la programación es el mismo principio. como dijo @cronos, los paréntesis internos estan presentes para mayor legibilidad.

¿qué sucede cuando se omite los paréntesis externos? primero tienes que comprender el tema de las precedencias. utilizando el mismo problema pero más simplificado.
Código:
// omitiendo parentesis ;

var string = "some string ";
string + variable == null ? "empty": "date string";
en la segunda línea hay tres operadores: + (concatenación), == (igualdad) y ?: (ternario). en el orden mencionado, el operador de la izquierda tiene mayor prioridad que el de la derecha. de modo que la evaluación vendría siendo algo similar a lo siguiente.
Código:
// el color rojo indica la operacion a realizar y en negrita el resultado ;

// problema original ;
// concatenar string con la variable ;
string + variable == null ? "empty": "date string";

// comparar la igualdad de la cadena concatenada con null ;
string_variable == null ? "empty": "date string";

// resolver el ternario de acuerdo al boolean ; 
// genera false porque un sting jamas es igual a null, 
// sea un string vacio o lleno ;
false? "empty": "date string";

// false siempre devuelve la segunda expresion del ternario ;
"date string" 
con los parentesis, el orden de la operacion cambia y por tanto el resultado. te lo dejo para que lo analices.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 07/12/2010 a las 19:58 Razón: error de redaccion ^_^
  #8 (permalink)  
Antiguo 07/12/2010, 19:53
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 6 meses
Puntos: 310
Respuesta: No entiendo esta sintaxis

Entonces ¿null se puede interpretar como false, pero false como null no? Osea
Cita:
var str = '', cosa = null, resultado;
resultado = cosa ? 'si': 'no'; // resultado = 'no'
resultado = str == null ? 'si' : 'no'; // resultado = 'no'
Saludos :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #9 (permalink)  
Antiguo 07/12/2010, 20:20
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 7 meses
Puntos: 1485
Respuesta: No entiendo esta sintaxis

depende el contexto. false es un boolean mientras que null es un tipo de objeto (si, aunque no lo creas, ver al final). al javascript ser un lenguaje sin declaracion de tipo de variable, los tipos de datos estan sujeto a coercion, o lo mismo que conversion de tipos. esto sucede cuando una instruccion (statement) requiere que el valor sea de un tipo especifico o cuando una expresion tiene que evaluar diferentes tipos de operandos. en este caso particular donde null es la condicion del operador ternario, el operador requiere un boolean, y por tanto null es convertido a false. pero eso no significa que null en si sea false, porque de lo contrario false tambien podria ser null, cosa que no sucede.


"ver para creer"
¿les suena la expresión? null significa nulo, que no tiene valor pese a que es un objeto. curiosamente, null produce un resultado distinto a los objetos cuando se realiza una conversion. eso es porque null es un tipo de objeto especial.
Código:
alert(typeof null); // 'object' ;
alert(Boolean(null)); // false ;
alert(Number(null)); // 0 ;
alert(String(null)); 'null' ;

alert(typeof {}); // 'object' ;
alert(Boolean({})); // true ;
alert(Number({})); // NaN ;
alert(String({})); // '[object Object]' ;
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 07/12/2010 a las 20:27
  #10 (permalink)  
Antiguo 08/12/2010, 05:17
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: No entiendo esta sintaxis

Cita:
Iniciado por zerokilled Ver Mensaje
depende el contexto. false es un boolean mientras que null es un tipo de objeto (si, aunque no lo creas, ver al final). al javascript ser un lenguaje sin declaracion de tipo de variable, los tipos de datos estan sujeto a coercion, o lo mismo que conversion de tipos. esto sucede cuando una instruccion (statement) requiere que el valor sea de un tipo especifico o cuando una expresion tiene que evaluar diferentes tipos de operandos. en este caso particular donde null es la condicion del operador ternario, el operador requiere un boolean, y por tanto null es convertido a false. pero eso no significa que null en si sea false, porque de lo contrario false tambien podria ser null, cosa que no sucede.


"ver para creer"
¿les suena la expresión? null significa nulo, que no tiene valor pese a que es un objeto. curiosamente, null produce un resultado distinto a los objetos cuando se realiza una conversion. eso es porque null es un tipo de objeto especial.
Código:
alert(typeof null); // 'object' ;
alert(Boolean(null)); // false ;
alert(Number(null)); // 0 ;
alert(String(null)); 'null' ;

alert(typeof {}); // 'object' ;
alert(Boolean({})); // true ;
alert(Number({})); // NaN ;
alert(String({})); // '[object Object]' ;
Excelente!
  #11 (permalink)  
Antiguo 09/12/2010, 05:42
Avatar de stock  
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 2.390
Antigüedad: 20 años, 5 meses
Puntos: 53
Respuesta: No entiendo esta sintaxis

Muy buena explicación la de @zerokilled, solo agregar que sucede algo semejante con los siguiente valores también:

- "" (String vacio)
- 0 (cero)
- undefined (indefinido)
- NaN (no numerico)

Estos valores también los convierte en falso cuando los metemos dentro de un condicional ;)

Código Javascript:
Ver original
  1. var x = "";
  2. if(x) //false
  3.  
  4. x = 0;
  5. if(x) //false
  6.  
  7. x = undefined;
  8. if(x) //false
  9.  
  10. x = NaN
  11. if(x) //false

Es muy importante considerar esto cuando desarrollamos con JavaScript!

Saludos

Etiquetas: sintaxis
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:47.