旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

サイ本を読んでいる(1)

2007年9月9日

javascriptのサイ本を

JavaScript 第5版
  • JavaScript 第5版
  • オライリー・ジャパン(2007-08-14)
  • オライリー・ジャパン
  • (著)David Flanagan
  • (翻訳)村上 列
  • 定価:¥ 4,410
  • 新品価格:¥ 4,410
  • 中古価格:¥ 5,980
  • ASIN:4873113296

買いました。

魁!!クロマティ高校を買いに行くつもりだったのに、何故にこんなことに。

で、適当に読み進めてますが、オッと思うことが多々ありますので、復習がてらにメモって行きます。
逆に「こいつこんなことも知らなかったのか」という内容もあると思いますが、そこは触れないでやってください。

今回の範囲は、23章中6章までです。
サンプルコードについては、XP-FireFox2 と XP-IE6 のみで動作確認をしています。

【全角文字の変数名】
文字コードがUTF-8なら、全角文字で変数名を書ける。

var 数量 = 1;
alert(数量); // -> 1
【リテラル】
一般的なプログラム用語として、ソース内に直接記述されるデータ値のことをリテラルと呼ぶ。

1;
"Ask him!";
【型の自動変換】
例えば「論理型を期待している箇所に文字列型の変数を入れた場合」等の自動変換処理について、.valueOf を通るとか .toString を通るとかその辺が詳しく書いてある。
内容は長いので省略。
ちなみに、上記の例は、「文字列が論理値コンテキストで使われた場合の変換」という風に表現している。
【”str” と new String(“str”) の違い】
文字列リテラルに対するStringオブジェクトは、基本データ型のラッパーオブジェクトというらしい。
そのことについての説明がある。内容はこれも省略。
【代入】
JavaScriptの代入は全部参照渡しかと思っていたが、数値と論理値は値渡しであったこと。
文字列は、正確には不明だが、参照渡しと考えてよい。
(職場のグループの皆様、嘘ついてすみません。)
【Callオブジェクト】
ローカル変数は、実は新しいスコープが生成されるたびに、Callオブジェクトのインスタンスが生成されて管理されていたということ。
例えば

var foo = function(x, y){var z;};

は、Callインスタンス.x と Callインスタンス.y と Callインスタンス.z というスコープで管理されている。
argumentsも、Callインスタンス.arguments として内部的には存在している。
Callを関数の実行以外で操作する術は無いので、概念のみの話になりますが。

【オペランド】
演算子(operator) と オペランド(被演算子・operand) は違う用語だということ・・・。
オペランド=演算子かと思ってた。良く今まで困らなかったなぁ。
【単項演算子・二項演算子・三項演算子という区分】

-1;        // -は単項演算子
typeof 1;  // typeofは単項演算子
1 + 1;     // +は二項演算子
a ? b : c; // ?:は三項演算子
【「等しい」と「同一である」】
== は「等しい」、=== は「同一である」という呼び方の区別。
これで、「イコールがみっつあるほうの等しい」と言わなくて済む。
【=演算子】
=も(少々特殊ではあるが)演算子で、式の評価は代入された値(もしくは値への参照)を返す演算子だということ。

var a = 0;
var b = (a = 5) + 3;
alert(b); // -> 8
【,演算子】
,(カンマ)も演算子で、1行で連続して式や文の実行を行う演算子。
【複合文とif(){}】
このような {} で括られた文を複合文と呼ぶが

{
var a = 10;
var s = a * a;
alert(s);
};

if(){} の文法は、if() の文法、と、複合文の文法、という別の文法が連携しているコードであったこと。

【() も [] も演算子】
両方とも、左側のオペランドを評価し、括弧内に引数を取れる、演算子である。

var a = function(n){return n*n}(10);
alert(a); // -> 100
【else if という文法は無い】

if (a === 1) {
} else if (a === 2) {
} else {
};

これは

if (a === 1) {
} else {
if (b === 2) {
} else {
};
};

こう書いているんだったということ。
PHPのelseifや、Rubyのelsifのように、if と else if と else が別に定義されている訳ではない。

【for文に何でも書ける】
セミコロン区切りで、初期化・試験・変更部分に分かれているが
それぞれ好きな式を書けるし、カンマ演算子を使っての式の連続実行も可能。

for (var i = 0, j = 0; j < 5; i = (new Date).getTime(), j++) {
alert(i);
};
と、いうところが役立った。

値段も 0.88オライリーと安めで(※1オライリー = 5,000円)
6章/23章といっても、ページ数にすると1/6冊分(105ページ/600ページ以上)の範囲でこれだけ出てきたので、非常に満足しております。

ああああ、使えるネットが放置状態になってる・・・。
【追記】
()演算子について
でも、こう書くと動かないすよね?って髭の人に言われて試したら

function(n){
alert(n*n);
}(9);

あれ?本当に動かないし、エラーにもなんない?なんで??
と、調べると

function(n){
alert(n*n);
};
(9);

どうやら、上記の様に、無名関数と数値リテラル別々のものだと解析されるようだ。
以下のコードで確認してみる

Number.prototype.alertMe = function(){
return alert(this.valueOf());
};
function(n){
alert(n*n);
}(9).alertMe(); // -> 9

なるほどなぁ
やっぱり、無名関数の実行は()で括ろう。

続きます→