ObjectScript、仕様を共同で開発します:比較演算子

ObjectScriptは、組み込み可能で非常に軽量な新しいオブジェクト指向のオープンソースプログラミング言語です。 ObjectScriptは、JavaScript、Lua、PHPなどの言語の機能を拡張します。 構文は主にJavaScript、Luaからの複数の割り当て、およびPHPからのプロパティの操作から取得されます。



ObjectScriptプロジェクトは非常に新しく、最初に動作して安定したバージョンのみが最近登場しました。 それにもかかわらず、言語のいくつかの側面の仕様の問題は完全には解決されておらず、まだ開発中です。 たとえば、異なるスクリプト言語の比較演算子の動作は異なります。比較に関係するデータの種類と、特定のプログラミング言語で使用されるアルゴリズムによって異なります。



質問はかなり敏感です。 ブール式の結果に依存しますが、十分ではなく、コードの一部が実行されるかどうかです。 ロシアのことわざ「1つの頭は良いが、はるかに良い」は、プログラミングコミュニティに目を向け、比較するときの動作の種類を確実に理解する方がよいことを教えてくれます(演算子> =、>、<=、<、==、!=) スクリプト言語のデータ型最も適切です。 共同ソリューションを開発し、ObjectScript仕様に結果を統合します。



ObjectScriptはオブジェクトの比較演算子のオーバーロードをサポートしていますが、現在の質問では、null、boolean、number、stringのプリミティブデータ型のみの比較演算子の操作に焦点を当てることを提案します。



比較する際のPHPの仕組み



引数の1つが数値の場合、PHPは引数を数値型に変換します。 nullは0に、trueは1に、falseは0に、stringは最初の無効な文字まで数字に変換され、その後、数字が返されます(現在の数字)。 その結果、両方の引数が数値の場合、文字列が文字列の場合、数値比較が行われます。



次のPHPスクリプトを実行します。



echo "'a' > 'b' \t--> "; var_dump('a' > 'b'); echo "'a' < 'b' \t--> "; var_dump('a' < 'b'); echo "'a' > 1 \t--> "; var_dump('a' > 1); echo "'a' < 1 \t--> "; var_dump('a' < 1); echo "'1' > 1 \t--> "; var_dump('1' > 1); echo "'1' < 1 \t--> "; var_dump('1' < 1); echo "'+2.9' > 1 \t--> "; var_dump('+2.9' > 1); echo "'+2.9' < 1 \t--> "; var_dump('+2.9' < 1); echo "'2.9' > 1 \t--> "; var_dump('2.9' > 1); echo "'2.9' < 1 \t--> "; var_dump('2.9' < 1); echo "true > 1 \t--> "; var_dump(true > 1); echo "false < 1 \t--> "; var_dump(false < 1); echo "null > 1 \t--> "; var_dump(null > 1); echo "null < 1 \t--> "; var_dump(null < 1);
      
      





彼は出力します:



 'a' > 'b' --> bool(false) 'a' < 'b' --> bool(true) 'a' > 1 --> bool(false) 'a' < 1 --> bool(true) '1' > 1 --> bool(false) '1' < 1 --> bool(false) '+2.9' > 1 --> bool(true) '+2.9' < 1 --> bool(false) '2.9' > 1 --> bool(true) '2.9' < 1 --> bool(false) true > 1 --> bool(false) false < 1 --> bool(true) null > 1 --> bool(false) null < 1 --> bool(true)
      
      





JavaScriptの比較方法



JavaScriptは、引数の1つが数値の場合、引数を数値型に変換し、次のルールに従ってこれを行います:nullから0、undefinedからNaN、trueから1、falseから0、文字列で無効な文字が検出された場合、文字列は数値に変換されます。その後、NaNが戻ります。 その結果、両方の引数が数値(NaNも数値)の場合、比較は通常の数学的な方法で行われますが、NaNとの比較は常にfalseを返すことに注意する必要があります。 たとえば、PHPでの通常のプログラミングでは、NaNはめったにポップアップせず、個別に処理されることはほとんどありません。そのため、PHP文字列は、いずれの場合でも有効な数値に変換されます。エラーの場合、0が返されますが、JSでは状況が異なります。



比較時に引数が文字列の場合、文字列の比較が行われます。



PHPには未定義のデータ型はありませんが、nullのみです。 スクリプトをPHPからJSに変換する場合、PHP null、JS Jn null、またはJS th undefinedの代わりにjullを使用することを常に考えます。 そのため、JSテストに未定義を含め、その数と比較して動作を確認する必要があります。



ブラウザで次のJSコードを実行します。



 console.log("'a' > 'b' \t--> ", 'a' > 'b'); console.log("'a' < 'b' \t--> ", 'a' < 'b'); console.log("'a' > 1 \t--> ", 'a' > 1); console.log("'a' < 1 \t--> ", 'a' < 1); console.log("'1' > 1 \t--> ", '1' > 1); console.log("'1' < 1 \t--> ", '1' < 1); console.log("'+2.9' > 1 \t--> ", '+2.9' > 1); console.log("'+2.9' < 1 \t--> ", '+2.9' < 1); console.log("'2.9' > 1 \t--> ", '2.9' > 1); console.log("'2.9' < 1 \t--> ", '2.9' < 1); console.log("true > 1 \t--> ", true > 1); console.log("false < 1 \t--> ", false < 1); console.log("null > 1 \t--> ", null > 1); console.log("null < 1 \t--> ", null < 1); console.log("undefined > 1 \t--> ", undefined > 1); console.log("undefined < 1 \t--> ", undefined < 1);
      
      





コンソールには以下が表示されます。



 'a' > 'b' --> false 'a' < 'b' --> true 'a' > 1 --> false 'a' < 1 --> false '1' > 1 --> false '1' < 1 --> false '+2.9' > 1 --> true '+2.9' < 1 --> false '2.9' > 1 --> true '2.9' < 1 --> false true > 1 --> false false < 1 --> true null > 1 --> false null < 1 --> true undefined > 1 --> false undefined < 1 --> false
      
      





Luaの比較



Luaでは、数字と数字、文字列と文字列のみを比較できます。 それ以外の場合、次の形式のエラーがスローされます。数値と文字列を比較しようとします。 ブール値でさえ数値と比較されず、ブール値もブール値と比較されません。 nullの代わりに、Luaはnilを使用します。 nilは数値と比較できません; nilとnilは似ています。



一般的に、Luaでは、この問題に関するテスト自体は失敗しました。



ObjectScriptの比較方法



比較引数の1つが文字列の場合、文字列の比較が行われます。 そうでない場合(引数がプリミティブ型の場合)、それらは数値に変換され、数学的な比較が行われます。 nullが0に変換され、trueが1に、falseが0に変換され、文字列に無効な文字がある場合、文字列は完全に数値に変換され、0が返されます。



その結果、OS上のコードは次のようになります。



 print("'a' > 'b' \t--> ", 'a' > 'b') print("'a' < 'b' \t--> ", 'a' < 'b') print("'a' > 1 \t--> ", 'a' > 1) print("'a' < 1 \t--> ", 'a' < 1) print("'1' > 1 \t--> ", '1' > 1) print("'1' < 1 \t--> ", '1' < 1) print("'+2.9' > 1 \t--> ", '+2.9' > 1) print("'+2.9' < 1 \t--> ", '+2.9' < 1) print("'2.9' > 1 \t--> ", '2.9' > 1) print("'2.9' < 1 \t--> ", '2.9' < 1) print("true > 1 \t--> ", true > 1) print("false < 1 \t--> ", false < 1) print("null > 1 \t--> ", null > 1) print("null < 1 \t--> ", null < 1)
      
      





次を出力します。



 'a' > 'b' --> false 'a' < 'b' --> true 'a' > 1 --> true 'a' < 1 --> false '1' > 1 --> false '1' < 1 --> false '+2.9' > 1 --> false '+2.9' < 1 --> true '2.9' > 1 --> true '2.9' < 1 --> false true > 1 --> false false < 1 --> true null > 1 --> false null < 1 --> true
      
      





合計



結果を1つの表にまとめます。







専門家への質問



それでは、スクリプトプログラミング言語のリファレンスと見なされ、ObjectScript仕様で修正される比較動作は何でしょうか。



次のようにコメントで話してください すべての投票が得点になると確信しています。ObjectScriptの開発の将来の道を選択する上で決定的なのは、おそらくあなたの言葉でしょう。



ObjectScriptに関するその他の関連記事:






All Articles