0x0b
js_about_01
最終更新:
0x0b
-
view
JavaScript
Mozilla, Netscape
動的型付け
大文字・小文字を区別する
大文字・小文字を区別する
このガイドについて
JavaScript の各バージョンにおける新機能
読者が知っておくべきこと
JavaScript のバージョン
JavaScript の情報の所在
JavaScript を学ぶ上での Tips
文書の約束事
JavaScript 概要
JavaScript とは何か
JavaScript と Java
JavaScript と ECMAScript 仕様
JavaScript のバージョンと ECMAScript の版との関係
JavaScript の文書と ECMAScript の仕様書
JavaScript と ECMAScript の用語
型・値
(引数ゼロ)
引数なしの Number コンストラクタは +0 を返し
引数なしの String コンストラクタは ""(空文字列)を返す
引数なしの Number コンストラクタは +0 を返し
引数なしの String コンストラクタは ""(空文字列)を返す
認識する値の型
Number(整数・実数区別なし), Boolean(true/false), String
プリミティブ値
null, underfined
Number(整数・実数区別なし), Boolean(true/false), String
プリミティブ値
null, underfined
型の変換
var answer = 42; answer = "Thanks for all the fish...";
代入時エラーメッセージなし
数値を文字列に変換
x = "The answer is " + 42 // "The answer is 42" を返す y = 42 + " is the answer" // "42 is the answer" を返す
数値同士だと変換しない
"37" - 7 // 30 を返す
"37" + 7 // "377" を返す
"37" - 7 // 30 を返す
"37" + 7 // "377" を返す
変数
アプリケーションで値を識別する名前
識別子
1文字目はアルファベット(a-z, A-Z) or アンダースコア (_) orドル記号 ($)
続く文字は+数字 (0-9) も使える
1.5では\uXXXX 形式の Unicode エスケープシーケンスが使える
exam)
続く文字は+数字 (0-9) も使える
1.5では\uXXXX 形式の Unicode エスケープシーケンスが使える
exam)
Number_hits や temp99 や _name
変数宣言
- var というキーワードを使う。
exam)
var x = 42 //この構文は ローカル変数およびグローバル変数どちらの宣言にも使用可能
- 単に値を代入する
exam)
x = 42 //いつでも グローバル変数 を宣言できるが、厳格な JavaScript 警告 (strict JavaScript warning) が発生する
※非推奨
変数の評価
var文を初期化せずに宣言された変数は undefined の値をとる
未宣言の変数にアクセスしようとすると、ReferenceError 例外が投げられます
未宣言の変数にアクセスしようとすると、ReferenceError 例外が投げられます
var a; print("a の値は " + a); // "a の値は undefined" を出力 print("b の値は " + b); // ReferenceError 例外を投げる
undefined を使うと変数に値が入っているかどうかを確かめられます
変数 input には値が代入されておらず、if 文での評価結果は true です。
exam)
exam)
var input; if(input === undefined){ doThis(); } else { doThat(); }
undefined は真偽値コンテキストで使用されると false として振る舞う
myArray の要素が未定義であるために関数 myFunction が実行されます。
exam)
myArray の要素が未定義であるために関数 myFunction が実行されます。
exam)
var myArray = new Array(); if (!myArray[0]) myFunction();
null 変数を評価すると、数値コンテキストにおいては null 値は 0 、真偽値コンテキストでは false として振る舞う
exam)
exam)
var n = null; print(n * 32); // prints 0
変数のスコープ
グローバル(大域)変数
変数を関数の外側で宣言すると、その変数はその文書のどのコードからも使用できるようになる
ローカル(局所)変数
変数を関数の内部で宣言すると、その変数はその関数の中でしか使用できない
変数を関数の外側で宣言すると、その変数はその文書のどのコードからも使用できるようになる
ローカル(局所)変数
変数を関数の内部で宣言すると、その変数はその関数の中でしか使用できない
Javascript には ブロック文 のスコープがない。むしろ、そのブロックを内包しているコードに対して局所化される
condition が false のとき、例外を投げずに 0 が出力されます。
exam)
condition が false のとき、例外を投げずに 0 が出力されます。
exam)
if (condition) { var x = 5; } print(x ? x : 0);
JavaScript の変数に関する独特なこととして、後に宣言される変数を例外を発生させることなく参照できるというのも挙げられます
exam)
exam)
print(x === undefined); // "true" を出力 var x = 3;
グローバル変数
実際にはグローバルオブジェクトのプロパティのこと
ウェブページではグローバルオブジェクトは window です。
そのため、window.variable という構文を使うことでグローバル変数をセットしたり、グローバル変数にアクセスしたりすることができます
したがって、あるウィンドウやフレームで宣言したグローバル変数に、そのウィンドウやフレームの名前を指定すれば別のウィンドウやフレームからアクセスできます。例えば、phoneNumber という変数を FRAMESET 文書内で宣言すると、子フレームから parent.phoneNumber としてこの変数を参照することができます
ウェブページではグローバルオブジェクトは window です。
そのため、window.variable という構文を使うことでグローバル変数をセットしたり、グローバル変数にアクセスしたりすることができます
したがって、あるウィンドウやフレームで宣言したグローバル変数に、そのウィンドウやフレームの名前を指定すれば別のウィンドウやフレームからアクセスできます。例えば、phoneNumber という変数を FRAMESET 文書内で宣言すると、子フレームから parent.phoneNumber としてこの変数を参照することができます
定数
const キーワードを使い読み取り専用の名前付き定数を作ることができる
定数識別子の構文は変数識別子のそれと同じ
定数識別子の構文は変数識別子のそれと同じ
識別子
1文字目はアルファベット(a-z, A-Z)、アンダースコア(_)
続く文字はアルファベット、アンダースコア、数字が使える
exam)
1文字目はアルファベット(a-z, A-Z)、アンダースコア(_)
続く文字はアルファベット、アンダースコア、数字が使える
exam)
const prefix = '212';
定数は代入によって値を変えたり、スクリプト実行中に再宣言したりすることはできません。
定数のスコープルールは、const キーワードがグローバル定数でさえも常に必須であることを除いて、変数のそれと同じです
const キーワードを省略すると、その識別子は変数を表すと見なされます
const キーワードを省略すると、その識別子は変数を表すと見なされます
同一スコープ内で、関数や変数と同じ名前の定数を宣言することはできません
exam)
exam)
// この場合、エラーが発生 function f() {}; const f = 5; // この場合もエラーが発生 function f() { const g = 5; var g; // 文 }
リテラル
JavaScriptでは値を表すのにリテラルを使う
リテラルは固定された値で変数ではない
あなたがスクリプト中に直接記述する値のこと
リテラルは固定された値で変数ではない
あなたがスクリプト中に直接記述する値のこと
リテラルの種類
配列リテラル
配列リテラルとは、ゼロ個以上の式のリスト
各々の式が配列の要素を表しており、角括弧 ([]) で括られているもののこと
配列リテラルを使って配列を作ると、その配列は指定された値で要素を初期化され、配列の長さは指定された引数の個数にセットされます
各々の式が配列の要素を表しており、角括弧 ([]) で括られているもののこと
配列リテラルを使って配列を作ると、その配列は指定された値で要素を初期化され、配列の長さは指定された引数の個数にセットされます
例では、3 つの要素を持ち、長さが 3 の coffees という配列を作ります
exam)
exam)
var coffees = ["French Roast", "Colombian", "Kona"];
注意 配列リテラルはオブジェクト初期化子の一種です
オブジェクト初期化子の使用 を参照してください
オブジェクト初期化子の使用 を参照してください
トップレベルのスクリプト内でリテラルを用いて配列を作った場合、JavaScript は配列リテラルを含む式を評価するたびに配列を解釈します
さらに関数内で使用されたリテラルは関数が呼び出されるたびに生成されます。
配列リテラルも Array オブジェクト
さらに関数内で使用されたリテラルは関数が呼び出されるたびに生成されます。
配列リテラルも Array オブジェクト
配列リテラルでの余計なコンマ
配列リテラルではすべての要素を指定する必要はありません
立て続けに 2 つのコンマを置くと、未指定の要素のための空間を持った配列が生成されます
立て続けに 2 つのコンマを置くと、未指定の要素のための空間を持った配列が生成されます
次の例では fish という配列を作ります。
exam)
exam)
var fish = ["Lion", , "Angel"];
この配列は値を持つ 2 つの要素と 1 つの空の要素を持っています(fish[0] は "Lion"、fish[1] は undefined、fish[2] は "Angel")
要素のリストの最後にコンマを付けた場合、そのコンマは無視されます
次の例では配列の長さは 3
myList[3] は存在しません
リストの他のすべてのコンマは新しい要素を示します
exam)
myList[3] は存在しません
リストの他のすべてのコンマは新しい要素を示します
exam)
var myList = ['home', , 'school', ];
次の例では配列の長さは 4
myList[0] と myList[2] が抜けています
exam)
myList[0] と myList[2] が抜けています
exam)
var myList = [ , 'home', , 'school'];
次の例では配列の長さは 4
myList[1] と myList[3] が抜けています
最後のコンマのみが無視されます
exam)
myList[1] と myList[3] が抜けています
最後のコンマのみが無視されます
exam)
var myList = ['home', , 'school', , ];
真偽値リテラル
真偽値型は true と false、2 つのリテラル値がある
プリミティブな真偽値の trueとfalse を Boolean オブジェクトの true や false という値と混同してはいけません
Boolean オブジェクトはプリミティブな真偽値型のラッパです
Booleanオブジェクト
Boolean オブジェクトはプリミティブな真偽値型のラッパです
Booleanオブジェクト
整数リテラル
整数は10 進数、16 進数、8 進数で表現可能
10 進整数リテラル | 先頭の 0(ゼロ)を除いた、数字の連続からなります |
8進数 | 整数リテラルが先頭の 0(ゼロ)で 0 から 7 までの数字のみからなります |
16真数 | 先頭の 0x(または 0X)で0 から 9までの数字と a から f および A から F のアルファベットからなります |
8 進整数リテラルは廃止予定
ECMA-262 第 3 版から除かれている
JavaScript 1.5 では後方互換のためにサポートしている
ECMA-262 第 3 版から除かれている
JavaScript 1.5 では後方互換のためにサポートしている
整数リテラルの例
exam)
exam)
0、117、-345(10 進数) 015、0001、-077(8 進数) 0x1123、0x00111、-0xF1A7(16 進数)
浮動小数点リテラル
浮動小数点リテラルは少なくとも 1 つの数字と、小数点もしくは "e"(または "E")からなる必要がある
浮動小数点の構成
- 整数部(先頭に "+" や "-" の符号を付けてもよい)
- 小数点 (".")
- 小数部
- 指数部
- 指数部
"e" または "E" の後に整数が続く形です
浮動小数点リテラルの例
exam)
3.1415、-3.1E12、.1e12、2E-12
より簡潔に書けば、 次の形式です
exam)
3.1415、-3.1E12、.1e12、2E-12
より簡潔に書けば、 次の形式です
[digits][.digits][(E|e)[(+|-)]digits]
exam)
3.14 2345.789 .3333333333333333333
オブジェクトリテラル
ゼロ個以上のプロパティ名とそれに結びつけられた値のペアのリスト
波括弧 ({}) でくくられているもの
注意
オブジェクトリテラルを文の最初に使わないようにしてください
{ がブロックの始まりと解釈され、エラーを引き起こしたり、予期せぬ動作をしたりすることになります
波括弧 ({}) でくくられているもの
注意
オブジェクトリテラルを文の最初に使わないようにしてください
{ がブロックの始まりと解釈され、エラーを引き起こしたり、予期せぬ動作をしたりすることになります
オブジェクトリテラルの例を示す
car オブジェクトの最初の要素は myCar プロパティを定義します
2 番目の要素の getCar プロパティは関数を呼び出します (CarTypes("Honda"))
3 番目の要素の special プロパティは既存の変数を使用します (Sales)
exam)
car オブジェクトの最初の要素は myCar プロパティを定義します
2 番目の要素の getCar プロパティは関数を呼び出します (CarTypes("Honda"))
3 番目の要素の special プロパティは既存の変数を使用します (Sales)
exam)
var Sales = "Toyota"; function CarTypes(name) { if (name == "Honda") return name; else return "Sorry, we don't sell " + name + "."; } var car = { myCar: "Saturn", getCar: CarTypes("Honda"), special: Sales }; document.write(car.myCar); // Saturn document.write(car.getCar); // Honda document.write(car.special); // Toyota
さらに、数値リテラルや文字列リテラルをプロパティ名に使用したり、オブジェクトをネストさせたりできます
例ではこれらのオプションを使用しています
exam)
例ではこれらのオプションを使用しています
exam)
var car = { manyCars: {a: "Saab", b: "Jeep"}, 7: "Mazda" }; document.write(car.manyCars.b); // Jeep document.write(car[7]); // Mazda
以下のことに注意してください
var foo = {a: "alpha", 2: "two"}; document.write(foo.a); // alpha document.write(foo[2]); // two //document.write(foo.2); // Error: missing ) after argument list //document.write(foo[a]); // Error: a is not defined document.write(foo["a"]); // alpha document.write(foo["2"]); // two
文字列リテラル
ゼロ個以上の文字を二重引用符 (") または単一引用符 (') でくくったもの
注意
文字列は同じ種類の引用符でくくってください
つまり、どちらも単一引用符にするか、またはどちらも二重引用符にするかということです
注意
文字列は同じ種類の引用符でくくってください
つまり、どちらも単一引用符にするか、またはどちらも二重引用符にするかということです
文字列リテラルの例
"blah" 'blah' "1234" "one line \n another line" "John's cat"
文字列リテラルの値でなら、String オブジェクトのどんなメソッドでも呼び出すことができる
JavaScript が自動的に文字列リテラルを一時的な String オブジェクトに変換し、メソッドを呼び出し、その一時的な String オブジェクトを破棄する
JavaScript が自動的に文字列リテラルを一時的な String オブジェクトに変換し、メソッドを呼び出し、その一時的な String オブジェクトを破棄する
String.length プロパティを文字列リテラルで使うこともできる
"John's cat".length
特に String オブジェクトを使う必要がない場合は文字列リテラルを使うようにしてください
String オブジェクト
String オブジェクト
文字列での特殊文字の使用
普通の文字に加えて、文字列では特殊文字も使える
普通の文字に加えて、文字列では特殊文字も使える
例をご覧ください。
exam)
exam)
"one line \n another line"
JavaScript の文字列で使用できる特殊文字の表を示す
文字 | 意味 |
\b | 後退 |
\f | 改ページ |
\n | 改行 |
\r | 復帰 |
\t | タブ |
\v | 垂直タブ |
\' | アポストロフィまたは単一引用符 |
\" | 二重引用符 |
\\ | バックスラッシュ (\) |
\XXX | 0~377 までの 3 桁の 8 進数 XXX で指定された Latin-1 エンコーディングの文字。例:\251 は著作権記号を示す。 |
\xXX | 00~FF までの 2 桁の 16 進数 XX で指定された Latin-1 エンコーディングの文字。例:\xA9 は著作権記号を示す |
\uXXXX | 4 桁の 16 進数 XXXX で指定された Unicode 文字。例:\u00A9 は著作権記号を示す。Unicode エスケープシーケンス |
文字のエスケープ
特殊文字の表に載っていない文字の直前にバックスラッシュを付けても無視されますが、この使用法は廃止予定であり、使用を避けるべきです
特殊文字の表に載っていない文字の直前にバックスラッシュを付けても無視されますが、この使用法は廃止予定であり、使用を避けるべきです
バックスラッシュを直前に付けることで引用符を文字列に挿入できます。これを「引用符をエスケープする」と言う
exam)
exam)
var quote = "He read \"The Cremation of Sam McGee\" by R.W. Service."; document.write(quote);
この結果は次のようになります。
exam)
exam)
He read "The Cremation of Sam McGee" by R.W. Service.
文字列にバックスラッシュそのものを挿入するときはバックスラッシュをエスケープする必要があります
例:ある文字列に c:\temp というファイルパスを代入するとき
exam)
exam)
var home = "c:\\temp";
文字参照と数値参照
記号 | 文字参照 | 数値参照 | ||
10進数 | 8進数 | 16進数 | ||
' | ’ | &; | &; | &; |
" | " | &; | &; | &; |
< | < | &; | &; | &; |
\> | \> | &; | &; | &; |
& | & | &; | &; | &; |
半角スペース | &; | &; | &; |
Unicode
Unicode は主要な文字言語の交換や表示を目指したユニバーサルな文字コードの標準です。これは南北アメリカ、ヨーロッパ、中東、アフリカ、インド、アジア、太平洋地域の言語、さらに歴史的な文字や技術記号をカバーしています。Unicode は多言語テキストの交換、処理、表示を可能にします。一般的な技術記号や数学記号も扱えます。国ごとの文字の標準の違いなど、多言語処理に関する国際化問題を解消することが期待されています。しかしながら、今のところは現代の文字と古い文字がすべてサポートされているわけではありません。
Unicode 文字セットはすべての有名なエンコーディングに使用できます。Unicode は ASCII (American Standard Code for Information Interchange) 文字セットをモデルとしています。これは各文字に対して数値と名前を割り当てています。文字エンコーディングはその文字の識別情報およびその数値(コードの位置)、さらにこの値のビット表示を指します。16 ビットの数値(コード値)は 16 進数とその頭に U を付けたもので定義されます。例えば、U+0041 は A を表します。この値に対する固有の名前は LATIN CAPITAL LETTER A です。
JavaScript 1.3 より前のバージョンでは Unicode はサポートされていません。
Unicode の ASCII や ISO との互換性
Unicode は ISO/IEC 10646-1; 1993 と完全互換です。これは ISO 10646 のサブセットです。
いくつかのエンコーディングの標準(UTF-8、UTF-16、ISO UCS-2 を含む)は Unicode を実際のビットとして物理的に表現するのに使用されます。
Unicode の UTF-8 エンコーディングは ASCII 文字と互換性があり、多くのプログラムでサポートされています。最初の 128 の Unicode 文字は ASCII 文字に対応しており、同じバイト値をとります。Unicode 文字の U+0020 から U+007E までは ASCII 文字の 0x20 から 0x7E と同等です。ASCII はラテンアルファベットをサポートしており、7 ビット文字セットを使用しますが、UTF-8 は各文字について 1 オクテットから 4 オクテットを使用します(「オクテット」は 1 バイト、すなわち 8 ビット)。これによって何百万もの文字を表現できます。別のエンコーディング標準である UTF-16 は Unicode 文字を表現するのに 2 オクテットを使用します。エスケープシーケンスによって UTF-16 は Unicode の範囲全体を 4 オクテットで表現できるようになります。ISO UCS-2 (Universal Character Set) は 2 オクテットを使用します。
JavaScript および Navigator は UTF-8/Unicode をサポートしているため、非ラテン文字、国際文字、地域化された文字そして特殊な技術記号を JavaScript プログラムで使用できます。Unicode は多言語テキストをエンコードする標準の方法を提供します。Unicode の UTF-8 エンコーディングは ASCII と互換性があるため、ASCII 文字をプログラムで使用することもきます。また、非 ASCII の Unicode 文字を JavaScript のコメント、文字列リテラル、識別子、および正規表現で使用することもできます。
Unicode エスケープシーケンス
文字列リテラル、正規表現、識別子において Unicode エスケープシーケンスを使用することができます。エスケープシーケンスは ASCII 文字 6 文字からなります。それは \u と 4 桁の 16 進数です。例えば \u00A9 は著作権記号を表しています。JavaScript ではどの Unicode エスケープシーケンスも 1 つの文字として解釈されます。
次のコードは著作権記号と "Netscape Communications" という文字列を返します。
x="\u00A9 Netscape Communications"
よく使用される特殊文字とその Unicode 値
カテゴリ | Unicode 値 | 名前 | フォーマット名 |
ホワイトスペースの値 | \u0009 | タブ | <TAB> |
\u000B | 垂直タブ | <VT> | |
\u000C | 改ページ | <FF> | |
\u0020 | スペース | <SP> | |
行終端の値 | \u000A | 改行 | <LF> |
\u000D | 復帰 | <CR> | |
付加的な Unicode エスケープシーケンスの値 | \u0008 | 後退 | <BS> |
\u0009 | 水平タブ | <HT> | |
\u0022 | 二重引用符 | " | |
\u0027 | 単一引用符 | ' | |
\u005C | バックスラッシュ | \ |
JavaScript での Unicode エスケープシーケンスの使用方法は Java のそれとは異なります。JavaScript では、エスケープシーケンスは最初から特殊文字として解釈されるということはありません。例えば、文字列中の行終端のエスケープシーケンスは、関数がそれを解釈する前にその文字列を打ち切るということはありません。どのエスケープシーケンスがコメントで使用されたとしても JavaScript はそれを無視します。Java では、1 行コメント内でエスケープシーケンスが使用された場合、それを Unicode 文字として解釈します。文字列リテラルでは Java コンパイラは最初からエスケープシーケンスを解釈します。例えば、行終端のエスケープ文字(例:\u000A)を Java で使用すると文字列リテラルを打ち切ります。また Java では行終端が文字列リテラル内では許されていないために、これはエラーが発生します。文字列リテラルで改行を表したい場合は \n を使用しなければなりません。JavaScript ではエスケープシーケンスでも \n と同じように機能します。
JavaScript ファイルにおける Unicode 文字
以前のバージョンの Gecko では、XUL から読み込まれる JavaScript ファイルは Latin-1 文字エンコーディングが前提とされていました。Gecko 1.8 からは文字エンコーディングは XUL ファイルのエンコーディングから推測されます。詳しくは XUL JavaScript における国際文字 を参照してください。
Unicode を用いた文字の表示
Netscape といったクライアントが Unicode をサポートしている必要があります。さらに適当な Unicode フォントもそのクライアントで使用できなくてはならず、またクライアントのプラットフォームが Unicode をサポートしていなければなりません。Unicode フォントが Unicode を全部は表示できないということがよくあります。Windows 95 など、Unicode を部分的にサポートしているというプラットフォームもあります。
非 ASCII 文字の入力を受け取るには、クライアントが入力を Unicode として送信する必要があります。標準的な拡張キーボードを使用すると、Unicode でサポートされている付加的な文字をクライアントが簡単には入力できなくなります。Unicode 文字を入力する唯一の方法が Unicode エスケープシーケンスを使用することという場合がたまにあります。
Unicode の詳細な情報については Unicode Home Page や The Unicode Standard, Version 2.0(出版元:Addison-Wesley、1996 年)をご覧ください。