Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この章では JavaScript の式 (expression) や演算子 (operator) について、代入、比較、算術、ビット、論理、文字列、三項演算子などを説明しています。
高いレベルでは、式 は値に解決するコードの有効な単位です。式には (値を代入するなどの)副作用があるものと、純粋に 評価 を行うものの 2 種類があります。
x = 7 という式は前者の例です。この式は = 演算子 を使用して、変数 x に値 7 を代入しています。この式自体は 7 と評価されます。
3 + 4 という式は後者の例です。この式は + 演算子を使用して 3 と 4 を加算し、値として 7 を生み出します。しかし、もしこれが最終的に大きな構成要素(例えば、const z = 3 + 4 のような変数宣言)の一部でなければ、その結果はすぐに破棄されます。評価が何の効果ももたらさないので、これは通常プログラマーのミスです。
上の例でも示したように、すべての複雑な式は = や + などの 演算子 で結合されています。この節では、以下の演算子を紹介します。
これらの演算子は、より高い優先順位の演算子か、基本的な式の 1 つによって形成されたオペランドを結合します。演算子と式の完全で詳細なリストは、リファレンスに掲載されています。
演算子の 優先順位 は、式を評価する際に演算子を評価する順序を決定します。例えば次の例をご覧ください。
* と + の順序が異なるにもかかわらず、どちらの式も 7 という結果になります。なぜなら、 * は + よりも優先されるので、 * と結合された式が常に最初に評価されるからです。演算子の優先順位を上書きするには、括弧を使用します(グループ化式 - 基本的な式を作成します)。演算子の優先順位の完全な表と様々な注意点を見るには、演算子の優先順位のリファレンスページを参照してください。
JavaScript は 二項演算子 や 単項演算子 を実装しており、さらには特殊な三項演算子である条件演算子も実装しています。 二項演算子は次のように、演算子の前と演算子の後に 2 つのオペランド (operand) が必要となります。
オペランド1 演算子 オペランド2例えば 3 + 4 や x * y です。この形式は、演算子が 2 つのオペランドの間に配置されるため、 infix 二項演算子と呼ばれます。JavaScript で使用されるすべての二項演算子は infix です。
単項演算子は演算子の前後いずれかに、 1 つのオペランドが必要です。
演算子 オペランド オペランド 演算子例えば x++ や ++x です。演算子 オペランド の形を 前置 単項演算子、オペランド 演算子 の形を 後置 単項演算子と呼びます。JavaScript では後置演算子は ++ と -- だけです。! や typeof など、他のすべての演算子は前置型です。
代入演算子は右オペランドの値を元に、左のオペランドへ値を代入するものです。 単純な代入演算子はイコール (=) があり、右オペランドの値を左オペランドへ代入します。 つまり、 x = f() は f() の値を x へ代入する代入式です。
次の表にまとめられているように、演算子を省略表記した複合代入演算子もあります。
| 代入 | x = f() | x = f() |
| 加算代入 | x += f() | x = x + f() |
| 減算代入 | x -= f() | x = x - f() |
| 乗算代入 | x *= f() | x = x * f() |
| 除算代入 | x /= f() | x = x / f() |
| 剰余代入 | x %= f() | x = x % f() |
| べき乗代入 | x **= f() | x = x ** f() |
| 左シフト代入 | x <<= f() | x = x << f() |
| 右シフト代入 | x >>= f() | x = x >> f() |
| 符号なし右シフト代入 | x >>>= f() | x = x >>> f() |
| ビット論理積 (AND) 代入 | x &= f() | x = x & f() |
| ビット排他的論理和 (XOR) 代入 | x ^= f() | x = x ^ f() |
| ビット論理和 (OR) 代入 | x |= f() | x = x | f() |
| 論理積 (AND) 代入 | x &&= f() | x && (x = f()) |
| 論理和 (OR) 代入 | x ||= f() | x || (x = f()) |
| ヌル値合体代入 | x ??= f() | x ?? (x = f()) |
ある式がオブジェクトとして評価される場合、代入式の左辺をその式のプロパティへの代入にすることができます。例えば次のようになります。
オブジェクトについて詳しくは、オブジェクトでの作業を読んでください。
式がオブジェクトとして評価されない場合は、その式のプロパティへの代入は行われません。
厳格モードでは、プリミティブのプロパティに代入することができないため、上記のコードは例外を発生します。
変更できないプロパティや、プロパティを持たない式のプロパティ(null や undefined)に値を代入しようとするとエラーとなります。
より複雑な代入方法、構造分解構文は、配列やオブジェクトのリテラル構造を反映した構文を用いて、配列やオブジェクトからデータを抽出することができる JavaScript の式です。
構造分解をしないと、配列やオブジェクトから値を取り出すのに複数の文が必要になります。
構造分解を使用すると、単一の文で複数の値を別々の変数に抽出することができます。
一般に、代入は変数宣言の中で(すなわち、 const, let, var と一緒に)、または独立した文として使用されます。
しかし、他の式と同様に、x = f() のような代入式も結果値として評価されます。 この結果の値は通常は使用されませんが、別の式で使用することができます。
代入を連鎖させたり、他の式で代入を入れ子にすると、驚くような動作になることがあります。 このため、 JavaScript のスタイルガイドによっては、代入の連鎖や入れ子を連鎖や入れ子の代入を非推奨と定めていることがあります。) とはいえ、代入の連鎖や入れ子が発生することもあるので、それらがどのように動作するのか理解できるようにしておくことは重要です。
代入式を連鎖させたり入れ子にしたりすることで、その結果自体を別の変数に代入することができます。 また、ログに記録したり、配列リテラルや関数呼び出しの中に入れたりすることも可能です。
評価結果は、上の表の「意味」の欄の = 記号の右側にある式に一致します。つまり、 x = f() は f() の結果に、x += f() は結果の和 x + f() に、 x **= f() は結果のべき乗 x ** f() に評価される、といった具合になります。
論理代入の場合、 x &&= f(), x ||= f(), x ??= f() は,それぞれ代入を除いた論理演算の返値なので、 x && f(), x || f(), x ?? f() となります。
これらの式を括弧や配列リテラルのようなグループ化演算子なしで連結する場合、代入式は右から左へグループ化されます(右結合です)が、左から右へ評価されます。
また、 = 以外のすべての代入演算子では、結果の値は常に演算前のオペランドの値に基づいていることに注意してください。
例えば、次のような関数 f と g、変数 x と y が宣言されていると仮定します。
この 3 つの例を考えてみましょう。
y = x = f() は y = (x = f()) と同じです。 = は右結合だからです。 しかし、評価は左から右へ行われます。
y = [ f(), x = g() ] も左から右へ評価が行われます。
x[f()] = g() も左から右へ評価されます。 (この例では x には既に何らかのオブジェクトが代入されていると想定してください。 オブジェクトについて詳しくは、オブジェクトでの作業をお読みください。
代入を連鎖させたり、他の式に代入を入れ子にすると、意外な動作をすることがあります。このため、同じ文の中で代入を連鎖させることは推奨されません。
特に、 const、let、var 文の中に変数連鎖を入れると、しばしばうまく行かなくなります。代入連鎖の中で一番外側/左側の変数だけが宣言され、他の変数は const/let/var 文では宣言されないからです。例えば、
この文は一見すると、変数 x, y, z を宣言しているように見えます。 しかし、実際に宣言しているのは変数 z だけです。 y と x は存在しない変数への無効な参照であるか(厳格モード の場合)、もっと悪いことには、厳格モードでない場合は x と y に対してグローバル変数を暗に生成してしまうことになるのです。
比較演算子はオペランドを比較して、その結果が真であるかに基づいて論理値を返します。 オペランドには数値、文字列、論理値、オブジェクトを使用できます。 文字列は Unicode の値を用い、標準的な辞書順に基づいて比較されます。 ほとんどの場合、2 つのオペランドが異なる型ならば JavaScript はそのオペランドを比較に適した型に変換しようとします。 こうした挙動により、一般的にオペランドは数値的に比較される結果となります。 このルールの唯一の例外は === および !== で、これらは「厳密に」等値か否かを判断し、等値性をチェックする前にオペランドを適合する型に変換しません。 次の表では、以下のサンプルコードで定義された変数を前提として比較演算子を説明していきます。
| 等価 (==) | オペランドが等しい場合に true を返します。 |
3 == var1
"3" == var1 3 == '3' |
| 不等価 (!=) | オペランドが等しくない場合に true を返します。 |
var1 != 4 var2 != "3" |
| 厳密等価 (===) | オペランドが等しく、かつ同じ型である場合に true を返します。 Object.is やJavsScript での等価も参照してください。 | 3 === var1 |
| 厳密不等価 (!==) | オペランドが同じ型で値が等しくないか、型が異なる場合に true を返します。 |
var1 !== "3" 3 !== '3' |
| 大なり (>) | 左のオペランドが右のオペランドよりも大きい場合に true を返します。 |
var2 > var1 "12" > 2 |
| 以上 (>=) | 左のオペランドが右のオペランド以上である場合に true を返します。 |
var2 >= var1 var1 >= 3 |
| 小なり (<) | 左のオペランドが右のオペランドよりも小さい場合に true を返します。 |
var1 < var2 "2" < 12 |
| 以下 (<=) | 左のオペランドが右のオペランド以下である場合に true を返します。 |
var1 <= var2 var2 <= 5 |
メモ: => は演算子ではなく、アロー関数を表す記法です。
算術演算子は、オペランドとして数値(リテラルまたは変数)をとり、1 つの数値を返します。 標準的な算術演算子は、加算 (+)、減算 (-)、乗算 (*)、除算 (/) です。 これらの演算子は、他のほとんどのプログラミング言語で浮動小数点数を用いた場合と同じように機能します(特に、0 で除算をすると Infinity になることに注意してください)。例えば以下のようになります。
標準的な算術演算子 (+, -, *, /) に加え、さらに JavaScript では、以下の表で示す算術演算子も使用できます。
| 剰余 (%) | 二項演算子です。2 つのオペランドで除算したときの、整数の余りを返します。 | 12 % 5 は 2 を返します。 |
| インクリメント (++) | 単項演算子です。オペランドに 1 を加えます。前置演算子 (++x) として用いると、オペランドに 1 を加えた後にその値を返します。後置演算子 (x++) として用いると、オペランドに 1 を加える前にその値を返します。 | x が 3 の場合、++x は x に 4 を設定して 4 を返します。一方、x++ は 3 を返したあと x に 4 を設定します。 |
| デクリメント (--) | 単項演算子です。オペランドから 1 を引きます。返値はインクリメント演算子のものと同様です。 | x が 3 の場合、--x は x に 2 を設定して 2 を返します。一方、x-- は 3 を返したあと x に 2 を設定します。 |
| 単項符号反転 (-) | 単項演算子です。オペランドの符号を反転して、その値を返します。 | x が 3 のとき、-x は -3 を返します。 |
| 単項プラス (+) | 単項演算子です。数値でないオペランドの数値への変換を試みます。 |
+"3" は 3 を返します。 +true は 1 を返します。 |
| べき乗演算子 (**) | 基数部 を 指数部 乗したものを計算します。 すなわち、 基数部^指数部 です。 |
2 ** 3 は 8 を返します。 10 ** -1 は 0.1 を返します。 |
ビット演算子は、そのオペランドを 10 進数や 16 進数や 8 進数ではなく、 32 個のビットの集合 (0 と 1) として扱います。 例えば、 10 進数の 9 の 2 進表現は 1001 です。 ビット演算子はこのように 2 進表現にした上で演算を行いますが、 JavaScript において標準的な数値を返します。
次の表は JavaScript のビット演算子の概要です。
| ビット論理積 (AND) | a & b | オペランドの対応するビットがともに 1 である各ビットについて 1 を返します。 |
| ビット論理和 (OR) | a | b | オペランドの対応するビットがともに 0 である各ビットについて 0 を返します。 |
| ビット排他的論理和 (XOR) | a ^ b | オペランドの対応するビットが同じ各ビットについて 0 を返します。 [オペランドの対応するビットが異なる各ビットについて 1 を返します。] |
| ビット否定 (NOT) | ~ a | オペランドの各ビットを反転します。 |
| 左シフト | a << b | 2 進表現の a を b ビット分だけ左にシフトします。右から 0 で詰めます。 |
| 符号維持右シフト | a >> b | 2 進表現の a を b ビット分だけ右にシフトします。溢れたビットは破棄します。 |
| ゼロ埋め右シフト | a >>> b | 2 進表現の a を b ビット分だけ右にシフトします。溢れたビットは破棄し、左から 0 で詰めます。 |
概念上、ビット論理演算子は以下のように機能します。
オペランドの値は 32 ビットの整数に変換され、0 もしくは 1 からなるビット列として表現されます。 32 ビットを超える数値は、32 ビットを超えた部分が捨てられます。 次の例では、32 ビットを超える整数が、32 ビットの整数に変換されています。
変換前: 1110 0110 1111 1010 0000 0000 0000 0110 0000 0000 0001 変換後: 1010 0000 0000 0000 0110 0000 0000 0001第 1 オペランドの各ビットは第 2 オペランドの対応する各ビットと対になります。第 1 ビットと第 1 ビット、第 2 ビットと第 2 ビット、以下同様です。
演算子は各ビットのペアに適用され、結果はビットごとに構成されます。
例えば 9 の 2 進表現は 1001 で、15 の 2 進表現は 1111 です。 したがって、ビット演算子がこれらの値に適用されたときの結果は以下のようになります。
| 15 & 9 | 9 | 1111 & 1001 = 1001 |
| 15 | 9 | 15 | 1111 | 1001 = 1111 |
| 15 ^ 9 | 6 | 1111 ^ 1001 = 0110 |
| ~15 | -16 | ~ 0000 0000 … 0000 1111 = 1111 1111 … 1111 0000 |
| ~9 | -10 | ~ 0000 0000 … 0000 1001 = 1111 1111 … 1111 0110 |
なお、ビット否定演算子を使うと 32 ビットすべてが反転し、その値の最上位(最も左)のビットは(2 の補数表現で)負の数を表す 1 に設定されることに注意してください。 ~x は -x - 1 と同じ値に評価されます。
ビットシフト演算子は 2 つのオペランドをとります。第 1 オペランドはシフトされる数を指定し、第 2 オペランドは、第 1 オペランドをシフトさせるビット数を指定します。 シフト演算の方向は使用する演算子によって決まります。
シフト演算子はそのオペランドを 32 ビット整数に変換し、結果を数値型または長整数型のどちらかで返します。特に、左のオペランドの型が長整数型であった場合、長整数型を返します。それ以外の場合は数値型を返します。
シフト演算子の種類は次表のとおりです。
|
左シフト (<<) |
この演算子は、第 1 オペランドを指定したビット数分だけ左にシフトします。左に溢れたビットは破棄されます。0 のビットを右から詰めます。 | 9<<2 の結果は 36 になります。1001 を 2 ビット左にシフトすると 100100 になり、これは 36 となるからです。 |
| 符号維持右シフト (>>) | この演算子は、第 1 オペランドを指定したビット数分だけ右にシフトします。右にあふれたビットは破棄されます。左端のビットのコピーを左から入れます。 | 9>>2 の結果は 2 になります。1001 を 2 ビット右にシフトすると 10 であり、これは 2 となるからです。同様に、 -9>>2 は符号が維持されるため -3 になります。 |
| ゼロ埋め右シフト (>>>) | この演算子は、第 1 オペランドを指定したビット数分だけ右にシフトします。右に溢れたビットは破棄されます。0 のビットを左から詰めます。 | 19>>>2 の結果は 4 になります。10011 を 2 ビット右にシフトすると 100 になり、これは 4 となるからです。非負数では、0 埋め右シフトと符号を維持した右シフトは同じ結果になります。 |
論理演算子では、基本的に論理値(ブール値)を用います。その場合は論理値を返します。 しかし、 &&、||、?? の各演算子については、実際には指定されたオペランドの一方の値を返します。そのため、これらの演算子で論理値以外が使用された場合、論理値以外を返すことがあります。そのため、これらは「値選択演算子」と読んだ方がより適切です。 論理演算子は次の表で説明します。
| 論理積 (AND) (&&) | expr1 && expr2 | expr1 が false に変換できる場合は、これを返します。 そうでなければ、 expr2 を返します。従って、論理値を用いた場合、両オペランドが真であれば && は true を返します。それ以外の場合は false を返します。 |
| 論理和 (OR) (||) | expr1 || expr2 | expr1 が true に変換できる場合は、これを返します。 そうでなければ、 expr2 を返します。従って、論理値を用いた場合、どちらかのオペランドが真であれば || は true を返します。それ以外の場合は false を返します。 |
| ヌル値合体演算子 (??) | expr1 ?? expr2 | expr1 が null でも undefined でもない場合はこれを返します。そうでない場合は expr2 を返します。 |
| 論理否定 (NOT) (!) | !expr | 単一のオペランドが true に変換できる場合は false を返します。そうでない場合は true を返します。 |
false に変換される表現の例としては、null、0、0n、NaN、空文字列 ("")、undefined に評価されるものが挙げられます。
以下のコードでは、 && (論理積)演算子の例を示します。
以下のコードでは、 || (論理和)演算子の例を示します。
以下のコードでは、 ?? (ヌル値合体)演算子の例を示します。
?? は || と似た動作をしますが、最初の式が "ヌル値"、つまり null または undefined の場合に、 2 番目の式のみを返すことに注意してください。 null または undefined となる可能性がある値の既定値を設定するには、 || よりも ?? の方が適しています。特に、 '' や 0 のような値が有効な値であり、既定値を適用しない場合です。
以下のコードでは、 ! (論理否定)演算子の例を示します。
複数の論理式が左から右へ評価される際に、以下の規則で「短絡」 (short-circuit) 評価ができるかどうかが確認されます。
論理的なルールにより、これらの評価が常に正確であることが保証されます。上記の式で何かの部分は評価されないため、どのようにしても副作用が生じないことに注意してください。
数値同士の間で使用できるほとんどの演算子は、長整数型の値の間でも同様に使用することができます。
一つの例外は符号なし右シフト (>>>)であり、長整数値では定義されていません。これは、長整数型は固定された幅を持たないため、技術的に「最上位ビット」を持たないからです。
長整数型と数値型は互いに置き換え不可能です。計算で混在させることはできません。
これは、長整数型が数値型のサブセットでもスーパーセットでもないためです。長整数型は大きな整数を表わすときには、数値よりも高い精度を持ちますが、小数を表わすことはできないので、どちらか一方に暗黙のうちに変換すると精度が落ちることがあります。演算を数値演算にしたいのか、長整数演算にしたいのか、明示的な変換を使用してください。
長整数と数値を比較することはできます。
文字列に対して使用することができる演算子には、比較演算子に加えて、2 つの文字列を結合する結合演算子 (+) があり、2 つのオペランドの文字列を結合した文字列を返します。
例えば、
短縮表記した代入演算子 += も文字列の結合に使用できます。
例えば、
条件演算子は JavaScript で唯一 3 つのオペランドを取る演算子です。条件に基づいて 2 つの値のうちの 1 つを選択します。構文は以下の通りです。
condition が真の場合、演算子は val1 の値を選択します。そうでない場合、val2 の値を選択します。標準的な演算子を使用できる場所ならどこでも条件演算子を使用できます。
例えば、
この文では、age が 18 以上の場合、変数 status に "adult" の値が代入されます。そうでない場合 status には "minor" が代入されます。
カンマ演算子 (,) は、オペランドの両方を評価し、最後のオペランドの値を返します。この演算子は、主に for ループの中で、繰り返しのたびに複数の変数を更新するために使用されます。 必要でないのに他の場所で使用するのは、悪いスタイルと見なされます。 多くの場合、独立した 2 つの文を代わりに使用することができ、また使用すべきです。
例えば、一辺が 10 要素の 2 次元配列 a があったとして、以下のコードでカンマ演算子を用いて 2 つの変数を同時に更新しています。このコードでは配列の対角成分の値を出力します。
単項演算はオペランドを 1 つだけ取る演算です。
delete 演算子はオブジェクトやオブジェクトのプロパティ、配列の指定されたインデックスの要素を削除します。 構文は以下のとおりです。
ここで object はオブジェクトの名前を、property は既存のプロパティを、propertyKey は配列の要素の位置を示す整数をそれぞれ表しています。
delete 演算子が成功すると、オブジェクトからそのプロパティが削除されます。その後、このプロパティにアクセスしようとしても、結果は undefined になります。 delete 演算子は、操作が可能な場合は true を返し、操作が不可能な場合は false を返します。
配列は単なるオブジェクトであるため、技術的には各要素を delete することが可能です。 しかしそれは悪しき慣例とみなされており、使用しないでください。 配列の要素を削除しても、配列の length は影響を受けず、他の要素の添字も付けなおされません。 このようなことをするのであれば、単に要素を undefined で上書きするほうがはるかに良い方法です。 実際に配列を操作するためには、 splice のようなさまざまな配列のメソッドを使用してください。
typeof 演算子は、未評価のオペランドの型を指す文字列を返します。 オペランドには返される型を調べる対象となる文字列、キーワード、オブジェクトを指定します。 括弧はあってもなくてもかまいません。
以下の変数を定義したとしましょう。
typeof 演算子は、変数の型に応じて以下の値を返します。
true や null というキーワードに対して、typeof 演算子は以下の結果を返します。
数値や文字列に対して、 typeof 演算子は以下の結果を返します。
プロパティ値に対して、 typeof 演算子はプロパティが持つ値の型を返します。
メソッドや関数に対して、 typeof 演算子は以下の結果を返します。
定義済みオブジェクトに対して、 typeof 演算子は以下の結果を返します。
void 演算子は、値を返さずに評価する式を指定します。式は評価する JavaScript の式となります。式の周りの括弧はあってもなくてもかまいませんが、使用する方が見た目がよいです。
関係演算子はオペランドを比較し、比較結果が真かどうかに基づいて論理値を返します。
in 演算子は、指定したプロパティが指定のオブジェクトにある場合に true を返します。構文は以下のとおりです。
ここで プロパティ名または数値 は文字列、数値、シンボルの何れかで、プロパティ名または配列の添字を表します。オブジェクト名はオブジェクトの名前をそれぞれ表します。
次の例で in 演算子の使用法を示します。
instanceof 演算子は、指定されたオブジェクトが指定されたオブジェクトの種類である場合に true を返します。構文は以下のとおりです。
ここでオブジェクトはオブジェクト型と比較するオブジェクトであり、オブジェクト型は型を表すコンストラクター、例えば Map や Array です。
実行時にオブジェクトの型を確認する必要があるときは instanceof を使用してください。 例えば例外を受け取るとき、発生した例外の型に応じて、別々の例外を扱うコードに分岐することができます。
例えば次のコードでは、 instanceof を使用して obj が Map オブジェクトであるかを判断しています。 obj は Map オブジェクトであるため、if 文中の文が実行されます。
すべての演算子は、最終的に 1 つ以上の基本的な式を演算します。これらの基本的な式には識別子とリテラルが含まれますが、他にもいくつかの種類があります。以下でそれらを簡単に紹介し、それらの意味づけはそれぞれの参照する章で詳細に記述されています。
this キーワード は通常、関数内で使用されます。一般的に、関数がオブジェクトのメソッドとして紐付けられている場合、this はそのメソッドが呼び出されたオブジェクトを指します。これは、関数に渡される隠れた引数と同様に機能します。this はオブジェクトとして評価される式であるため、これまでに紹介したすべてのオブジェクト操作を使用することができます。
例えば、関数が次のように定義されているとします。
この関数をオブジェクトに添付でき、呼び出された際にはそのオブジェクトのプロパティが使用されます。
グループ化演算子 ( ) は式内での評価の優先順位を制御します。例えば、加算が最初に評価されるよう、最初に行われる演算を乗算と除算から加算と減算へと上書きすることができます。
プロパティアクセサー構文は、ドット記法またはブラケット記法をいずれかを使用して、オブジェクト上のプロパティ値を取得します。
オブジェクトでの作業ガイドでは、オブジェクトプロパティについてもっと詳細を示しています。
オプショナルチェーン構文 (?.) は、オブジェクトが定義され、 null でない場合にオブジェクトに対してチェーン操作を実行し、それ以外の場合には操作を短絡して undefined を返します。 これにより、null または undefined の可能性がある値に対して操作を行う際に TypeError を発生させることなく操作を行うことができます。
new 演算子を使用すると、いずれかのユーザー定義オブジェクト型や組み込みオブジェクト型のインスタンスを生成することができます。 new の使用法は以下のとおりです。
super キーワードは自分の親のオブジェクトに関数を呼び出すのに使います。 これは下の例のように、クラスと共に使って親のコンストラクターを呼び出すのに便利です。
This page was last modified on 2026年3月19日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.