257

= +_演算子が JavaScript で何を意味するのか疑問に思っていました。課題をやっているようです。

例:

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

12 に答える 12

405
r = +_;
  • +何でも数値にキャストしようとし_ます。
  • _は単なる変数名 (演算子ではない) でありafooなどである可能性があります。

例:

+"1"

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

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

r1ではありません"1"

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

単項プラス演算子は、そのオペランドの前に置かれ、そのオペランドに評価されますが、まだ数値になっていない場合は、数値に変換しようとします。[...]整数と浮動小数点数の文字列表現、および文字列以外の値truefalse、およびを変換できますnull。10 進数と 16 進数 ( "0x"-prefixed) の両方の形式の整数がサポートされています。負の数がサポートされています (ただし、16 進数はサポートされていません)。特定の値を解析できない場合は、 と評価されNaNます。

また、

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

于 2013-02-28T06:44:08.977 に答える
95

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

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

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

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

于 2013-02-28T06:45:11.187 に答える
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

さらに、~ (if string is int string (float will be round of to int) ) でも同じことを達成できることを知っておくと興味深いでしょう。

y = ~~'5'  // notice used two time ~
x = y  + 5
alert(x);

10も出力します

~ビットごとの NOT : オペランドのビットを反転します。マグニチュードの変化がないために2回行いました。

于 2013-02-28T06:44:41.013 に答える
16

卑劣なものです。

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

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

そして、それは等号を単なる標準の変数代入として残すだけです。

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

于 2013-02-28T12:59:26.270 に答える
16

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

+'32'32 を返します。

+'a'NaN を返します。

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

于 2013-02-28T06:44:38.903 に答える
12

= +_ は _ を数値にキャストします。

そう

var _ = "1",
   r = +_;
console.log(typeof r)

番号を出力します。

于 2013-02-28T06:50:49.807 に答える
9

私はあなたが意味すると思いますr = +_;か?その場合、それはパラメータの への変換ですNumber_'12.3' と言うと、+'12.3'が返されます12.3。したがって、引用文+_では に割り当てられrます。

于 2013-02-28T06:45:50.787 に答える
6

_hexbin.radiusfunction のパラメーターとして渡され、数値に+キャストされる単なる変数名です。

あなたの関数と同じ例を作ってみましょう。

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 boolean
1 number false
于 2013-03-01T07:41:56.613 に答える
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
于 2013-02-28T06:45:48.313 に答える
4

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

于 2014-03-27T17:31:01.077 に答える
3

+_とほぼ同等ですparseFloat(_)parseIntドットなどの非数値文字で停止するのに対し、停止しないことに注意してparshFloatください。

経験値:

    parseFloat(2.4) = 2.4 
vs 
    parseInt(2.4) = 2 
vs 
    +"2.4" = 2.4

経験値:

var _ = "3";
    _ = +_;

console.log(_); // will show an integer 3

違いはほとんどありません:

于 2013-07-17T03:42:01.613 に答える