JavaScript開発者に見られるブレインファッカー

Javascript Php
// if ( 0 )  
      
      



 // if ( 0 )  
      
      



 if ( 2 ) 
      
      



 if ( 2 ) 
      
      



 if ( -1 ) 
      
      



 if ( -1 ) 
      
      



 if ( false == 0 ) 
      
      



 if ( false == 0 ) 
      
      



 if ( false == '0' ) 
      
      



 if ( false == '0' ) 
      
      



 if ( false == '00' ) 
      
      



 // if ( false == '00' )  
      
      



 if ( false == '0x0' ) 
      
      



 // if ( false == '0x0' )  
      
      



-JavaScriptが数字を含む文字列をより慎重に解析することがわかります。 さらに進む
 if ( 'bla bla bla' ) 
      
      



 if ( 'bla bla bla' ) 
      
      



 // if ( false == null )  
      
      



 if ( false == null ) 
      
      



-すばらしいですが、JavaScriptではfalseはnullではありません




 if ( false == !!null ) 
      
      



 if ( false == !!null ) 
      
      



-しかし、nullを2回拒否した場合-javascriptはPHPのように動作します
 // if ( false == undefined )  
      
      



 if ( false == $undefined ) 
      
      



-おっと! JavaScriptではundefinedもfalseではありません
 if ( false == !!undefined ) 
      
      



 if ( false == !!$undefined ) 
      
      



-二重否定は物事を再び変える
 // if ( false == 'false' )  
      
      



 // if ( false == 'false' )  
      
      



 if ( true == 1 ) 
      
      



 if ( true == 1 ) 
      
      



 // if ( true == 11 )  
      
      



 if ( true == 11 ) 
      
      



-別の機能-PHPでは、ゼロ以外の数値はすべてtrueです。 JSでは、1つだけ
 if ( 11 ) 
      
      



 if ( 11 ) 
      
      



-しかし、ifに直接数値を渡すと、両方の言語でゼロ以外のすべてが真になります
 // if ( true == '0' )  
      
      



 // if ( true == '0' )  
      
      



 if ( '0' ) 
      
      



 // if ( '0' )  
      
      



-おそらく、JavaScriptとPHPの最も陰湿な違い。 さらに
 // if ( true == 'true' )  
      
      



 if ( true == 'true' ) 
      
      



-また重要な違い-PHPは文字列を文字列にキャストし、JSは文字列を文字列にキャストします
 // if ( true == -1 )  
      
      



 if ( true == -1 ) 
      
      



-再び違い-JSではtrueが数値に減少し(1になる)、-1と比較されます。 そして、PHP -1では、ブイにキャストされます(本当であることがわかります)
 if ( 'bla bla bla' ) 
      
      



 if ( 'bla bla bla' ) 
      
      



 // if ( undefined )  
      
      



 // if ( $undefined )  
      
      



 if ( undefined == null ) 
      
      



 if ( $undefined == null ) 
      
      



 // if ( 1 == 2 )  
      
      



 // if ( 1 == 2 )  
      
      



 if ( 1 == '1' ) 
      
      



 if ( 1 == '1' ) 
      
      



 if ( 2 == '2' ) 
      
      



 if ( 2 == '2' ) 
      
      



 if ( 2 == '02' ) 
      
      



 if ( 2 == '02' ) 
      
      



 if ( 2 == '0x2' ) 
      
      



 if ( 2 == '0x2' ) 
      
      



 // if ( 2 == '0c2' )  
      
      



 // if ( 2 == '0c2' )  
      
      



 // if ( '-1' == true )  
      
      



 if ( '-1' == true ) 
      
      



 // if ( '' )  
      
      



 // if ( '' )  
      
      



 // if ( NaN == NaN )  
      
      



 //
      
      



-JSには、それ自体とは異なる変数さえあります! これはNaNです




JavaScriptで完全に自信を持って条件を記述したことがありますか?

素朴に、一部の人々は、JavaScriptでの彼らの不安は言語の知識が不十分であるためだと信じています。 実際、悪の根源はJavaスクリプト自体にあります。 脳を破壊するように特別に設計されています。 そして、ここに彼のやり方があります:



あなたは、考える人として、==演算子が型を比較す​​ると信じています。 また、ゼロ、null、false、空の文字列はゼロであると直感的に感じます。 また、ブール値にキャストする場合は、偽の値を与える必要があります。 また、ブール型の引数の1つが最初に2番目の値をブール型に変換し、それを比較する場合、演算子==であると思われますか? ハハハ、しかしいいえ、JavaScriptの作成者はあなたの脳細胞の破壊を見越して、手のひらをひどくこすります。



いいえ、JavaScriptは、==演算子と比較した場合、確かに型をキャストしますが、予想とは逆になります。 特にPHPで書いた人たち。



演算子==のドキュメントからの抜粋を次に示します。

2つのオペランドが同じ型でない場合、javascriptは型を変換し、厳密に比較します。 オペランドが数値またはブール値の場合、オペランドは数値に変換されます。 オペランドが文字列の場合-2番目は文字列に変換されます





しかし、ここに例があります:

 if( null == false ) //   
      
      







オペランドの1つはブール型です。 ドキュメントを信じている場合、両方のオペランドを数値に変換する必要があります。 数値(null)は0を与え、数値(false)は0を与えます。 条件を満たす必要がありますが、これは起こりません。 クリエイターだけが決めた-nullは特別な意味ですか? 口の中に足が! いいえ、むしろ彼は次のように考えました。nullはオブジェクト型です。 JavaScriptのfalseはObject型になり(内部に1つのfalse値を持ついくつかの愚かな配列オブジェクトが判明します)、次にこれら2つのオブジェクトを比較します 。 そしておそらくこれらの値の両方

文字列にキャストされ、「null」===「false」を取得しますか? いいえ、実際:



オペランドの1つがブール値の場合、trueであれば1(単位)に変換されます。 falseの場合は0(ゼロ)に。

オブジェクトが数値または文字列と比較される場合、javascriptはオブジェクトに対応する値を取得しようとします。 valueOfメソッドとtoStringメソッドを使用して、オブジェクトを基本値、文字列、または数値に変換します。 オブジェクトを変換できない場合、実行時エラーが生成されます。





とにかく、これは最善の解決策ではありません。 オペランドは弾丸にキャストされ、他の何かにキャストされることを期待しています。 この場合、PHPがより期待されます。



次に、内部にゼロがある行のfalseを確認します。

 if('0' == false) // ,    if('0') //      ! alert(String(false)); //   'false' alert(Boolean('0')); //  true
      
      







奇妙ですね。 「0」が偽であるが、if条件で直接テストすると、真になります。 すべてがシンプルです。 JavaScriptの作成者は、文字列をブイにキャストすると、 この文字列長さがチェックされることを決定しました。 文字列の長さがゼロより大きい場合、これは真です。 Falseは、文字列が空の場合にのみ発生します。 最初のケースでは、「0」== falseをチェックすると、文字列はブール値にキャストされませんが、falseはゼロにキャストされ、文字列「0」と比較されます。



数字でも同じこと-にもかかわらず:

 if(true == 2) //   //  if(2) // . alert(Boolean(2)); //  true alert(Number(true)); //  1
      
      







なんで? すべてが単純です-==演算子比較する場合のJavaスクリプトは、最初にtrue(1)になり、次にそれを2(2)と比較します。 もちろん、それらは等しくなく、条件は満たされません。 ご覧のとおり、ブール演算のJavaScriptでは、弾丸を数字にキャストすることを好みます。



しかし、無駄なことはほとんどありません。



簡単出口



最も簡単な方法は、オペランドの前に二重否定を置くことです!! 。 これにより、あらゆる型が確実にブール値にキャストされます。 ただし、PHPとは異なり、Javaスクリプトの!! '0'はtrueになることを覚えておく必要があります。 なぜなら、javaスクリプトはブール値にキャストするときに文字列の長さを測定し、PHPは最初に文字列の数値を計算してからブールに至るためです。



プログラマーの頭脳をSpaしまない



上記に頭を突っ込んだ場合、JavaScriptで何が起こっているのか、そしてPHPで何が起こっているのかとはなぜ違うのか、完全な図をすぐに作れないかもしれません。 詳細が不完全なため、写真は見苦しくなります。 事実、私たちはすべてを論理的に好きであり、システムを理解したい、

ルールの例外はすべて迷惑です。 例外は理解を損ない、不快感を生み出します。 理解できることをしましょう!



一部の作家は、プログラムを深く掘り下げて、自分の仕事の結果を利用する人々を消費者から忘れています。 大多数が期待することを忘れてください。 いくつかの内部ロジック

正当化は使いやすさよりも高くなりますが、これは根本的に間違っています。 ユーザーの頭脳をSpaしみ、作成しているものを冷静に見直し、この瞬間に何が欲しいか、そしてシステムに何を期待するかを考えてください。 これを行うには、自分自身に耳を傾けます。 そして、必ずユーザーの意見を聞いてください。



そうでなければ、JavaScriptのようになります。



ご清聴ありがとうございました、あなたの人生がもっと理解できたらいいのに、オレグ・ジョジク。



PS



ここで 、より視覚的な比較表を見ることができます。

控えめな広告: MicroMailを使用してファイルを送信することをお勧めします



All Articles