5

rangeJSでちょっとした機能をまとめました。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になります。新しく割り当てられたの値がと比較されることを確認するために、この割り当てを角かっこで囲んでいます。繰り返しになりますが、角かっこは論理演算子よりも割り当てを優先すると思います。stepsCodesCodeeCode

これはすべてのブラウザに当てはまりますか、それともある程度ブラウザ固有ですか?sCode一部のブラウザでは、この関数が値を2回インクリメント(またはデクリメント)する可能性はありますか?
この場合、それはそれほど重要ではありません(問題を防ぐための簡単な修正です)。しかし、この動作がJavaScript自体に固有なのか、ブラウザーの実装に固有なのかを知りたいのです。


これをずっと読んでくれてありがとう。他のいくつかのことを気にしない場合
(重要ではありませんが、疑問に思っているだけです):

  • JavaScriptの最大charCodeは何ですか?グーグルをざっと見ただけではわかりませんでした。JSコンソールでテストしたところ、5999999999989759これはほとんど信じられないことだと思いましたが、中国語をブラッシュアップする必要があるかもしれません。
  • が未定義の場合from、(jslint承認済み)アプローチfrom.toString().charCodeAt(0);は失敗します。これは、明らかにメソッドundefinedがなかったためですtoString。なぜ、はすべて同じものを(''+from).charCodeAt(0);返すのでしょうか。暗黙のうちにメソッドUと呼ばれていると思いましたか?toString
4

2 に答える 2

2

step < 0falseの場合は&& eCode >= (sCode+=step)無視され、の値はsCode変更されないというのは正しいと思います

正しい。最初のオペランドがfalseと評価された場合、2番目のオペランドは評価されません。

ステップチェックがtrueになると、sCodeがイン/デクリメントされます。新しく割り当てられたsCodeの値がeCodeと比較されることを確認するために、この割り当ては括弧で囲んでいます。繰り返しになりますが、角かっこは論理演算子よりも割り当てを優先すると思います。

再度修正しますが、割り当ての優先順位は比較よりも低いため、割り当てを囲む括弧が必要です。

これはすべてのブラウザに当てはまりますか?

はい。このように動作しないものを見つけたら、私は信じられないほど驚きます。

が未定義の場合from、(jslint承認済み)アプローチ from.toString().charCodeAt(0);は失敗します。これは、明らかに、未定義にはtoStringメソッドがなかったためです。なぜ、は(''+from).charCodeAt(0);Uをすべて同じように返すのでしょうか。

の値をfrom空の文字列と連結するためです。の値fromundefined、であり、これは文字列に強制変換され、文字列「undefined」になり、その文字列のインデックス0の文字は「u」になります。

于 2012-06-22T15:31:57.983 に答える
2

演算子の動作は、ECMAScriptのすべての正しい実装で一貫しています。私はあなたが説明したものから逸脱するブラウザの実装を知りません。

ECMAScriptは標準で定義されています。http://ecmascript.org/

そして、はい、括弧は演算子の結合性を定義します。

于 2012-06-22T15:29:17.203 に答える