[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