利用者:Senseequal/JavaScript
同値
[編集]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は実行されないようです。
with
[編集]オブジェクトの主題化。
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
でもいけます。
そう、じつはオブジェクト=ハッシュなのです。しかし=>は使えません。
ハッシュというのは方言なので「連想配列」と呼ぶこと。
in
[編集]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が返されます。
s///
[編集]Stringオブジェクトのreplaceメソッド。
"Hello, world!".replace("WoRlD", "JavaScript", "i"); // Hello, JavaScript!
非破壊的。
正規表現でも文字列でもよいです。
修飾子はフラグと呼ばれます。第三引数に指定します。
定数
[編集]const。
πはMath.PI。
var
[編集]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
[編集]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秒間隔で数え上げます。
void
[編集]常に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も単項演算子。
isNaN
[編集]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
[編集]constはvarと併用することはできません。定数は常にグローバル変数です。