ここでコードの一部を調べていましたhttp://cssdeck.com/labs/bjiau4dyそして、Javascriptボックスでこれを見ました-
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
それは何をしますか?コンソールにエラーが表示されないのはなぜですか?
ありがとう!
ここでコードの一部を調べていましたhttp://cssdeck.com/labs/bjiau4dyそして、Javascriptボックスでこれを見ました-
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
それは何をしますか?コンソールにエラーが表示されないのはなぜですか?
ありがとう!
これらの記号はいずれも、それに続く関数を関数宣言ではなく関数式に変換します。それらをすべてまとめるのは楽しみのためだけです。
()
宣言の直後に置いて通常の関数を呼び出そうとすると、次のようになります。
function () {
// this is a syntax error...
}();
構文エラーが発生します:
SyntaxError:予期しないトークン (
関数宣言を呼び出すことができないためです。
したがって、人々は通常、無名関数を括弧で囲んで関数式に変換します。
(function () {
// this will execute immediately
}());
これらの記号のいずれかを前に付けることで、同じことを実現できます。
!function () {
// this will also execute immediately
}();
詳細については、こちらをご覧ください:http: //kangax.github.com/nfe/#expr-vs-decl
様式的な透かしを除いて、長い記号のセットを実行することには意味がありません。
そのシンボルのセットは、後続の関数に対する操作として機能しますが、何もしません。
1
JSでは、+ 1(1)または!1
(false)または!+1(まだfalse)と書くことができます。これは、次の機能に作用しているものの単なる長い連鎖です。
したがって!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!1
、エラーはスローされません。その価値はfalse
しかしです。
そして!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!function(){ ... }
、関数を実行してfalseと評価します(ただし、値は何も実行されません)
ただし、何かが存在するため、関数定義を操作に変換し、関数をすぐに評価します。しかし+function(){ ... }
、同じことをするだけです。
もう少し詳しく説明すると、これらの各演算子は、実際にはその前にあるオペランドに対して型強制を実行します。は、演算子と同様に、+
それに続くオペランドを に変換します。not 演算子であり、オペランドを(true/false)に変換します。number
-
!
boolean
心に留めておくべきもう 1 つのことは、Javascript では、すべてが何らかの値に評価される可能性があるということです。それは「真実」または「偽」の値である可能性があり、「数値」の値を持つこともできます(その値が数値でなくても、AKA NaN
)。
したがって、JSFiddle または Firebug を開いて、これらの値が関数に与える影響を調べてみると、ある種の新しい戻り値も生成されることがわかります。
例えば:
!function(){}
の値に評価されますfalse
(関数オブジェクトをブール値に強制すると の値が得られるためtrue
)。+function(){}
の値に評価されますNaN
(関数オブジェクトを数値に強制すると が得られるためNaN
)。を使用しても同じ結果が得られ-
ます。!+function(){}
true を生成します (値の数を強制するNaN
と生成さfalse
れ、false ではなく true が生成されます。!+-+-+!function(){}
yields true (なぜなら、 !function(){}
yields false
、+false
yields 、および は、 finally が true と評価されるまで、これらすべての演算子と演算子0
全体で継続するため)。+
-
!0
false
、-1、0、1の間を行き来します。true
Firebug を使用してこれらをチェックしたことに注意してください。ブラウザ間で違いがある可能性があり、おそらく Firebug が評価で示したものです。TL;DR は、Javascript が多くの型強制を行い、宣言とは異なる方法で式を評価することです。