ECMAScript一元演算子

一元演算子は、操作するオブジェクトや値の1つのパラメータしか持っていません。これらはECMAScriptで最もシンプルな演算子です。

delete

delete演算子は、以前に定義されたオブジェクトの属性やメソッドの参照を削除します。例えば:

var o = new Object;
o.name = "David";
alert(o.name); // "David"を出力します
o.nameを削除します。
alert(o.name);	//「undefined」を出力します

この例では、name 属性が削除され、その結果、その参照を強制的に解除し undefined(未初期化の変数の値)に設定することになります。

delete 演算子は開発者が未定義の属性やメソッドを削除することができません。例えば、以下のコードはエラーを引き起こします:

delete o.toString;

toString が有効なメソッド名であっても、この行のコードはエラーを引き起こします。なぜなら、toString() メソッドは原始の ECMAScript メソッドであり、開発者によって定義されたものではありません。

void

void 演算子はどの値に対しても undefined を返します。この演算子は、例えば、HTMLの<a>要素からJavaScript関数を呼び出す際に、不应该输出的值を避免に通常使用されます。これを正しく行うためには、関数は有効な値を返さない必要があります。そうしないと、ブラウザはページをクリアし、関数の結果のみを表示します。例えば:

<a href="javascript:window.open('about:blank')">クリックしてください</a>

この行のコードを HTML ページに配置し、リンクをクリックすると、スクリーンに「[object]」が表示されます。TIY

これは、window.open() メソッドが新しいウィンドウの参照を返すためです。その後、そのオブジェクトは表示するための文字列に変換されます。

この効果を避けるために、void 演算子を使用して window.open() 関数を呼び出すことができます:

<a href="javascript:void(window.open('about:blank'))">クリックしてください</a>

これにより、window.open() の呼び出しが undefined を返します。これは有効な値ではありませんし、ブラウザのウィンドウには表示されません。

ヒント:覚えておいてください、値を返さない関数は実際には undefined を返しています。

前インクリメント/前デクリメント演算子

C(および Java)から直接借用された二つの演算子は、前インクリメントおよび前デクリメント演算子です。

前インクリメント演算子とは、値に 1 を加えるもので、形式は変数の前に二つのプラス記号(++)を置きます:

var iNum = 10;
++iNum;

2行目のコードが iNum を 11 に増加させます。これは実際には以下のように等価です:

var iNum = 10;
iNum = iNum + 1;

同様に、前デクリメント演算子は値から 1 を減らし、形式は変数の前に二つのマイナス記号(--)を置きます:

var iNum = 10;
--iNum;

この例では、2行目のコードが iNum の値を 9 に減らしています。

プレフィックス演算子を使用する際には、インクリメントおよびデクリメント演算子が計算式の前に発生することに注意してください。以下の例を考えてみてください:

var iNum = 10;
--iNum;
alert(iNum);	//出力「9」
alert(--iNum);	//出力「8」
alert(iNum);	//出力「8」

2行目のコードはiNumに対して減少演算子を適用し、3行目のコードの表示結果は(「9」)です。4行目のコードはiNumに対して再び減少演算子を適用しますが、この場合は接頭減少演算子と出力操作が同じ文に含まれており、表示結果は「8」です。すべての減少操作が実行されたことを証明するために、5行目のコードでは「8」を出力します。

算術表現式中、接頭増加演算子と接頭減少演算子の優先順位は同じですので、左から右の順番で計算を行ってください。例えば:

var iNum1 = 2;
var iNum2 = 20;
var iNum3 = --iNum1 + ++iNum2;	//等しい「22」
var iNum4 = iNum1 + iNum2;		//等しい「22」

前のコードでは、iNum3が22に等しいです。なぜなら、式が計算するのは1 + 21で、変数iNum4も22に等しいです。

後増加/後減少演算子

C(およびJava)から直接借用された2つの演算子があります、それが後増加演算子と後減少演算子です。

後増加演算子も値に1を加えますが、変数の後に2つの加号(++)を置きます:

var iNum = 10;
iNum++;

予想通り、後減少演算子も値から1を減らし、変数の後に2つの減号(--)を付けます:

var iNum = 10;
iNum--;

2行目のコードはiNumの値を9に減らします。

接頭演算子とは異なり、後頭演算子はその表現式が計算された後に増加または減少演算を適用する。以下の例を考えてみてください:

var iNum = 10;
iNum--;
alert(iNum);	//出力「9」
alert(iNum--);	//出力「9」
alert(iNum);	//出力「8」

接頭演算子の例と同様に、2行目のコードはiNumに対して減少演算子を適用し、3行目のコードは結果(「9」)を表示します。4行目のコードはiNumの値を表示し続けますが、この場合は減少演算子が式の計算の後に適用されるため、この文は「9」を表示します。5行目のコードを実行した後、alert関数は「8」を表示します。なぜなら、4行目のコードの実行後と5行目のコードの実行前には後減少演算子が実行されたからです。

算術表現式中、後増加演算子と後減少演算子の優先順位は同じですので、左から右の順番で計算を行ってください。例えば:

var iNum1 = 2;
var iNum2 = 20;
var iNum3 = iNum1-- + iNum2++;	//等しい「22」
var iNum4 = iNum1 + iNum2;		//等しい「22」

前のコードでは、iNum3が22に等しいのは、その式が2 + 20を計算するからです。変数iNum4も22に等しいですが、それは1 + 21を計算しているため、インクリメントおよびデクリメント演算はiNum3に値を代入した後に発生します。

一元加法および一元減法

多くの人々は一元加法および一元減法に馴染みがあります。ECMAScriptでのその使用法は、高校数学で学んだものと同じです。

一元加法は本質的に数字には影響を与えません:

var iNum = 20;
iNum = +iNum;
alert(iNum);	//「20」を出力

このコードは数字20に一元加法を適用し、結果は20です。

一元加法は数字には影響を与えませんが、文字列には面白い効果があり、それを数字に変換します。

var sNum = "20";
alert(typeof sNum);	//「string」を出力
var iNum = +sNum;
alert(typeof iNum);	//「number」を出力

このコードは文字列「20」を実際の数字に変換します。一元加法演算子が文字列に対して操作を行う場合、parseInt()と同様に文字列を計算しますが、主な違いは、文字列が「0x」で始まる場合(16進数を表す)に限り、一元演算子がそれを10進数の値に変換できることです。したがって、「010」を一元加法で変換すると常に10になりますが、「0xB」は11に変換されます。

一方で、一元減法は数値に対して負を求めることです(例えば、20を-20に変換する):

var iNum = 20;
iNum = -iNum;
alert(iNum);	//「-20」を出力

一元加法演算子と同様に、一元減法演算子も文字列を近似の数字に変換し、その値を負にします。例えば:

var sNum = "20";
alert(typeof sNum);	//「string」を出力
var iNum = -sNum;
alert(iNum);		//「-20」を出力
alert(typeof iNum);	//「number」を出力

上記のコードでは、一元減法演算子は文字列「-20」を-20に変換します(一元減法演算子は一元加法演算子と同様に、16進数および10進数を処理しますが、それに加えてその値を負にします)。