Я собрал небольшую функцию range
в JS. Я тестировал ее в Chrome 19, FF и IE (7-9) и это работает хорошо Вопрос, который у меня есть, связан с оператором while
.
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;
}
Я помню, как читал здесь вопрос некоторое время назад о том, как JS обрабатывает конструкции потока управления и логические операторы. Я думаю, что в нем что-то есть что нужно сделать с проверкой того, есть ли у объекта определенный метод, и если да, то с использованием его возвращаемого значения ( if (event.returnValue && e.returnValue === true)
вроде того).
I похоже, я больше не могу найти этот вопрос, вот что я хотел знать:
while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step)));
Поскольку функция ведет себя так, как я хочу, я думаю, что прав, говоря, что если шаг < 0
является ложным, && eCode >= (sCode+=step)
будет игнорироваться, оставляя значение sCode
без изменений.
Если проверка step
выполнена true, sCode
будет увеличиваться/уменьшаться. Я заключил это назначение в скобки, чтобы убедиться, что при новом назначенном значении sCode
будет сравниваться с eCode
. Опять же, я предполагаю, что скобки будут давать приоритет присваиванию над логическим оператором.
Верно ли это для ВСЕХбраузеров или это зависит от конкретного браузера? есть ли шанс, что эта функция дважды увеличит (или уменьшит) значение sCode
в некоторых браузерах?
В данном случае это не так важно (это легко исправить, чтобы не возникало проблем). Но я хочу знать, присуще ли это поведение самому JavaScript или реализации браузера.
Спасибо, что дочитали до конца. Если вы не возражаете
Еще пара моментов (неважно, просто интересно):
5999999999989759
, что кажется почти невероятным, но опять же, мне, возможно, придется освежить свой китайский.from
не определено, подход (одобренный jslint) from.toString().charCodeAt(0);
терпит неудачу, потому что, очевидно, undefined
имел нет метода toString
, почему же (''+from).charCodeAt(0);
возвращает U
все равно? Я думал, что он неявно вызывает метод toString
?