`1+-++-+1についての理解(一元オペレータ+-の理解)

4075 ワード

セクション
次のセクションは、「JS:タイプと文法が分からない」第4章:強制変換の「明確に:Strings Numbers」から選択します.
Stringを除く(.)とNumber(.)、stringとnumberの間でこれらの値を「明確に」変換する方法もあります.
var a = 42;
var b = a.toString();

var c = "3.14";
var d = +c;

b; // "42"
d; // 3.14

呼び出しa.toString()は表面的には明確である(「toString」は「文字列になる」ことを意味することは明らかである)が、ここにはいくつかの隠れた隠蔽性がある.toString()は、42のような基本タイプ値で呼び出すことができない.したがって、JSは、42を1つのオブジェクトパッケージに自動的に「カプセル化」し、toString()をこのオブジェクトに対して呼び出すことができる.言い換えれば、「明確な隠し」と呼ぶかもしれません.
ここでの+cは、+オペレータの1元オペレータ(オペレータは1オペランドのみ)の形式である.数学的加算(または文字列接続)を行う代わりに、1元の+は、そのオペランド(c)をnumber値に強制的に変換する.+cは明確な強制転換ですか?これはあなたの経験と角度によって決まります.もしあなたが知っていたら(今あなたは知っています!)1元+は、numberが強制的に変換されることを明確に意味し、それはかなり明確で明らかである.しかし、もしあなたが以前それを見たことがないならば、それはきわめて困惑しているように見えて、渋くて、隠れた副作用を持っていて、など.
注意:オープンソースのJSコミュニティで一般的に受け入れられている観点は、1元+は明確な強制変換形式である.
たとえあなたが本当に+cのこのような形式が好きでも、それは絶対にある場所で非常に困惑しているように見えます.次のコードを考慮します.
var c = "3.14";
var d = 5+ +c;

d; // 8.14

1元-オペレータも+のように強制変換されますが、数字の記号も反転します.しかし、2つのマイナス--を置いて記号を反転させることはできません.それは減算オペレータとして解釈されるからです.代わりに、- -"3.14"という2つのマイナス記号の間にスペースを追加する必要があります.これにより、強制変換の結果は3.14になります.
ここにはもう一つのクレイジーな例があります(1つの2元オペレータが別のオペレータに隣接する1元形式).
1 + - + + + - + 1;  // 2

1元+(または-)が他のオペレータに隣接している場合は、使用を避けることを強く考慮する必要があります.上のコードは動作しますが、ほとんどの世界では悪い考えだと思っています.d = +c(またはd =+ c!)でもいずれもd += c像と混同しすぎて、後者はまったく違うものです!
注意:1元+のもう1つの極端な困惑点は、++増分オペレータとして使用されるもう1つのオペレータと、--増分オペレータとして使用されるオペレータの数である.例えば、a +++ba + ++ba + + +bである.++の詳細については、5章の「式の副作用」を参照してください.
私たちが明確になり、困惑を減らすために努力していることを覚えておいてください.もっと悪いことをしているわけではありません.
理解する1 + - + + + - + 1;について见た第一印象はとても愚かなこれはどのように理解しますか???
その後、上のセクションの内容を繰り返し読んで、肝心な一言を見つけました.
1元-オペレータも+のように強制変換されますが、数字の記号も反転します.
つまり、
1元+オペレータは文字列を強制的に数値に変換します
1元-オペレータは、文字列を強制的に数字に変換するだけでなく、数字の記号を反転させます.つまり、数字の正負を変更します.
この行のコード1 + - + + + - + 1;を見てみましょう
大まかに3つの部分に分けることができます:数字1、加算演算子+、強制変換部- + + + - + 1先ほど理解した変換ルールによれば、強制変換部分を見たときに+を一時的に無視することができ(一元+オペレータは文字列を強制的に数字に変換するだけ)、- - 1しか残っていないので、強制変換の結果は1(-は奇数記号に変更され、偶数記号に変更されない)、行全体のコード実行結果は2次のこともよく理解できます.
1 + - 1;                   // 0
1 + - + + + + - 1;         // 2
1 + - + + + - - 1;         // 0
1 + - + + + - + + 1;       // 2
1 + - + + + + - - + + 1;   // 0
1 + - + + + +  - + + 1;    // 2