[JavaScript] Javaプログラマが勘違いしやすいprimitiveとGlobal Objects
落とし穴落ちそうになったのでメモ。JavaScriptにはプリミティブとグローバル・オブジェクト(Global Objects)があってプリミティブにはだいたいラッパとなるクラスがある.
Stringはプリミティブもある
Javaだとリテラルである文字列でもStringのオブジェクトに変わりはない。だけどJavaScriptだとリテラルはstringプリミティブ。
var s1='aaa'; // primitive var s2=String('aaa'); // primitive var s3=new String('aaa'); // Object console.log( (s1==s2)?'真':'偽' ); // 真 console.log( (s1==s3)?'真':'偽' ); // 真 console.log( (s1===s2)?'真':'偽' ); // 真 console.log( (s1===s3)?'真':'偽' ); // 偽
条件文にBooleanオブジェクトは危険
ついでにfalseなBooleanオブジェクトを条件分で判定してみたらtrueでした。普通はstringやbooleanはプリミティブを使うので滅多にハマらないけど覚えていて損はないかも。
console.log( (new Boolean(false))?'真':'偽' ); // 真
undefinedは変数とプリミティブは違う
undefinedはグローバルスコープのだだの変数。だけどプリミティブのundefinedが初期値になっているマギラワしい変数。
っということは、プリミティブのundefinedはJavaScriptからundefinedプリミティブ変数を作るは無理(だと思う)
ただの変数ってことは・・・
undefined=333; console.log(333==undefined); // true console.log(333===undefined); // true
が出来る!って危険だコレ。undefinedの判定はtypeofが幸せになれます。
primitiveとGlobal Objectsの見分け方
めちゃ簡単。typeofを使うだけ。
console.log( typeof 12 ); // number console.log( typeof 'dog' ); // string console.log( typeof true ); // boolean console.log( typeof new Date() ); // object console.log( typeof new String('dog') ); // object console.log( typeof aaa ); // undefined