同値

編集
if (3 == "3") alert(true); // true
if (3 === "3") alert(true); // false

===は型をも見ます。

値が型を持ちます。

alert(3 + 3); // 6
alert("3" + "3"); // 33
alert(3 + "3"); // 33
alert("3" + 3); // 33

文字列のほうが優先されるので、数値優先にするため、parseInt()やparseFloat()を使います。第二引数には基数も指定できます。

alert(parseInt("3") + parseInt("3")); // 6

String(new Date())とすると、print ''.localtimeのようになります。

new String()と混同しないように。

例外

編集

dieはthrow。

evalはtry。

$@はcatchの引数。

try {
    throw "Died!";
}
catch(e) {
    alert(e); // Died!
}

eが使われることが多いが、unkoでも良いです。

try {
    throw "Died!";
}
catch(unko) {
    alert(unko); // Died!
}

finallyブロックは、ファイルのオープンに成功しても失敗しても最終的にはファイルをクローズする必要があるわけですが、そのファイルをクローズする処理を書くブロック。

しかしthrowした場合は、finallyは実行されないようです。

オブジェクトの主題化。

alert(Math.PI); // 3.141592653589793
with (Math) {
    alert(PI); // 3.141592653589793
    alert(floor(sin(PI))); // 0
}

floorは床関数。ceilは天井関数。つまりPerlのint()のようなものです。

性能低下のため乱用は禁物。

便利な冪乗演算子はありません。Math.pow()を使います。

function

編集

以下は2の冪にのみ特化したMath.pow()のラッパです。

(function(n){return Math.pow(2,n)})(32); // 4294967296

Perlに翻訳すると次のようになります。

(sub{2**$_[0]})->(32); # 4294967296

@_はarguments。

(function(){return Math.pow(2,arguments[0])})(32); // 4294967296

普段は使いません。

オブジェクト指向

編集
"ABCDEFG".length; // 7

""はnew String()と同義。

new String("ABCDEFG").length

つまりString->new("ABCDEFG")->{length}。

length("ABCDEFG"); # 7

と書くより楽しいです。

42

new Number(42)

/regexp/

new Regexp(regexp)

["A", "B", "C"]

new Array("A", "B", "C")

オブジェクト

編集
var o = {
    name: "John",
    age: 21,
};
o.name; // John

ハッシュではないので=>は使えません(=>はハッシュとは関係ないものの)。

「:」。「:」。「:」。

ところが、

var o = {
    name: "John",
    age: 21,
};
o["name"]; // John

でもいけます。

そう、じつはオブジェクト=ハッシュなのです。しかし=>は使えません。

ハッシュというのは方言なので「連想配列」と呼ぶこと。

keysのようなものです。

for (var i in o)
    alert(o[i]);

foreach

編集

foreachはありません。Cスタイルのforを使います。

for (var i = 0, j = a.length; i < j; i++)
    alert(a[i]);

undefined

編集

undefinedはundefinedを保持するグローバル変数です。

JavaScriptでは、未定義値をundefinedと呼び、未定義値が入っているグローバル変数のこともundefinedと呼びます。

非常に紛らわしいです。

Perlにおいては未定義値をundefと呼びますが、undefを格納するためのグローバル変数というのはありません。

しかし、常にundefを返すundef()関数があり、undef()関数は引数として与えられた変数をundefにします。

私達はこれらを完全に区別できますが、JavaScripterにとっては紛らわしいかもしれないので、おあいこということで。

初期化していない変数はundefinedです。

var x;
if (x == undefined) alert(true); // true

undefinedはグローバル変数なので、なんと書き換えることができます。

undefined = true;
var x;
if (x == undefined) alert(true); // false

恐ろしいです。

defined(x)をx == undefinedとすることはできません。

undefinedに何が入っているか分かりません。

nullと比較すること。

var x;
if (x == null) alert(true); // true

nullとはnullです。これは空文字 (NUL; "\0") や空文字列 (NULL; "") のことではありません’’'。

nullはグローバル変数ではありません。リテラルです。

nullは決してundefinedではありません

if (null === undefined) alert(true); // false

しかし、型の概念を超越すれば、まったく別物というわけでもなさそうです。

if (null == undefined) alert(true); // true

nullは(オブジェクト指向において)オブジェクトがない状態。nullオブジェクト。

nullと==をしてtrueになるのは、nullとundefinedだけです。

実際nullはundefinedと同じくらい使い物にならないゴミなので、どちらにしろ排除してしまってよいです。区別する必要はないのです。

つまりnext unless defined $xは、

if (x == null)
    continue;

ループ制御文

編集

nextはcontinue、lastはbreak、returnはreturn。

JavaScriptでは(function(){})()を多用するため、returnを最も頻繁に使います。returnを使うべきところでbreakを使ってしまわないように注意。

returnがない場合はundefinedが返されます。

Stringオブジェクトのreplaceメソッド。

"Hello, world!".replace("WoRlD", "JavaScript", "i"); // Hello, JavaScript!

非破壊的。

正規表現でも文字列でもよいです。

修飾子はフラグと呼ばれます。第三引数に指定します。

定数

編集

const。

πはMath.PI。

myと同じく、どこであろうと常に最初はvarをつけること。ただしブロック内では局所化されません。関数内で局所化されます。

Webアプリケーション

編集
<p id="text">Web</p>
<script type="application/ecmascript">
//<![CDATA[
function $(id) { return document.getElementById(id) }
var field = $('text');
var t = field.textContent;
field.addEventListener('click', function(){
    field.textContent += t;
}, false);
//]]>
</script>

sleepはありません。alarmすなわちwindow.setTimeout()や、window.setInterval()を駆使します。

var i = 0;
var t = setInterval(function(){
    if (i > 3) {
        clearInterval(t);
        return;
    }
    alert(i++);
}, 1000);

これは0から3まで1000ミリ秒=1秒間隔で数え上げます。

常にundefinedを返す単項演算子。

単項演算子とは引数を1つ取り、()を省略できる関数のことです。

xがundefinedであるかどうかを調べるには、

var x;
if (x === void(0))
    alert(true); // true
if (x === (function(){})())
    alert(true); // true
if (typeof(x) === 'undefined')
    alert(true); // true

などの方法があります。ゴミ排除にはnullと==をすればよいので、普通こんな手の込んだことはしまあせん。

typeofも単項演算子。

use Scalar::Util; !Scalar::Util::looks_like_number()のようなものです。

ただしNaNの定義はもっと厳密です。

NaN != NaN

isFinite

編集

無限大はInfinity。Infinityでないことを確かめるのがisFinite()。

isNaN(null)はfalse。isNaN(undefined)はtrue。

数値でないものを除くには、

if (x == null || isNaN(x))
    return;

とする必要がありそうです(単にisNaN(x)では、nullを通してしまう)。

trueとfalse

編集

while(true)よりもwhile(1)のほうが見やすいです。

constはvarと併用することはできません。定数は常にグローバル変数です。