JavaScript第5版(1p〜73p)

会社帰りの時間を使ってJavaScript第5版を読んでいます。
Javaプログラマから見たJavaScriptの面白い部分を
抜粋してまとめよう。

JavaScript 第5版

JavaScript 第5版

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オブジェクト!?なんだそりゃー。
見てみたい。どうやったら見えるかな。

5.4.1 同値演算子

===
PHP

5.7.2 論理和演算子

実はこれが一番の驚き。

var x = a || b || c;

aがundefined
bがnull
cがtrueになれる値であれば、
xに代入されるのはcの値であって、trueではない
すばらしい。脱帽。きっと3項演算子で書いていただろうなぁ

明日は71pからだ