5

He reunido una pequeña función range en JS. Lo probé en Chrome 19, FF e IE (7-9) y está funcionando bien. La pregunta que tengo tiene que ver con la declaración while.construcciones de flujo de control de JavaScript: navegador o específicos inherentes a JS

function range(from,to,step) 
{ 
    'use strict'; 
    var sCode,eCode,result; 
    result = []; 
    step = (!step || isNaN(step) || step === 0 ? 1 : step); 
    sCode = (''+from).charCodeAt(0); 
    eCode = (''+to).charCodeAt(0); 
    step *= (sCode > eCode && step > 0 ? -1 : 1); 
    do 
    { 
     if (String.fromCharCode(sCode)) 
     { 
      result.push(String.fromCharCode(sCode)); 
     } 
    }while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step))); 
    return result; 
} 

Recuerdo leer una pregunta aquí un tiempo de cómo maneja JS construcciones de flujo de control y los operadores lógicos. Creo que tiene algo que ver con verificar si un objeto tiene un determinado método, y si es así, usar su valor de retorno (if (event.returnValue && e.returnValue === true) tipo de cosas).
Me parece que no puede encontrar que más duda al respecto, esto es lo que quería saber:

while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step))); 

Dado que la función se comporta como yo quiero que, creo que estoy en lo correcto al decir que, si es step < 0 falso, && eCode >= (sCode+=step) se ignorará, dejando el valor de sCode sin cambios.
Cuando la verificación step es verdadera, sCode se reducirá/reducirá. Puse esta tarea entre corchetes, para asegurarme de que el valor recientemente asignado de sCode se comparó con eCode. Nuevamente, supongo que los corchetes darán prioridad a la asignación sobre el operador lógico.

Esto es cierto para los navegadores TODOS, o es un navegador específico en cierta medida? ¿Existe la posibilidad de que esta función incremente (o disminuya) el valor de sCode dos veces en algunos navegadores?
En este caso, no es tan importante (es una solución fácil para evitar cualquier problema). Pero quiero saber si este comportamiento es inherente al propio JavaScript o a la implementación del navegador.


Gracias por leer esto muy abajo. Si no te importa
Un par de otras cosas (no es importante, pero pregunto):

  • lo que es el máximo charCode en JavaScript? Una mirada rápida en google no me lo dijo, y las pruebas en la consola JS me llevaron a creer que esto era 5999999999989759, lo que parece casi increíble, pero de nuevo podría necesitar repasar mi chino.
  • Cuando no está definida from, el enfoque (JSLint aprobado) from.toString().charCodeAt(0); falla, porque, obviamente, no tenían undefinedtoString método, por qué el, hace (''+from).charCodeAt(0); retorno U todos lo mismo? Pensé que implícitamente llamaba al método toString?
+0

"al decir que, si' step <0' es falso ... "Creo que querías' step <0' Editar mi comentario: BRILLIANT question. Me encontré con problemas/problemas con esto (tal vez publiqué la pregunta original que mencionas). Recuerdo haber hecho un montón de pruebas. Voy a ver si puedo encontrar esta información en la especificación de JS. – taz

+0

@taz, no ... Lo siento, pero me cuesta concentrarme en los viernes: quise decir que, cuando la primera parte de la comprobación lógica (siendo 'paso <0') _evalúa a falso_, la segunda parte 'eCode> = ...' se ignorará. Ejemplo con valores 'while ((-1> 0 && 3> = (15 + = - 1)) || ...' la parte '&& 3> = (15 + = - 1)' será ignorada, ya que ' -1> 0' es falso de todos modos –

+0

No veo ninguna especificación para la evaluación de corto circuito (ver http://ecma-international.org/ecma-262/5.1/#sec-11) Recuerdo hace unos años Creo que encontré una situación en la que este comportamiento no era uniforme en todos los navegadores, pero no recuerdo cuál fue el resultado. – taz

Respuesta

2

creo que estoy en lo correcto al decir que, si step < 0 es falso, && eCode >= (sCode+=step) será ignorado, dejando el valor de sCode sin cambios

correcta. Si el primer operando se evalúa como falso, el segundo operando no será evaluado.

Después de que la verificación de pasos sea verdadera, sCode se reducirá/disminuirá. Tengo pero esta asignación entre paréntesis, para asegurarme de que el valor recientemente asignado de sCode se comparará con eCode. De nuevo, supongo que los corchetes darán prioridad a la asignación sobre el operador lógico .

correcta de nuevo, pero se requieren los paréntesis alrededor de la asignación, ya que la asignación tiene un lower precedence que una comparación.

¿Esto es cierto para TODOS los navegadores?

Sí. Me sorprendería muchísimo si encuentras uno que no se comporte de esta manera.

Cuando from está definida, el (JSLint aprobado) enfoque from.toString().charCodeAt(0); falla, porque, obviamente, no definido tenían ninguna toString método, por qué el, hace (''+from).charCodeAt(0); retorno T todos lo mismo?

Porque concatena el valor de from con la cadena vacía. El valor de from es undefined, que es coerced to a string, y termina con la cadena "indefinido", y el carácter en el índice 0 de esa cadena es "u".

+0

Gracias James. Sin embargo, en esa nota lateral de concatenación 'from': el valor de from no está definido, y no tiene el método' toString', sin embargo, su valor se convierte en una cadena. Supongo que es solo una de esas peculiaridades de JS, espero que una variable indefinida/no inicializada se comporte como 'null' y devuelva una cadena vacía cuando se convierta en una. –

+0

@EliasVanOotegem - El tipo 'undefined' se convierte a la cadena" undefined ". Esa es la forma como es. Ver el enlace a la especificación: http://es5.github.com/#x9.8 –

+0

Lo sé, pero el enlace que proporcionó muestra todos los resultados de una operación 'ToString'. Simplemente comenté el hecho de que es extraño que no proporcionen el método a un valor que se puede convertir en una cadena utilizando una solución alternativa (ligeramente fea). Incluso estoy tentado de llamarlo un truco, para ser honesto –

2

El comportamiento de los operadores es coherente para todas las implementaciones correctas de ECMAScript. No conozco ninguna implementación de navegador que se desvíe de lo que describió.

ECMAScript se define por la norma. http://ecmascript.org/

Y sí, los paréntesis, definirán la asociatividad de los operadores ..

+0

¿Hay algún lugar específico donde los hombres de ECMAScript? esto esto? – taz

+0

@taz: ¿Menciones qué parte? –

+0

Me refería a la evaluación de cortocircuitos – taz

Cuestiones relacionadas