特殊演算子
JavaScript は以下の特殊演算子があります。
条件演算子
条件演算子は JavaScript では唯一の 3 つのオペランドをとる演算子です。演算子は条件に基づいて 2 つの値のうち、1 つを選択します。構文は次のとおりです。
condition ? val1 : val2
condition
が true の場合、演算子は val1
の値を選択します。そうでない場合は val2
の値を選択します。標準的な演算子が使用できる場所でならどこででも条件演算子を使用することができます。
例えば、
status = (age >= 18) ? "adult" : "minor"
この文では、age
が 18 以上の場合 "adult" という値を変数 status
に代入します。そうでない場合は "minor" という値を status
に代入します。
コンマ演算子
コンマ演算子 (,) は単に両方のオペランドを評価し、第 2 のオペランドの値を返します。この演算子は主に for
ループ内で使用されます。このことでループのたびに複数の変数を更新できるようになります。
例えば、a が一辺が 10 要素の 2 次元配列のとき、以下のコードではコンマ演算子を用いることで 2 変数を同時にインクリメントしています。このコードでは配列の対角成分の値を出力します。
for (var i=0, j=9; i <= 9; i++, j--) document.writeln("a["+i+"]["+j+"]= " + a[i][j])
delete
delete 演算子はオブジェクトやオブジェクトのプロパティ、配列の指定されたインデックスの要素を削除します。構文は以下のとおりです。
delete objectName delete objectName.property delete objectName[index] delete property // with 文内でのみ有効
ここで、objectName
はオブジェクトの名前を、property
は既存のプロパティを、index
は配列の要素の位置を表す整数をそれぞれ表しています。
4 番目の形式は with
文内でのみ有効で、これはあるオブジェクトからプロパティを削除します。
delete
演算子を使うことで暗黙的に宣言された変数を削除することができますが、var
文を用いて宣言された変数は削除できません。
delete
演算子が成功すると、そのプロパティや要素には undefined
がセットされます。また、演算が可能な場合は delete
演算子は true を返します。演算が不可能な場合は false を返します。
x=42 var y= 43 myobj=new Number() myobj.h=4 // プロパティ h を作成 delete x // true を返す(暗黙的に宣言されているならば削除可能) delete y // false を返す(var 付きで宣言されているなら削除不可能) delete Math.PI // false を返す(定義済みプロパティは削除不可能) delete myobj.h // true を返す(ユーザ定義プロパティは削除可能) delete myobj // true を返す(暗黙的に宣言されているならば削除可能)
配列要素の削除
配列要素を削除したとき、配列の長さには影響を及ぼしません。例えば a[3] を削除したとき、a[4] は依然 a[4] のままで、a[3] は undefined になります。
delete
演算子で配列要素を除去すると、もうその要素はその配列からなくなります。次の例では tree[3] は delete
によって除去されます。
trees=new Array("redwood","bay","cedar","oak","maple") delete trees[3] if (3 in trees) { // ここは実行されない }
配列要素は存在させたいが、値は未定義にしたいという場合は、delete
演算子の代わりに undefined
キーワードを使用してください。次の例では trees[3]
には undefined
という値が代入されますが、その配列要素は存在したままになります。
trees=new Array("redwood","bay","cedar","oak","maple") trees[3]=undefined if (3 in trees) { // ここは実行される }
in
in
演算子は、指定されたプロパティが指定されたオブジェクトにある場合に true を返します。構文は以下のとおりです。
propNameOrNumber in objectName
ここで、propNameOrNumber
はプロパティ名か配列のインデックスを表す文字列式または数値式を、objectName
はオブジェクトの名前をそれぞれ表しています。
次の例では in
演算子の使用法を示します。
// 配列 trees=new Array("redwood","bay","cedar","oak","maple") 0 in trees // true を返す 3 in trees // true を返す 6 in trees // false を返す "bay" in trees // false を返す(インデックスの指す値ではなく、 // インデックスの数字を指定しなければならない) "length" in trees // true を返す(length は Array のプロパティ) // 定義済みオブジェクト "PI" in Math // true を返す myString=new String("coral") "length" in myString // true を返す // ユーザ定義オブジェクト mycar = {make:"Honda",model:"Accord",year:1998} "make" in mycar // true を返す "model" in mycar // true を返す
instanceof
instanceof
演算子は、指定されたオブジェクトが指定されたオブジェクトの種類である場合に true を返します。構文は次のとおりです。
objectName instanceof objectType
ここで、objectName
は objectType
と比較するオブジェクトの名前を、objectType
は Date
や Array
のようなオブジェクトの種類をそれぞれ表しています。
実行時にオブジェクトの種類を確認する必要があるときは instanceof
を使用してください。例えば、例外を受け取るとき、投げられた例外の種類によって別々の例外を扱うコードに分岐させることができます。
例えば、次のコードでは instanceof
を使用することで theDay
が Date
オブジェクトであるかどうかを決定しています。theDay
は Date
オブジェクトなので if
文の中の文は実行されます。
theDay=new Date(1995, 12, 17) if (theDay instanceof Date) { // 実行される文 }
new
new
演算子は、ユーザ定義オブジェクトや、Array
、Boolean
、Date
、Function
、Image
、Number
、Object
、Option
、RegExp
、String
といった定義済みオブジェクトのインスタンスを作成するのに使用します。サーバでは DbPool
、Lock
、File
、SendMail
といったオブジェクトも使用できます。new
の使用法は以下のとおりです。
objectName = new objectType ( param1 [,param2] ...[,paramN] )
オブジェクト初期化子を使用してもオブジェクトを作成することができます。オブジェクト初期化子の使用 にて説明しています。
詳しくはコア JavaScript リファレンスの new 演算子 のページを参照してください。
this
this
キーワードを使うことでカレントオブジェクトを参照することができます。一般に this
はあるメソッド内でそのメソッドを呼び出したオブジェクトを参照します。使用法は以下のとおりです。
this[.propertyName]
例 1
あるオブジェクトの value
プロパティの妥当性を確認する validate
という関数を想定します。関数にはそのオブジェクトと、上限および下限の値を渡します。
function validate(obj, lowval, hival) { if ((obj.value < lowval) || (obj.value > hival)) alert("Invalid Value!") }
各フォーム要素の onChange
イベントハンドラにおいて validate
を呼び出します。this
を使うことでフォーム要素を渡すことができます。次の例をご覧ください。
<B>Enter a number between 18 and 99:</B> <INPUT TYPE = "text" NAME = "age" SIZE = 3 onChange="validate(this, 18, 99)">
例 2
form
プロパティと組み合わせると this
でカレントオブジェクトの親のフォームを参照できます。次の例では、myForm
というフォームに Text
オブジェクトとボタンが格納されています。ユーザがボタンをクリックすると、Text
オブジェクトの値にフォーム名がセットされます。ボタンの onClick
イベントハンドラは this.form
を利用して親のフォームである myForm
を参照します。
<FORM NAME="myForm"> Form name:<INPUT TYPE="text" NAME="text1" VALUE="Beluga"> <P> <INPUT NAME="button1" TYPE="button" VALUE="Show Form Name" onClick="this.form.text1.value=this.form.name"> </FORM>
typeof
typeof
演算子は次の方法のうち、どちらかの方法で使用します。
1. typeof operand 2. typeof (operand)
typeof
演算子は、未評価のオペランドの型を指す文字列を返します。operand
は返される型を調べる対象となる文字列、変数、キーワード、オブジェクトです。括弧はあってもなくてもかまいません。
以下の変数を定義することを想定します。
var myFun = new Function("5+2") var shape="round" var size=1 var today=new Date()
typeof
演算子はこれらの変数に対して以下の結果を返します。
typeof myFun is function typeof shape is string typeof size is number typeof today is object typeof dontExist is undefined
true
や null
というキーワードに対して、typeof
演算子は以下の結果を返します。
typeof true is boolean typeof null is object
数値や文字列に対して、typeof
演算子は以下の結果を返します。
typeof 62 is number typeof 'Hello world' is string
プロパティ値に対して、typeof
演算子はプロパティ値の型を返します。
typeof document.lastModified is string typeof window.length is number typeof Math.LN2 is number
メソッドや関数に対して、typeof
演算子は以下の結果を返します。
typeof blur is function typeof eval is function typeof parseInt is function typeof shape.split is function
定義済みオブジェクトに対して、typeof
演算子は以下の結果を返します。
typeof Date is function typeof Function is function typeof Math is function typeof Option is function typeof String is function
void
void
演算子は次の方法のうち、どちらかの方法で使用します。
1. void (expression) 2. void expression
void
演算子は値を返さずに評価する式を指定します。expression
は評価する JavaScript の式です。式の周りの括弧はあってもなくてもかまいませんが、使用したほうが見た目はいいです。
void
演算子を使用することで式をハイパーテキストリンクとして指定することができます。式は評価されますが、開いている文書の代わりに読み込まれるということはありません。
以下のコードはユーザがクリックしても何も起こらないハイパーテキストリンクを作成します。ユーザがリンクをクリックすると void(0)
は undefined に評価され、JavaScript としては影響を及ぼしません。
<A HREF="javascript:void(0)">Click here to do nothing</A>
以下のコードはユーザがクリックするとフォームが送信されるハイパーテキストリンクを作成します。
<A HREF="javascript:void(document.form.submit())"> Click here to submit</A>