2.値3
18656 ワード
無限
Cのように従来のコンパイル言語を使用する開発者は、「0除算」のようなコンパイル/ランタイムエラーを多く見ている可能性があります。
var a=1/0 ;
ただしjavascriptでは0を演算で割ることがよく定義されているため、Infinity(Number.POSITIVE INFINITY)と呼ばれる結果値が得られる.
分子が-の場合-INfinity(Number.NEGATIVE INFINITY)が現れる
JAvascriptは有限数値式(前述のIEEE 754浮動小数点数)を用いるため、数学の教科書とは異なり、加減などの演算結果は+無限大/-無限大、例えばlet a =Number.MAX_VALUE // 1.7976931348623157e+308
a+a //무한대
a+Math.pow(2,970) //무한대
a+Math.pow(2,969) //무한대
IEEE 754リストでは、加算などの演算結果が大きすぎて表現しにくい場合、四捨五入モードが結果値を決定すると指摘している。大まかに言えば数字MAX_VALUE +Math.pow(2969)は無限大ではなく、数字です。MAX VALUEに近いので廃棄します。
Number.MAX_VALUE+Math.pow(2970)は無限大に近いため,処理を向上させる.
考えてみれば、脳が傷ついて脳が失われる可能性があるからだ.
でも説明するなら.
var a=1/0 ;
let a =Number.MAX_VALUE // 1.7976931348623157e+308
a+a //무한대
a+Math.pow(2,970) //무한대
a+Math.pow(2,969) //무한대
(これは数学の本と同じです)
0/-infinity // -0???
0(Zero)
JavaScriptには0:0と+0,,,-0の2種類があります。
まず、-0を理解するために、JavaScriptが0を処理する方法を理解してみましょう.
音のゼロは-0と表記されているだけではありません.特定の式の演算結果も-0に下がります.
たとえばlet a =0/-3 //-0
let b =0*-3 //-0
let a =0/-3 //-0
let b =0*-3 //-0
let a =0
let b=0/-3
a==b //true
-0==0 //true
a===b //true
-0===0 //true
0>-0 //false
a>b //false
上の式では0が-0に等しいので、0と-0を区別するために、 次の関数を使用します。
const isNegZero=(n)=>{
n=Number(n)// 여기서 무조건 -0이 되도록바꿈
// 만약 n이 0과 같고 1과 나눴을때 -인피니티가 나올경우
//(분모가 0이면 무한 -0이면 네거티브 무한)true 둘중 하나라도
//안맞으면 false(그냥 0이다)
return (n===0)&&(1/n ===-Infinity)
}
isNegZero(-0) //true
isNegZero(0/-3) //true
isNegZero(0) //false
では-0はいったいなぜ作られたのでしょうか.ある情報をサイズで表す場合(例えば、x座標y座標間を往復移動するアニメーション)
この値はどこから来たのですか.知るために
+方向から-または方向から来た場合は-0/0で表すことができます.
javascriptは何を表現するために作成されたのか知っておくべきです.
jsは最初はフロントエンドを動的に表す言語である.
フロントエンドにエラーが発生した場合も、そのまま表現すべきだからです.
ネジが1つ抜けていて、道理に合わないように見えるものもあります.
しかし、これは言語が悪いという意味ではありません.
必要に応じて作っているので、これを把握して、よく使えばいいです.
2.4.4. 特殊な同等比較
前述したように,NaNと−0の同等比較は独特であり,NaNaと自身も等しくない(特定の観点から−前の記事を参照)。isnan(),(または多段文字)を使用する必要があります。-0も詐欺師で、通常は0と等しいふりをして(厳密に等しい演算子の中でも)、isNegZero関数を小細工とします。
なぜなら。この問題を解決するオブジェクト。is()ユーティリティをサポートします。
let a = 2/"foo" //NaN
let b = -3*0 //-0
object.is(a,NaN) // true
object.is(b,-0) // true
object.is(b,0) //false 정확히 0과 -0을 비교한다.
Object.is()は特殊な同等比較に用いられる.
2.5値と参照値
その他の形式の言語は、使用する区分に応じて、値-コピー(copy)、転送コピーの形式で割り当て/転送される。
JavaScriptの値の転送/割り当て方法について
javascriptは転送(参照)の値を指すため、10個の異なる転送がある場合、共有された単一の値をそれぞれ参照します.
値のタイプによってのみ値をコピー(直接変数に値を割り当てる)または参照をコピー(変数に変数を割り当てる)
両方とも美しい
たとえばlet a =2
let b =a //b는 언제나 a에서 값을 !!복사!! 한다.
b++
a // 2
b // 3
let c =[1,2,3]
let d =c //d는 항상 c레퍼런스 하며 d가 바뀌면 c도 바뀐다.(d를 바꾸는건 c를 바꾸는 것과 같다)
d.push(4)
c //[1,2,3,4]
d //[1,2,3,4]
null、undefined、string、number、boolean、およびES 6のsymbolのような単純な値は、常に値-レプリケーションで割り当て/伝達されます.
オブジェクトセット(配列やネストされたオブジェクトRapper)や関数などの合成値は、割り当て/転送時にRapperコピーを生成する必要があります.
ここで、cとdは、[1,2,3]という名前の値を等しく参照(共有)するだけであるため、dによって[1,2,3]を変更すると、[1,2,3]と等しいcの値も変更される.
重要!
参照値とは、変数ではなく値そのものを指します.let a = [1,2,3]
let b = a
a // [1,2,3]
b // [1,2,3] a변수를 레퍼런스하는것이아닌 a변수에 들어있는 "값인 [1,2,3]을 참조"
//이후
b=[4,5,6] //이럴경우 [1,2,3]이 영향을 받지 않고 [4,5,6]으로 새로은 값이 할당된다.
ここで関数の様子を見てみましょう.
パラメータ受信配列で4を解放すると、
[4,5,6]を再びパラメータに割り当て、7を解放すると、
何が起こるの?let a =[1,2,3]
function foo(x){
x.push(4)
x //[1,2,3,4]
//그후
x=[4,5,6]
x.push(7)
x //[4,5,6,7]
}
foo(a)
a// [1,2,3,4]
この場合、aの参照コピーはxに割り当てられ、xおよびaは同じ[1,2,3]値を指す個別の参照である.
新しい値を割り当てます([4,5,6])
初期パラメータに渡されたaの値には注目しません.
したがって,aが持つ[1,2,3]値は変化しない.
したがって、aに単純に配列を配置する場合[4,5,6]、let a =[1,2,3]
function foo(x){
x.push(4)
x //[1,2,3,4]
//그후
x.length=0 //모든 배열을 지움 즉 a가 가지고있던 배열을 모두 비움(새로운값을 할당하는것이아니다)
x.push(4,5,6,7) //비워진 a가 가지고있던 배열에 push
x //[4,5,6,7]
}
foo(a)
a// [4,5,6,7]
ユーザーは、値のコピー(値のみのコピー)/値のコピー(参照値のコピー)を任意に決定できないことを覚えておいてください。
配列などの合成値をコピーして使用する場合
純粋な値をコピーして割り当てる関数を使用するだけです.let a =[1,2,3,4]
let b =a.slice() //얕은 복사에 의한 사본만들기
let a=[1,2,3,4]
b.push(1)
a // [1, 2, 3, 4]
b // [1, 2, 3, 4, 1]
逆に、スカラーの元の値をRapperanceのような値に変換する場合は、元の値を他の関数値(オブジェクト、配列)に変換する必要があります.function foo(wraped){
wraped.a=42
}
let wrap={a:2}
let ref=wrap
foo(wrap)
wrap.a //42
ref.a //42
Number()を使う方法もありますが、一般的な良い習慣ではありません。この法律を勇敢にスキップしましょう。
2.6定理
let a = 2/"foo" //NaN
let b = -3*0 //-0
object.is(a,NaN) // true
object.is(b,-0) // true
object.is(b,0) //false 정확히 0과 -0을 비교한다.
その他の形式の言語は、使用する区分に応じて、値-コピー(copy)、転送コピーの形式で割り当て/転送される。 JavaScriptの値の転送/割り当て方法について
javascriptは転送(参照)の値を指すため、10個の異なる転送がある場合、共有された単一の値をそれぞれ参照します.
値のタイプによってのみ値をコピー(直接変数に値を割り当てる)または参照をコピー(変数に変数を割り当てる)
両方とも美しい
たとえば
let a =2
let b =a //b는 언제나 a에서 값을 !!복사!! 한다.
b++
a // 2
b // 3
let c =[1,2,3]
let d =c //d는 항상 c레퍼런스 하며 d가 바뀌면 c도 바뀐다.(d를 바꾸는건 c를 바꾸는 것과 같다)
d.push(4)
c //[1,2,3,4]
d //[1,2,3,4]
null、undefined、string、number、boolean、およびES 6のsymbolのような単純な値は、常に値-レプリケーションで割り当て/伝達されます.オブジェクトセット(配列やネストされたオブジェクトRapper)や関数などの合成値は、割り当て/転送時にRapperコピーを生成する必要があります.
ここで、cとdは、[1,2,3]という名前の値を等しく参照(共有)するだけであるため、dによって[1,2,3]を変更すると、[1,2,3]と等しいcの値も変更される.
重要!
参照値とは、変数ではなく値そのものを指します.
let a = [1,2,3]
let b = a
a // [1,2,3]
b // [1,2,3] a변수를 레퍼런스하는것이아닌 a변수에 들어있는 "값인 [1,2,3]을 참조"
//이후
b=[4,5,6] //이럴경우 [1,2,3]이 영향을 받지 않고 [4,5,6]으로 새로은 값이 할당된다.
ここで関数の様子を見てみましょう.パラメータ受信配列で4を解放すると、
[4,5,6]を再びパラメータに割り当て、7を解放すると、
何が起こるの?
let a =[1,2,3]
function foo(x){
x.push(4)
x //[1,2,3,4]
//그후
x=[4,5,6]
x.push(7)
x //[4,5,6,7]
}
foo(a)
a// [1,2,3,4]
この場合、aの参照コピーはxに割り当てられ、xおよびaは同じ[1,2,3]値を指す個別の参照である.新しい値を割り当てます([4,5,6])
初期パラメータに渡されたaの値には注目しません.
したがって,aが持つ[1,2,3]値は変化しない.
したがって、aに単純に配列を配置する場合[4,5,6]、
let a =[1,2,3]
function foo(x){
x.push(4)
x //[1,2,3,4]
//그후
x.length=0 //모든 배열을 지움 즉 a가 가지고있던 배열을 모두 비움(새로운값을 할당하는것이아니다)
x.push(4,5,6,7) //비워진 a가 가지고있던 배열에 push
x //[4,5,6,7]
}
foo(a)
a// [4,5,6,7]
ユーザーは、値のコピー(値のみのコピー)/値のコピー(参照値のコピー)を任意に決定できないことを覚えておいてください。
配列などの合成値をコピーして使用する場合
純粋な値をコピーして割り当てる関数を使用するだけです.
let a =[1,2,3,4]
let b =a.slice() //얕은 복사에 의한 사본만들기
let a=[1,2,3,4]
b.push(1)
a // [1, 2, 3, 4]
b // [1, 2, 3, 4, 1]
逆に、スカラーの元の値をRapperanceのような値に変換する場合は、元の値を他の関数値(オブジェクト、配列)に変換する必要があります.function foo(wraped){
wraped.a=42
}
let wrap={a:2}
let ref=wrap
foo(wrap)
wrap.a //42
ref.a //42
Number()を使う方法もありますが、一般的な良い習慣ではありません。この法律を勇敢にスキップしましょう。
2.6定理
void演算子は、すべての値を未定義に変更します.
Reference
この問題について(2.値3), 我々は、より多くの情報をここで見つけました https://velog.io/@jmyoon8/2.값3-lwzqvsirテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol