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íanundefined
toString
método, por qué el, hace(''+from).charCodeAt(0);
retornoU
todos lo mismo? Pensé que implícitamente llamaba al métodotoString
?
"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
@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 –
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