JavaScript は非常にフォールトトレラントなプログラミング言語であり、他のプログラミング言語では合法でない多くの式が JavaScript では正常に機能します。
その結果、多くの奇妙なコードが生成されます。挑戦してみませんか?
このチャレンジでは、20 個の奇抜な表現が提示され、その出力を推測するように求められます。
1.
true + false
2.
**1.**
3.
[1, 2, 3] + [4, 5, 6]
4.
0.2 + 0.1 === 0.3
5.
10,2
6.
!!""
7.
+!![]
8.
true == "true"
9.
010 - 03
10.
"" - - ""
11.
null + 0
12.
0/0
13.
1/0 === 10 ** 1000
14.
true++
15.
"" - 1
16.
(null - 1) - "1"
17.
38 * 4343 * 2342+ ("true" — 0)
18.
5 + !5 + !!5
19.
[] + [1] + 2
20.
1 + 2 + "3"
true + false
2 つのブール値の間に加算演算子 (+) を使用しようとすると、数値に変換されます。
そして、 true
1
に変換され、 false
0
に変換される必要があることは誰もが知っています。したがって、 true+false
1
返します。
[,,,].length
[,,,]
は、3 つの空のスロットを持つ配列を出力します。最後のコンマは末尾のコンマです。
このように考えることができます。
[,] ==> [空,] [,,] ==> [空、空、] [,,,] ==> [空、空、空、]
したがって、 [,,,].length
3 を返します。
[1, 2, 3] + [4, 5, 6]
配列間で加算演算子 (+) を使用しようとすると、配列は文字列に変換されます。
配列を文字列に変換する場合、配列のtoString()
メソッドが呼び出されます。 toString()
メソッドは JavaScript によって内部的に使用され、配列をテキストとして表示する必要がある場合、その要素をカンマで接続します。
[1, 2, 3].toString() ==> '1, 2, 3' [4, 5, 6].toString() ==> '4, 5, 6'
so
[1, 2, 3] + [4, 5, 6] ==> '1, 2, 3' + '4 , 5, 6' ==> "1,2,34,5,6"
0.2 + 0.1 === 0.3
浮動小数点数はコンピュータで正確に表現することが難しいため、数学的な0.1
と0.2
コンピュータでのみ近似できます。表現。
0.1+0.2
の結果は、正確には0.3
ではありません。 JavaScriptに限らず、他のプログラミング言語でも同様の問題があります。
10, 2
カンマ ( ,
) も JavaScript では有効な演算子であり、各オペランドを (左から右に) 評価し、最後のオペランドの値を返します。
したがって、10,2 は 2 を返します
!!""
""
は空の文字列であり、ダミー値です。
注: 0、空の文字列 ""、null、および unknown はすべて仮想値です。
!
は論理的な「not」演算子で、true を false に、またはその逆に変換します。
!
2 回使用すると (つまり!!
)、通常の値がブール値に変換されます。したがって!""
false
を返します。
+!![]
配列は、空の配列も含め、すべて true 値です。したがって、 !![]
true
を返します。
!![]; // -> true
であり、 +
記号は true 値を数値表現1
に変換するため、 +!![]
1
返します。
true == "true"
等価演算子 (==) は、2 つのオペランドが等しいかどうかをチェックし、ブール値の結果を返します。
抽象的な等価比較ルールに従って、比較時に両方の値が数値に変換されます。
true == "true" ==> Number(true) == Number("true") ==> 1 == NaN
したがって、 ture =="true"
false を返します。
010 - 03
ここにちょっとしたトリックがあります。数値が0
で始まる場合、JavaScript ではその数値は 8 進数として扱われます。したがって:
010 - 03 ==> 8 - 3 ==> 5
また:
""--""
これは構文が悪いように見えますが、正常に動作します。
空の文字列は、ブール値 false または数値 0 に変換できます。したがって、 -""
は0
です
null + 0
前に述べたように、 null
は仮想値です。ブール値false
または数値0
に変換されます。したがって、結果は0
を返します。
0/0
これは不正な数式です。方程式 0/0 には意味のある数値的答えはなく、出力は単なるNaN
です。
1/0 === 10 1000**
ただし、 1/0
は先ほどと同様に不正な数式です。ただし、除数が0
でない場合、JavaScript はこの式の結果がInfinity
あるとみなします。
また、 10**1000
大きな数値であるため、JS ではこの数値を正しく表現できません。 (JavaScript の最大の整数値は2^53-1
です)。したがって、 10 * 1000
も無限とみなされます。
無限大は常に別の無限大と等しいため、 1/0 === 10 ** 1000
true を返します。
true++
これには特別なことは何もありません。単なる構文エラーです。
""- 1
加算演算子 (+) は数値と文字列の両方で機能しますが、減算演算子 (-) は文字列では役に立たないため、JavaScript はこれを数値間の演算として解釈します。空の文字列は 0 に型強制されます。
"" - 1 ==> Number("") - 1 ==> 0 - 1 ==> -1
したがって、 "" — 1
上記と同様に-1
(null - 1) - "1"
を返します。
null ==> 0 (null - 1) ==> -1 "1" ==> 1
so (null — 1) — “1”
returns -2
38 4343 2342+ ("true" - 0)
JS は文字列 "true" を変換するほど狂っているのではないかと疑われるかもしれません。ブール値 true の表現。しかし、それはそれほどクレイジーではありません。実際に起こっていることは、文字列を数値に変換しようとしていますが、失敗しています。
Number("true"); // -> NaN
JavaScript の数値演算では、1 つの値が NaN である限り、演算の最終結果は NaN でなければなりません。 38 * 4343 * 2342
は単なる煙幕です。
前述の通り、
5 + !5 + !!5
。したがって:
!5 ==> 0 !!5 ==> 1
[] + [1] + 2
配列間で加算演算子 (+) を使用しようとすると、文字列に変換されます。
[] ==> '' [1] ==> '1' [] + [1] ==> '1' '1' + 2 ==> '12'
したがって、結果は '12' になります。
1 + 2 + "3"
JavaScript はこれらの操作を左から右に実行します。文字列 3 に数値 3 を追加すると、文字列の連結が優先されます。
1 + 2; // -> 3 3 + "3"; // -> "33"
率直に言って、これらの課題は私たちのコーディング スキルに何の価値ももたらさないため、この種のコードは実際のプロジェクトでは作成すべきではありません
。ただし、これらのスキルは友達だと考えてください。同僚と一緒に 13 歳のふりをするのはとても興味深いことだと思いませんか?
著者:Marina Mosti
出典:medium
原文: https://medium.com/frontend-canteen/20-useless-but-funny-challange-for-javascript-develor-9eea39bb8efb
[関連ビデオチュートリアルの推奨事項: Web フロントエンド]
上記は 20 の奇妙な JS 式です、出力結果を推測してください!詳細については、php 中国語 Web サイトの他の関連記事にご注目ください。