JavaScriptでの+ +の意味


252

JavaScriptで= + _演算子が何を意味するのか疑問に思いました。割り当てを行うようです。

例:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};

57
古き良きのことを思い出しアプローチオペレータ-->
OV

12
ここでの+は、_をオペランドとする単項演算子です。
Pieter Witvoet 2013

44
Perlプログラマーがデフォルト変数を手放すことができなかったようです;-)
Michael Wild

4
適切な構文強調表示は、質問への回答に役立ちます。
hugo der hungrige 2013

18
あなたは笑顔を作ることができますx= +_+ 0;
tckmn '20

回答:


396
r = +_;
  • +_数値に何でもキャストしようとします。
  • _唯一の変数名(not演算子)で、それは可能性がありafooなど

例:

+"1"

「1」を純粋な数値1にキャストします。

var _ = "1";
var r = +_;

rは、今1ではありません"1"

さらに、算術演算子のMDNページによると:

単項プラス演算子は、そのオペランドの前にあり、そのオペランドに評価されますが、それがまだ数値でない場合は、数値に変換しようとします。[...]これは、整数と浮動小数点数の文字列表現、ならびに非文字列の値を変換することができtruefalsenull。10進数と16進数(- "0x"接頭辞付き)の両方の形式の整数がサポートされています。負の数がサポートされています(16進数はサポートされていません)。特定の値を解析できない場合は、と評価されNaNます。

また、

単項プラスは、何かを数値に変換する最も速く好ましい方法です


2
+は本当に数値へのキャストを意味しますか、それとも+_本当にを意味しますか?0+_その場合_、0に追加する前にキャストする必要がありますか?
colincameron 2013


17
@ c.cam108-いいえ、同じように動作しません。単項プラスは値を数値にキャストしますが、バイナリプラスは+'12' === 12(結果は数値です)ではありませんが、0 + '12' === '012'(結果は文字列です)。ただし、注意してください0 - '12' === -12
コビ2013

1
@juzeraliもちろん、それは良い習慣ではありません。追加を使用してみてください;)
Izkata

perlのデフォルト変数$ _で元気に見える
Matthew Lock

95

代入演算子ではありません。

  • _ 関数に渡される単なるパラメーターです。

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
    
  • 次の行で、r = +_; +infrontはその変数(_)を数値または整数値にキャストし、それを変数に割り当てますr

+=オペレーターと混同しないでください


54

=+実際には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回行いました。


1
私はよくx|0doubleをintに変換するために使用します。ただし、これには '〜'を使用するだけでなく、2 ^ 32未満の数に制限するというペナルティがあります。+「2e15」にはありません。
Aki Suihkonen 2013年

@AkiSuihkonenはい、私x|0はそれよりもさらに速いと信じています+。正しい素晴らしいテクニック:)。(2)~OPを示すためだけに使用しているだけで+なく、サインが使用できることを示しています(私自身が使用しています+)。
Grijesh Chauhan 2013

言うのは難しい-jsperfはあるが、それを測定したい人もいる。OTOHこれらの2つの演算子は完全に異なる意味を持っています。(整数ではなく)数値のみが必要な場合、 '+'はとにかく1文字短くなります。
Aki Suihkonen 2013年

1
実際、私はjsperfをテストしました-'| 0'の場合は18M演算、 '+'の場合は19M演算。パフォーマンスはおそらくブラウザーによって異なります。jsperf.com/strtoint
Aki Suihkonen

1
@AkiSuihkonenああ、Firefoxでjsperfテストを実行しただけで、大きな違いがありました|
Tapirboy

16

そうではありません=+。JavaScriptでは、+それを数値に変更することを意味します。

+'32' 32を返します。

+'a' NaNを返します。

そのためisNaN()、数値に変更できるかどうかを確認するために使用できます。


16

それは卑劣なものです。

理解しておくべき重要なことは、ここでの下線文字は実際には変数名であり、演算子ではないということです。

その前のプラス記号は、アンダースコアの正の数値を取得しています。つまり、アンダースコア変数をintに効果的にキャストしています。でも同じ効果を得ることができますが、parseInt()より簡潔であるため、ここではプラス記号のキャストがおそらく使用されます。

そして、それは単に等号を標準の変数割り当てとして残すだけです。

経験豊富なJavascriptプログラマーは一般的にアンダースコアを変数として認識するため、意図的に混乱を招くように書かれていない可能性があります。しかし、それが間違いなく非常に混乱していることを知らない場合。確かにそのようには書けません。私は、多くの場合、意味のない短い変数名のファンではありません-JSコードでスペースを節約するために短い変数名が必要な場合は、ミニファイアを使用してください。最初は短い変数で記述しないでください。


1
+1、これ_は変数であることを明示的に指摘するのはここで1人だけだからです。
TRiG 2013

@TRiG Starxの答えはどうですか、tl; drでなくてもそうですか?
Mathletics 2013


9

もしかしてr = +_;?その場合、それはパラメータのへの変換ですNumber。セイは_、その後、'12 .3'です+'12.3'戻ります12.3。したがって、引用文で+_はに割り当てられていrます。


6

_ちょうど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

非常に遅く答えましたが、とても良い答えです。
Grijesh Chauhan 2013

5

左側の変数に新しい値を割り当てます。

var a=10;
var b="asg";
var c=+a;//return 10
var d=-a;//return -10
var f="10";

var e=+b;
var g=-f;

console.log(e);//NAN
console.log(g);//-10

+前にを忘れましたb
Attila O.

1
ガットの答えを書くのを手伝ってくれてありがとう4。
アムレンドラ

3

+_はほぼと同等です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

非常に少ない違い:


最初の行では、parseInr(_)代わりに言いたいと思いますparseFloat(_) か?
Grijesh Chauhan

1
いいえfloat、意味しません。parseIntは数字以外の文字で停止するため、parshFloatは停止しません。EXP:parseFloat(2.4) = 2.4parseInt(2.4) = 2
ブライアン

3

簡単に言えば、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と評価されます。


2

この表現では:

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より読みやすい代替手段です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.