Archives by date

You are browsing the site archives by date.

【Javascript】暗黙の型変換でブーリアン型のfalseに置き換わる値まとめ。

if文やwhile文といった条件式で暗黙の型変換が行われる際、falseとして評価されるものは以下の通り。

・数値0
・数値NaN
・null値
・undefined値
・空白文字列”

上記以外の値は全てtrueとなる。
また、ブーリアン型への変換時にもイディオムが存在し「!」演算子を用いることで実現している。
!演算はブーリアン型のオペランドに対する論理否定演算なため、評価対象がブーリアン型でなければ、上記のルールに則り暗黙の型変換が行われる。
そのため!演算を二つ重ね!!とする事で否定の否定となり、最終的にブーリアン型への変換機能だけが残るのである。

> !1;
false

> !!1;
true

> !!'a';
true

> !!'0';
true

> !!0;
false

> !!'';
false

> !!null;
false

といった具合。
またブーリアン型への型変換で注意すべきポイントとして、オブジェクト型の評価結果がある。
オブジェクト型をブーリアン型に変換すると必ずtureを返却するため、下記のようなコードであってもtrueが返却されるので注意されたし。

> var bool = new Boolean(false);
  !!bool;

true

ここでいうboolはBooleanクラスのインスタンス(オブジェクト)であるため、変換結果はtrueとなる(中身はfalse)。
※厳密に言うとJSにクラスは存在しないが言語仕様上の破綻は起こらないため、便宜上クラスという文言を用いた。

 

【Javascript】型変換のイディオム。

めも。

最短表記。

// 数値から文字列値(文字列連結時の暗黙の型変換を利用)
var num = 123;
num+'';

// 文字列値から数値(正の符号演算時の暗黙の型変換を利用)
var str = '123';
+str;

String(123)、Number(‘123′)と記述すると可読性には優れるが、コードが冗長化するため個人的には好まない。

 

【Javascript】NaNに関するまとめ。

自分用。

NaNは如何なる演算を行ってもNaN以外に変化しない。よって処理中にNaNが一度でも現れれば最終結果は常にNaNとなる。

> NaN + 1;
NaN

> NaN * 0;
NaN

> NaN - NaN;
NaN

NaNは他のどんな値とも同値にならない。またNaN同士の同地判定すら偽を返却する。

> NaN == 1;
false

> NaN === 1;
false

> NaN == NaN;
false

> NaN === NaN;
false

下記の通り、比較演算子を用いた評価もすべて偽を返却する。

> NaN > 1;
false

> NaN <= 1;
false

> NaN < NaN;
false

> NaN >= NaN;
false

NaNであることを判定したい場合はisNaN()関数を用いる。

> isNaN(NaN);
true

> isNaN({});
true

> isNaN(new Number(NaN));
true

おまけ。
NaNと併せ、特殊値扱いされている正の無限大、負の無限大も同時に判別したい場合はisFinite()関数を用いればよい。
isFinite()はNaN、及び正負の無限大以外の場合に真を返却する。

> isFinite(123);
true

> isFinite(NaN);
false

> isFinite(Infinity);
false

> isFinite(-Infinity);
false

 

【Javascript】浮動小数点を扱う際の基本的な注意点。

明示的に浮動小数点を宣言する言語ではあたりまえの知識かもしれないけど、Javascriptを書いていて初めて知ったのでメモ。
※Javascriptはどのような数字でも常に浮動小数点として扱うので注意されたし。

// 0.1と0.2の和は0.3にならない
> 0.1 + 0.2;
0.30000000000000004

// 当然下記の2パターンは一致しない
> (0.1 + 0.2) == 0.3;
false

> (0.1 + 0.2) === 0.3
false

// 下記も近似値
> 1/3;
0.3333333333333333

// 下記も近似値
> 10/3 - 3;
0.3333333333333335

// よって当然書きも一致しない
> (10/3 - 3) == 1/3;
false

> (10/3 - 3) === 1/3;
false

浮動小数点はそもそも小数点以下を正確に表現することができないらしい。正確に表現できる場合こそがむしろ例外的であり、ほとんどの数値は近似値で表現されているという点に注意されたし。

 

【Javascript】文字列型の比較。

Javascriptでは比較演算子による文字列の大小比較演算が可能。
※比較はUnicodeの文字コード値ベースで判定される。

主な規則は下記の通り。

・英語アルファベットは辞書順
・英語大文字は小文字より前
・数字、記号は英文字よりも前(一部記号は英文字より後)
・平仮名はカタカナより前
・平仮名、カタカナはそれぞれ辞書順
・濁点、半濁点は「へ」「べ」「ぺ」「ほ」「ぼ」「ぽ」「ま」といった順
・漢字は平仮名、カタカナよりも後
・漢字の並び順は基本的に音読みの辞書順(例外あり)

var str1 = 'abc';
var str2 = 'def';
console.log(str1 < str2)
// true
console.log(str1 > str2)
// false

 

【Javascript】カンマ「,」で終わるオブジェクトリテラルに関するメモ。

{'aaa':'bbb', 'ccc':'ddd', }

上記のようなカンマ「,」で終わるオブジェクトは不具合の原因となるため頑なに避け続けていたが、ECMAScript第5版では許可されるようになっているとのこと。しかしECMAScript第3版では違反になるため、どちらにしろ終端にカンマがあるオブジェクトリテラルは使用するべきではないというのが一般的な理解であると言える。

単に古いIEのみで生じるバグであると認識していたが、実態はECMAScriptのバージョンによる解釈の差であることを学んだ。

 

【jQuery】.on()関数自分用まとめ。

前にもエントリー作ったけど、もうちょっと詳しく。

■関数定義(ver1.7?)
引数の渡し方によって解釈が異なる。

// bind構文
$(selector).on(eventName, function)
// delegate構文
$(scope).on(eventName, selector, function);

■引数解説

引数 詳細
scope 調査範囲(後から追加された要素に対して動的にメソッドをバインドさせる範囲)
selector 動作を割り当てたいDOM要素を指定
eventName 次のようなイベント名を割り当てる。blur, change, click, dblclick, focus, focusin, focusout, hover, keydown, keypress, keyup, etc…
function 関数を指定

■使用例

$(document).on('click', '.hoge', function(){...});
$('.fuga').on('keydown', '.piyo', function(){...});

調査範囲にdocumentを指定すると全てのDOM要素が.onの管理下におかれるため、非常にシンプルかつ強力な動的バインドが期待できる半面、イベントが発生するごとにドキュメント全体を走査するので処理的にはとても重たいという点に注意されたし。できるのであれば操作範囲は必要最小限に設定することが望ましい。

また、同時に複数のイベントに対して同じ動作を割り当てたい場合、下記のように第一引数を羅列してやればよい。

$('.hoge').on('click keydown blur', '.fuga', function(){...});

それぞれのイベントに対して、別々の動作を割り当てたい場合は第一引数にオブジェクトを渡してやり、第二引数にバインド対象となるDOM要素のセレクターを記述する。

$('.scope').on({
	'click': function(){...},
	'keydown': function(){...},
	'blur': function(){...}
}, '.hoge');

下記のように引数を渡すことも可能。

// この場合各イベントで「myData」というアラートが表示される。
$(document).on({
	'click': function(arg){alert(arg.data)},
	'keydown': function(arg){alert(arg.data)},
	'blur': function(arg){alert(arg.data)}
}, '.target', 'myData');

オブジェクトも渡せる。

$(document).on({
	'click': function(arg){alert(arg.data.arg1)},
	'keydown': function(arg){alert(arg.data.arg2)},
	'blur': function(arg){alert(arg.data.arg3)}
}, '.target', {'arg1':'aaa', 'arg2':'bbb', 'arg3':'ccc'});

単一のイベントに対して引数を渡す際の書式は以下の通り。

$(document).on('click', '.target', {'arg1':'aaa'}, function(arg){alert(arg.data.arg1)});

.on()クッソ便利。