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)
ある種のもの)を使用することと関係があると思います。
私はもうその質問を見つけることができないようです、これが私が知りたかったことです:
while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step)));
step < 0
関数は希望どおりに動作するので、 falseの場合は&& eCode >= (sCode+=step)
無視され、の値はsCode
変更されないというのは正しいと思います。チェックがtrueの場合、
in /decrementedになります。新しく割り当てられたの値がと比較されることを確認するために、この割り当てを角かっこで囲んでいます。繰り返しになりますが、角かっこは論理演算子よりも割り当てを優先すると思います。step
sCode
sCode
eCode
これはすべてのブラウザに当てはまりますか、それともある程度ブラウザ固有ですか?sCode
一部のブラウザでは、この関数が値を2回インクリメント(またはデクリメント)する可能性はありますか?
この場合、それはそれほど重要ではありません(問題を防ぐための簡単な修正です)。しかし、この動作がJavaScript自体に固有なのか、ブラウザーの実装に固有なのかを知りたいのです。
これをずっと読んでくれてありがとう。他のいくつかのことを気にしない場合
(重要ではありませんが、疑問に思っているだけです):
- JavaScriptの最大charCodeは何ですか?グーグルをざっと見ただけではわかりませんでした。JSコンソールでテストしたところ、
5999999999989759
これはほとんど信じられないことだと思いましたが、中国語をブラッシュアップする必要があるかもしれません。 - が未定義の場合
from
、(jslint承認済み)アプローチfrom.toString().charCodeAt(0);
は失敗します。これは、明らかにメソッドundefined
がなかったためですtoString
。なぜ、はすべて同じものを(''+from).charCodeAt(0);
返すのでしょうか。暗黙のうちにメソッドU
と呼ばれていると思いましたか?toString