ホームページ > ウェブフロントエンド > jsチュートリアル > javascript parseInt オーバーホール_javascript スキル

javascript parseInt オーバーホール_javascript スキル

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-05-16 18:45:52
オリジナル
1073 人が閲覧しました

隅から隅まで学び、経験を習得したと自分を応援したことを今でも漠然と覚えています。

同じ問題に何度も悩まされた後の、無力感と苦しい決意を今でもおぼろげに覚えています。

まず、私はこの問題を何度も強調してきたにもかかわらず、同じような間違いを何度も犯した人々に感謝しなければなりません。
彼らの度重なる間違いに対する励ましがなかったら、おそらく私はこの問題の解決策を真剣に考えなかったでしょう。
次に、『JavaScript Advanced Programming』の著者および翻訳者に感謝しなければなりません。
ここで私はこの問題を解決するためのインスピレーションを得ました。そうでなければ、parseInt を使用するときに何に注意を払う必要があるかを強調する必要があります。


同時に、単なる解決策以上のものがここに残されていることを願っています。
問題を解決するためのアイデアやアイデア、および他の問題について推論を導き出した経験をここに保管してください。

質問:
昔に起こった問題に関する辛い記憶を思い出したくありません。
今回の質問はとてもシンプルです。 2 つの月を比較する場合、文字列から月が抽出されるため、parseInt を使用して変換されます。
parseInt("08") の後の結果は 0
理由は、下記『JavaScript 応用プログラミング』の 19 ~ 20 ページの parseInt 関数の説明を参照してください。

parseInt() メソッドには、2 進数、8 進数、16 進数、またはその他の基本文字列を整数に変換できる基本モードもあります。
基数は parseInt() メソッドの 2 番目のパラメータで指定されるため、16 進値を解析するには、次のように parseInt() メソッドを呼び出す必要があります:

コードをコピーします コードは次のとおりです:

var iNum1 = parseInt("AF", 16) //Return 175

もちろん、2 進数、8 進数、または 10 進数 (デフォルト モード) の場合は、次のように parseInt() メソッドを呼び出すことができます:
コードをコピー コードは次のとおりです:

var iNum1 = parseInt("10", 2); //return 2
var iNum2 = parseInt("10", 8); //リターン 8
var iNum3 = parseInt("10", 10) //リターン 10
;
10 進数の先頭に 0 が含まれる場合は、誤って 8 進数値を取得しないように、基数 10 を使用することをお勧めします。例:

var iNum1 = parseInt("010"); // 8 を返します
var iNum2 = parseInt("010", 8) // 8 を返します
var iNum3 = parseInt( " 010", 10); //Return 10

このコードでは、コードの両方の行で文字「010」が数値に解析されます。

コードの最初の行は、この文字列を 8 進数値として扱い、コードの 2 行目 (基数 8 を宣言) と同じ方法で解析します。コードの最後の行では基数 10 を宣言しているため、iNum3 は最終的に 10 になります。

最初の試み:
以前の解決策は、誰もが parseInt 関数を放棄し、すべてを parseFloat に置き換えるというものでした。
しかし、人間として「決して忘れられない人」がいるでしょうか?
最善の方法は、parseInt の「形状」を保持し、parseInt の「神」を廃止することです。
そこで、『高度な JavaScript プログラミング』の 87 ~ 88 ページにある「既存のメソッドの再定義」の手順を考えました。
3.6.2 既存のメソッドの再定義
既存のクラスに新しいメソッドを定義できるのと同じように、既存のメソッドを再定義することもできます。
前の章で述べたように、関数名は関数への単なるポインタであるため、他の関数を指すように簡単に作成できます。 toString() などのローカル メソッドが変更された場合はどうなりますか?

Function.prototype.toString = function () {
return "Function code hidden";
}
前のコードは完全に正当であり、実行結果は期待どおりです。 🎜>function SayHi ( ) {
alert("Hello!");
}
alert(sayHi.toString()); // 出力 "関数コードが隠されています"
まだ覚えているかもしれません。第 2 章の Function で紹介されている toString() メソッドは、通常、関数のソース コードを出力します。
このメソッドをオーバーライドして、別の文字列 (この場合は「Function code hidden "」) を返します。
しかし、toString() が指す元の関数はどうなったのでしょうか?完全に廃止されたため、ガベージ コレクターによって再利用されます。
元の関数を復元する方法はないため、元のメソッドを上書きする前に、将来の使用に備えてそのポインタを保存しておくと安全です。
特定の状況では、新しいメソッドで元のメソッドを呼び出すこともできます。
Function.prototype.originalToString = Function.prtotype.toString;
Function.prototype.toString = function () {
if (this.originalToString().length >100) {
return "関数が長すぎて表示できません。"
} else {
return this.originalToString();
at Inこのコードでは、コードの最初の行で、現在の toString() メソッドへの参照が、originalTo-String 属性に保存されます。次に、カスタム メソッドで toString() メソッドをオーバーライドします。
新しいメソッドは、関数のソースコードの長さが 100 を超えているかどうかをチェックします。
その場合、関数コードが長すぎることを示すエラー メッセージを返します。それ以外の場合は、originalToString() メソッドを呼び出して関数のソース コードを返します。

この例によれば、
Global.prototype.parseInt = Global.prototype.parseFloat;
その後、parseInt 関数は実際には単なる外観にすぎなくなります。 parseFloat アクティビティの関数。
しかし同時に、致命的な問題も目の前にあります。
これは JavaScript の Global オブジェクトであり、まさに神のような、単なる概念です。
手順については、以下の「高度な JavaScript プログラミング」の 70 ページの「組み込みオブジェクト」の説明を参照してください。
Global オブジェクトは、実際にはまったく存在しないため、ECMAScript で最も特殊なオブジェクトです。
次のコードを記述しようとすると、エラーが表示されます:
var pointer = Global;
エラー メッセージは、Global がオブジェクトではないことを示していますが、Global がオブジェクトであることを示しているだけではありませんか?物体?
その通りです。ここで理解すべき主な概念は、ECMAScript には独立した関数は存在せず、すべての関数は何らかのオブジェクトのメソッドである必要があるということです。
この本で最初に紹介した isNaN()、isFinite()、parseInt()、parseFloat() などの関数はすべて独立した関数のように見えます。
実際には、これらはすべて Global オブジェクトのメソッドです。

それでは、オンラインにアクセスして、Global オブジェクトを取得する方法、または Global.prototype を使用して parseInt 関数を変更する方法を確認してください。
ご想像のとおり、結果は神は神であり、有名な「Sou Shen Network」の Google でも見つけることができません。
諦めかけたとき、「死は生の前にある」という言葉に本当に反応しました。parseInt はグローバル関数のようなもので、どのオブジェクトからも呼び出す必要がないことに突然気づきました。
上の文を parseInt = parseFloat; に変更するだけでよいということですか?
確かに、神はどこにでもいます! ! ! それは動作します! ! !


詳細な調査:
問題は基本的に解決されました。唯一注意が必要なのは、JavaScript の読み込みでエラーが発生した場合、以下のステートメントは読み込まれず、実行されないことです。
したがって、この文は最初の文で実行される必要があります。現在、JavaScript ユニバーサル メソッド ライブラリを構築しているところですが、今後すべてのページでこのライブラリ ファイルをインポートする必要があります。
この文を JavaScript の一般メソッド ライブラリの 1 行目に入れておけば、これからはゆっくり座ってリラックスできます。
しかし、このコードのコメントを書いているとき、特にその適用方法を列挙しているときに、次のコードに問題があることがわかりました。
alert(parseInt("010", 2)) //10
alert(parseInt ("010", 8)); //10
alert(parseInt("010", 10)); //10
各処理の戻り値は 10 です。つまり、バイナリは8 進数と 16 進数の parseInt は処理されなくなりました。
単一パラメータの parseInt が多くの問題を引き起こしたとしても、問題を引き起こさなかった 2 パラメータの parseInt に対する特別な関数を維持したいと考えています。
そのため、さらなる改善が必要です。
その後、parseInt関数を使用する際に渡されるパラメータの数に基づいて判断して処理する必要があります。
パラメータが 1 つだけの場合は、parseFloat を呼び出して結果を返します。
パラメータが 3 つ以上ある場合は、parseInt を呼び出して 2 つのパラメータを処理し、結果を返します。
ここで引数オブジェクトはパラメータの数を決定するために使用されます。「JavaScript 高度なプログラミング」の 53 ~ 54 ページの引数オブ​​ジェクトの説明を参照してください。
関数コードでは、特別なオブジェクト引数を使用すると、開発者はパラメータに明示的に名前を付けずに引数にアクセスできます。
たとえば、関数sayHi()では、最初のパラメータはmessageです。
最初の引数の値であるこの値には、arguments[0] を使用してアクセスすることもできます (最初の引数は位置 0、2 番目の引数は位置 1 など)。
したがって、関数は引数を明示的に指定しなくても書き換えることができます。
function SayHi() {
if (arguments[0] == "bye") {
return; 🎜>alert(arguments[0]);
}
次のコードがあります:
originalparseInt = parseInt;
parseInt = function (){
if(arguments.length == 1){
return parseFloat(arguments[0]);
} else {
returnoriginalparseInt(arguments[0], argument[1]);
このコードでは ParseIntパラメータの数に応じて異なる処理を実行するように変更されました。
新しい変数originalparseIntを使用してparseIntのプロトタイプを保持します。
このようにして、parseInt を変換しても、保持されたプロトタイプ変数originalparseInt を通じて、parseInt の元の関数を引き続き使用できます。

自然に戻る:
コードを書いたとき、私はすべてがうまくいったと思っていましたが、誰かが、それが parseInt 関数の 2 進数および 8 進数システムの処理を完全に消し去ったと言いました。
あなたも考えてみてください。扱いが極端すぎるので、面倒な parseInt 関数を parseFloat に完全に置き換えたいだけです。
実際に 2 進数または 8 進数の変換を使用している場合は、維持するのに苦労した parseInt 関数の新しいプロトタイプ変数originalparseInt を使用する必要があります。
実際、私たちの願いはとてもシンプルです。
parseInt 関数にパラメータが 1 つしかない場合、先頭の 0 によって頭の痛いバグが発生しないように、単純に 10 進数変換を処理するようにしたいと考えています。
2 番目のパラメータを使用し、2 進数または 8 進数を処理したい場合でも、parseInt の既存の関数を使用できます。
最終的なコードは次のとおりです。
js ファイルのサイズを考慮して、コードの量をできる限り減らすようにしてください。したがって、originalparseInt は $parseInt に置き換えられました。
さらに、非常に長い組み込みオブジェクト名の引数は文字 a に直接置き換えられます。このように、オブジェクトを 4 回使用することで節約されるコードの量は非常に多くなります。


1 つの例を他のケースに適用します。
parseInt 関数の再構築が完了しました。
実際、この変換の経験に基づいて、同様の迷惑な特性を持つ JavaScript メソッドを parseInt に変換できます。
たとえば、W3C 組織によって非推奨となった Escape や unescape などのメソッドは、推奨メソッドに置き換えることができます。

escape = encodeURI;
unescape = decodeURI;この経験に基づいて、将来同様の問題に遭遇した場合は、宇宙をシフトするこの方法を使用して問題を解決することを検討できます。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート