意味不明なjavascriptの仕様集
HTML5で使ったりウェブアプリやウェブデザインでは当たり前のように使われるようになったjavascript。
このjavascriptには意味不明な仕様がいくつもあるのだ。
プログラマーなら常識なのだが私はアマチュアなので一応忘れないようにブログに書いておこうと思う。
javascriptは、floorという切り捨ての仕様がややこしい。
alert(Math.floor( ( 67.0 - 66.9 ) * 10 ));
→ 結果0
1にならない。
javascriptは、数を正確に表現できない!
maxi=Math.pow( 2, 55 );
alert(""+maxi+"");
→ 結果36028797018963970(36028797018963968が正しい)
2の55乗ができない。JavaScriptで扱える最大の数は2の53乗までらしい。
var maxi=36028797018963968;
alert(""+maxi+"");
→ 結果36028797018963970(36028797018963968が正しい)
なんと数値が別の数値になって表示されてしまう。
alert(76287755398823936);
→ 結果76287755398823940
これも同様。
javascriptは、グローバルとローカルの仕様がややこしい。
for(var i=0;i<=5;i++)
{var x = "global";}
alert(x);
if(x=="global")
{var y = "global";}
alert(y);
for文やif文の中で作った変数がfor文やif文の外で使える。まあこれは許せる。
var foo = "global";
function hoge()
{
foo = "global2"
var foo = "local";
alert(foo);
}
hoge();
alert(foo);
fooというグローバル変数がhoge内でvarなしでローカル変数としてfooを作った(中身はglobal2)のだが、外でグローバル変数のfooを表示してみると中身はなんとローカル変数のfooの中身だったのだ。varをつけないとグローバル変数のfooを書き換えることになるのだ。そしてvarをつけるとローカル変数になるはずだ。しかしhoge内で表示してみると中身はglobal2になるのだ。もうこれは意味不明なので説明しにくいし今言った事が正しいのかもよくわからない。
このコードは説明するのが難しいのだが、
簡単に言えばグローバル変数とローカル変数がローカル変数だと思っていたらグローバル変数だったりするということだ。
javascriptは、有効桁数が100?表すことが出来る最小値は?
i3=Number.MIN_VALUE;
i3 = i3.toPrecision(21);
alert(i3);
結果4.94065645841246544177e-324
(e-324は10の-324乗)
i3=Number.MIN_VALUE;
i3 = i3.toPrecision(22);
alert(i3);
結果4.940656458412465441766e-324
i3=Number.MIN_VALUE;
i3 = i3.toPrecision(100);
alert(i3);
結果4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359924e-324
コンピューターの世界で数値に限界があるというのはどうなのだろうか。
まあそのうち増えていくんだろうが未来では大丈夫なのだろうか。心配になる。
その他関連
正確な実数計算をやらされるJavaScriptくん #擬竜戯画 pic.twitter.com/ipE56C2YbV
— RAO(らお) (@RIORAO) 2017年10月26日