JavaScriptで= + _演算子が何を意味するのか疑問に思いました。割り当てを行うようです。
例:
hexbin.radius = function(_) {
if (!arguments.length)
return r;
r = +_;
dx = r * 2 * Math.sin(Math.PI / 3);
dy = r * 1.5;
return hexbin;
};
x= +_+ 0;
JavaScriptで= + _演算子が何を意味するのか疑問に思いました。割り当てを行うようです。
例:
hexbin.radius = function(_) {
if (!arguments.length)
return r;
r = +_;
dx = r * 2 * Math.sin(Math.PI / 3);
dy = r * 1.5;
return hexbin;
};
x= +_+ 0;
回答:
r = +_;
+_数値に何でもキャストしようとします。_唯一の変数名(not演算子)で、それは可能性がありa、fooなど例:
+"1"
「1」を純粋な数値1にキャストします。
var _ = "1";
var r = +_;
rは、今1ではありません"1"。
さらに、算術演算子のMDNページによると:
単項プラス演算子は、そのオペランドの前にあり、そのオペランドに評価されますが、それがまだ数値でない場合は、数値に変換しようとします。[...]これは、整数と浮動小数点数の文字列表現、ならびに非文字列の値を変換することができ
true、falseとnull。10進数と16進数(-"0x"接頭辞付き)の両方の形式の整数がサポートされています。負の数がサポートされています(16進数はサポートされていません)。特定の値を解析できない場合は、と評価されNaNます。
また、
単項プラスは、何かを数値に変換する最も速く好ましい方法です
+_本当にを意味しますか?0+_その場合_、0に追加する前にキャストする必要がありますか?
+'12' === 12(結果は数値です)ではありませんが、0 + '12' === '012'(結果は文字列です)。ただし、注意してください0 - '12' === -12。
=+実際には2つの演算子=は代入であり+、 _変数名です。
お気に入り:
i = + 5;
or
j = + i;
or
i = + _;
以下のコードは=+、文字列 をintに変換するための使用法を示すのに役立ちます。
例:
y = +'5'
x = y +5
alert(x);
出力10
使用:さもなければ、ここyにint 5があり=+
ます:
y = '5'
x = y +5
alert(x);
出力55
as _は変数です。
_ = + '5'
x = _ + 5
alert(x)
出力10
さらに、
あなたがまたしても同じことを達成でき知ることは興味深いものになるだろう~(文字列の場合はint型の文字列(フロート)はint型へのラウンドになりますが)
y = ~~'5' // notice used two time ~
x = y + 5
alert(x);
10も出力します
~is is bitwise NOT:そのオペランドのビットを反転します。マグニチュードに変化がないので、2回行いました。
x|0doubleをintに変換するために使用します。ただし、これには '〜'を使用するだけでなく、2 ^ 32未満の数に制限するというペナルティがあります。+「2e15」にはありません。
x|0はそれよりもさらに速いと信じています+。正しい?素晴らしいテクニック:)。(2)~OPを示すためだけに使用しているだけで+なく、サインが使用できることを示しています(私自身が使用しています+)。
|。
それは卑劣なものです。
理解しておくべき重要なことは、ここでの下線文字は実際には変数名であり、演算子ではないということです。
その前のプラス記号は、アンダースコアの正の数値を取得しています。つまり、アンダースコア変数をintに効果的にキャストしています。でも同じ効果を得ることができますが、parseInt()より簡潔であるため、ここではプラス記号のキャストがおそらく使用されます。
そして、それは単に等号を標準の変数割り当てとして残すだけです。
経験豊富なJavascriptプログラマーは一般的にアンダースコアを変数として認識するため、意図的に混乱を招くように書かれていない可能性があります。しかし、それが間違いなく非常に混乱していることを知らない場合。確かにそのようには書けません。私は、多くの場合、意味のない短い変数名のファンではありません-JSコードでスペースを節約するために短い変数名が必要な場合は、ミニファイアを使用してください。最初は短い変数で記述しないでください。
_は変数であることを明示的に指摘するのはここで1人だけだからです。
= + _は_を数値にキャストします。
そう
var _ = "1",
r = +_;
console.log(typeof r)
数値を出力します。
_ちょうどAA変数名、関数のパラメータとして渡されhexbin.radius、そして+番号にそれをキャスト
あなたの関数と同じように例を挙げましょう。
var hexbin = {},r ;
hexbin.radius = function(_) {
if (!arguments.length)
return r;
console.log( _ , typeof _ )
r = +_;
console.log( r , typeof r , isNaN(r) );
}
そして、このサンプル関数を実行します。
hexbin.radius( "1");
1 string
1 number false
hexbin.radius(1);
1 number
1 number false
hexbin.radius([]);
[] object
0 number false
hexbin.radius( 'a');
a string
NaN number true
hexbin.radius({});
Object {} object
NaN number true
hexbin.radius(true);
true boolean
1 number false
+_はほぼと同等ですparseFloat(_)。それを観察しparseInt、一方、そのようなドットなどの非数値文字で停止しますparshFloatしません。
EXP:
parseFloat(2.4) = 2.4
vs
parseInt(2.4) = 2
vs
+"2.4" = 2.4
経験:
var _ = "3";
_ = +_;
console.log(_); // will show an integer 3
非常に少ない違い:
""評価され、0parseInt()はに評価されますNaNparseInr(_)代わりに言いたいと思いますparseFloat(_) か?
float、意味しません。parseIntは数字以外の文字で停止するため、parshFloatは停止しません。EXP:parseFloat(2.4) = 2.4対parseInt(2.4) = 2。
簡単に言えば、Number()コンストラクタを使用+_ することと同じです。
実際、それは日付でも機能します:
var d = new Date('03/27/2014');
console.log(Number(d)) // returns 1395903600000
console.log(+d) // returns 1395903600000
デモ:http : //jsfiddle.net/dirtyd77/GCLjd/
詳細については、MDN-単項プラス(+)セクションもご覧ください。
単項プラス演算子は、そのオペランドの前にあり、そのオペランドに評価されますが、まだ数値でない場合は、数値に変換しようとします。単項否定(-)も非数値を変換できますが、単項プラスは、数値に対して他の演算を実行しないため、何かを数値に変換する最も速く好ましい方法です。整数と浮動小数点数の文字列表現、および非文字列値true、false、nullを変換できます。10進数と16進数( "0x"で始まる)の両方の形式の整数がサポートされています。負の数がサポートされています(16進数はサポートされていません)。特定の値を解析できない場合は、NaNと評価されます。
この表現では:
r = +_;
_それはとても元々だった場合、「1」のままになりますが、r純粋な数になります。数値変換に+を適用するかどうか、これらのケースを検討してください
+"-0" // 0, not -0
+"1" //1
+"-1" // -1
+"" // 0, in JS "" is converted to 0
+null // 0, in JS null is converted to 0
+undefined // NaN
+"yack!" // NaN
+"NaN" //NaN
+"3.14" // 3.14
var _ = "1"; +_;_ // "1"
var _ = "1"; +_;!!_ //true
var _ = "0"; +_;!!_ //true
var _ = null; +_;!!_ //false
ただし、これは最速の数値コンバーターであり、使用する場合に使いすぎないようにすることをお勧めします。parseInt/parseFloatより読みやすい代替手段です。
-->