JavaScript第5版(1p〜73p)
会社帰りの時間を使ってJavaScript第5版を読んでいます。
Javaプログラマから見たJavaScriptの面白い部分を
抜粋してまとめよう。
- 作者: David Flanagan,村上列
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/08/14
- メディア: 大型本
- 購入: 52人 クリック: 1,011回
- この商品を含むブログ (271件) を見る
3.13 基本データ型のラッパーオブジェクト
文字列リテラルと文字列オブジェクトが違うというのが納得できない。
evalの結果が違うというのも。。。はて?
ということで検証。
alert(typeof '');// string alert(typeof new String(''));// object alert(typeof String(''));// string alert('' == new String(''));//true alert('' === new String(''));// false var json = '({key:100})'; alert(eval(json).key);// 100 alert(eval(new String(json)).key);// undefined alert(eval(String(new String(json))).key);// 100
new String(json).keyがundefinedになるのは、
文字列リテラルでなく、文字列オブジェクトだから。
そしてオブジェクトをevalすると、引数がそのまま返ってくる。
var json = '({key:100})'; var obj = eval(new String(json)); for(key in obj) { alert(key+'='+obj[key]); // 0=( // 1={ // 2=k // 3=e // 4=y // 5=: // 6=1 // 7=0 // 8=0 // 9=} // 10=) }
・・・ほほう。文字列オブジェクトはJavaと同じく不変で、
内部的には配列のように持っているのか。
「String extends Array」みたいな感じかな
3.14 オブジェクトから基本データ型への変換
valueOf()はオブジェクトの基本データ型を取得するための関数らしい。
しかも基本データ型はNumberでもStringでもよい。
ほほう。さすが動的型付け言語。
参照周りは特にJavaとかわりないな。
4.3 変数のスコープ
変数のスコープがグローバルとローカルの2種類がある。
ブロックレベルのスコープはない。
これはわかる。
が、
var i = 'global'; f = function() { alert(i);// undefined var i = 'local'; } f();
JavaScriptのインタプリタ(仕様)は関数に対しては行単位ではなく、
完全に関数のスコープを読み込んでから、宣言を開始時にまとめて行うらしい。
これにはやられた。
4.6.2 ローカル変数はCallオブジェクト
Callオブジェクト!?なんだそりゃー。
見てみたい。どうやったら見えるかな。