ホームページ  >  記事  >  ウェブフロントエンド  >  Javascriptコアの読み取り式と演算子_基礎知識

Javascriptコアの読み取り式と演算子_基礎知識

WBOY
WBOYオリジナル
2016-05-16 16:14:251221ブラウズ

式は、JavaScript インタプリタが結果を計算する JavaScript のフレーズです。プログラムで一般的に使用される最も単純なタイプの式は変数です。変数名も単純な式であり、その値は変数に割り当てられる値です。

複雑な式は単純な式で構成されます。たとえば、配列アクセス式は、配列を表す式、角括弧、および整数式で構成されます。それらが形成する新しい式の結果は、配列内の特定の位置にある要素の値です。同じ文字

数値呼び出し式は、関数オブジェクトを表す式と 0 個の複数のパラメーター式で構成されます。単純な式を結合して複雑な式を作成する最も一般的な方法は、演算子を使用することです。

この章 (この記事) では、すべての JavaScript 演算子について説明します。また、演算子を含まない式 (配列要素へのアクセスや関数呼び出しなど) についても説明します。その構文とプログラミング スタイルは C 言語に非常に似ています。

1. 要素式

最も単純な式は「プリミティブ式」であり、式の最小単位であり、他の式は含まれません。 JavaScript のプリミティブ式には定数またはリテラルが含まれます。キーワードと変数。
直接量は、プログラムに直接現れる定数値です。それらは次のようになります:

コードをコピーします コードは次のとおりです:

1.23 //デジタル直接量
"hello" //文字列リテラル

JavaScript の一部の予約語はプリミティブな式を構成します

コードをコピーします コードは次のとおりです:
true //ブール値: true
間違い Null // 値を返します: 空
これは //「現在の」オブジェクトを返します


第 3 章の学習を通じて、他のキーワードとは異なり、これは定数ではなく、プログラム内のさまざまな場所で返される値も異なります。 this キーワードはオブジェクト指向プログラミングでよく登場します。これは square メソッドのオブジェクトを返します。 最後に、3 番目のプリミティブ式は変数

です。

コードをコピーします コードは次のとおりです:
i //変数 i
の値を返します sum // sum
の値を返します 未定義 // はグローバル変数であり、null とは異なり、キーワードではありません


2. オブジェクトと配列の初期化式。

オブジェクトと配列の初期化は、実際には新しく作成されたオブジェクトと配列です。これらの初期化式は、「オブジェクト リテラル」や「配列リテラル」と呼ばれることもあります。ただし、ブール リテラルとは異なり、含まれるメンバーまたは要素は部分式であるため、プリミティブ式ではありません。

配列の初期化式の構文は非常に簡単です。次の

から始めましょう。

配列の初期化式は、角括弧のペアとカンマで区切られたリストで構成されます。初期化の結果は、新しく作成された配列です。配列の要素は、カンマ区切りの式の値です。

[] //空の配列; [] 内を空のままにすることは、配列に要素がないことを意味します

[1 2,3 4] //2 つの要素を含む配列、最初の要素は 3、2 番目の要素は 7

配列初期化式内の要素初期化式は、配列初期化式にすることができます。つまり、式は入れ子にすることができます

コードをコピーします コードは次のとおりです:
var mat = [[1,2,3],[4,5,6],[7,8,9]];


配列リテラル内のリスト間の要素は省略でき、空のスペースはたとえば次のように unknown で埋められます。

コードをコピーします コードは次のとおりです: var a=[1,,,,5]

要素のうち 4 つは未定義です。配列リテラルの末尾にカンマを残しても、値が未定義の新しい要素は作成されません。

オブジェクトの初期化式は、角括弧が中括弧に置き換えられることを除いて、配列の初期化式と非常に似ています。各部分式には、プロパティ名と接頭辞としてコロン以外の文字が含まれます。

コードをコピーします コードは次のとおりです:

var p = {x: 2.1,y: -3} //2 つの属性メンバーを持つオブジェクト
var q = {} //空のオブジェクト
; q.x=2.1;q.y=-3; //q の属性メンバーは p
の属性メンバーと同じです

オブジェクト リテラルは、

のようにネストすることもできます。

コードをコピーします コードは次のとおりです:

var anh = {left:{x:2,y:3},
                                                                                                                                                                                                                                                                                                          
JavaScript がオブジェクト初期化式の値を計算する場合、オブジェクト式はそれぞれ 1 回計算されます。定数値を含む必要はありません。任意の JavaScript 式を使用できます。同様に、オブジェクト リテラル内のプロパティの名前は、識別子ではなく文字列にすることもできます。 (予約語または一部の不正な識別子のみをその行の属性名として使用できる場合に非常に便利です)

コードをコピーします コードは次のとおりです:
varside = 1;
var square = {"left":{x:p.x,y:p.y},
'右':{x:p.x 側,y:p.y 側}}

第 6 章と第 7 章では、オブジェクトと配列の初期化式について再度説明します。

3. 関数式

関数定義式はJavaScript関数を定義します。式の値は、この新しく定義された関数です。ある意味では、関数定義式は関数リテラルになる可能性があり、関数式は「関数リテラル」と呼ぶことができます。結局のところ、オブジェクト初期化式は「オブジェクト リテラル」とも呼ばれます。一般的な関数定義式には、キーワード function が含まれ、その後に 1 組のかっこが続き、かっこ内には 0 個以上の識別子 (パラメーター名) を含むカンマ区切りのリストが含まれます。次に、中かっこで囲まれた JavaScript コード セグメント (関数本体) を続けます。

var square = function(x){ return x*x};

関数定義式には関数の名前を含めることもできます。関数は、関数式の代わりに関数ステートメントを使用して定義することもできます。詳細については第 8 章で説明します。

4. 属性アクセス式

属性アクセス式の操作は、オブジェクトまたは配列要素の値を取得します。 JavaScript では、プロパティにアクセスするための 2 つのメソッドが定義されています。

コードをコピーします コードは次のとおりです:
式 . 識別子
式 [式]

最初の書き方は、式の後にピリオドと識別子を続ける方法です。式はオブジェクトを指定し、識別子はアクセスするプロパティを指定します。

第 2 章は角括弧を使用して記述されており、角括弧内は式です (このメソッドはオブジェクトと配列に適用されます)。 2 番目の式は、アクセスするプロパティのインデックスを指定するか、アクセスする配列要素のインデックスを表します。具体的な例をいくつか紹介します

コードをコピーします コードは次のとおりです:
o.x //=>式 o
の 1x 属性 o.y.z //=>3 式 o.y
の z 属性 。 a[1] //=>4 インデックス 1 を持つ式 a の要素
a[2]["1"]//=>6 式 a[2]
内のインデックス 1 を持つ要素 a[0].x //=>1: 式 a[0]
の x 属性

どの形式の属性アクセス式が使用されても、「.」と「[」の前の式が常に最初に評価されます。式が null または未定義と評価された場合、どちらの値にもプロパティを含めることはできないため、式は TypeError 例外をスローします。演算結果がオブジェクトまたは配列でない場合、JavaScript はそれをオブジェクトに変換します (第 3 章、セクション 6)

.identifier の方が記述は簡単ですが、このメソッドはアクセスされる属性名が正当な識別子の場合にのみ適用できることに注意してください。また、アクセスする属性の名前を知る必要があります。プロパティ名が予約語であるか、スペースと句読点が含まれている場合、または数値 (配列の場合) である場合は、角括弧で囲む必要があります。属性名が固定値ではなく演算子によって取得される値である場合は、角括弧を使用する必要があります。 (第6章第2節第1節)

5. 動きの表現

JavaScript の呼び出し式は、関数またはメソッドの呼び出し (または実行) を文法的に表現したものです。これは、呼び出される関数を参照する関数式で始まります。関数式の後には、パラメータのカンマ区切りリストを含む一対のかっこが続きます。パラメータは 0 個以上指定できます。

f(0) //f は関数式、0 はパラメータ式です。
Math.max(x,y,z) //Math.max は関数です。x、y、z はパラメータです。
a.sort() //a.sort() は関数であり、パラメーターはありません。
評価のために式が呼び出される場合、最初に関数式が評価され、次にパラメータ式が評価されてパラメータ値のセットが取得されます。関数式の値が呼び出し可能なオブジェクトではない場合、型エラー例外がスローされ、パラメータの値が関数の定義時に定義される仮パラメータに順番に割り当てられます。次に関数本体を実行します。関数が return ステートメントを使用して戻り値を与える場合、戻り値は呼び出し側の式全体の値になります。それ以外の場合、呼び出し式の値は未定義になります。関数呼び出しの詳細 (仮パラメータ式の数が関数定義内の実際のパラメータの数と一致しない場合に何が起こるかなど) については、第 8 章で詳しく説明します。

呼び出し式には、一対のかっこと左かっこの前の式が含まれており、その式がプロパティ アクセス式の場合、その呼び出しは「メソッド呼び出し」と呼ばれます。関数本体がメソッド呼び出しで実行される場合、本体にアクセスするための属性として使用されるオブジェクトと配列が、呼び出し側メソッドのポイントになります。このプロパティにより、関数 (OO 名が「メソッド」である) がオブジェクト指向プログラミング パラダイムでホスト オブジェクトを呼び出すことができます (これについては第 9 章で詳しく説明します)。

6. オブジェクト作成式

オブジェクト作成式はオブジェクトを作成し、関数 (コンストラクター) を呼び出してオブジェクトのプロパティを初期化します。オブジェクト作成式は、オブジェクト作成式の前に追加のキーワード new:

があることを除いて、関数呼び出し式と非常によく似ています。

新しいオブジェクト()
新しいポイント(2,3)
オブジェクト作成式でコンストラクターにパラメータを渡す必要がない場合は、この括弧のペアを省略できます。コンストラクターの詳細については、第 9 章

で説明します。

新しいオブジェクト
新しいポイント

7. オペレーター概要

JavaScript の演算子は、テーブル式、比較式、論理式、代入式などに使用されます。
delete や instanceof など、ほとんどの演算子は句読点で表され、キーワード演算子であっても記号演算子であっても、表される演算子はすべて通常の演算子であり、その構文は非常に簡潔かつ包括的であることに注意してください。
添え字演算子の優先順位で並べ替えると、後者の演算子の優先順位が後者の演算子の優先順位よりも高くなります。水平スカラーで区切られた演算子は異なる優先順位を持ちます。
A は演算子の結合性を表します。
L (左から右) または R (右から左)
ヘッダー N のリストはオペランドの数を表します。
型は、予期されるオペランドの型と演算子の結果の型 (「→」記号の後) を示します

のインスタンス
オペレーター オペレーション A N タイプ
前後の増分 R 1 lval→num
-- 前後の減少 R 1 lval→num
- 反転 R 1 番号→番号
数値に変換 R 1 番号→番号
~ ビットごとの否定 R 1 int→int
! 論理的ではありません R 1 ブール→ブール
削除 属性を削除 R 1 lval→bool
タイプ 操作タイプの検出 R 1 任意→文字列
無効 未定義の値を返す R 1 任意→未定義
*,/,% 乗算と除算を行って余りを求めます L 2 番号、番号→番号
、- 加算、減算 L 2 番号、番号→番号
文字列の連結 L 2 str、str→str
左シフト L 2 int、int→int
>>> 右にシフト L 2 int、int→int
>>>> 符号なし右シフト

L

2 int、int→int
<、<=、>、>= 番号順を比較 L 2 num,num→bool
<、<=、>、>= 文字での順序を比較 L 2 str、str→bool
テストオブジェクトクラス L 2 obj, func→bool
属性が存在するかどうかをテストします L 2 str,obj→bool
== 平等の判断 L 2 任意、任意→ブール
! = 不平等な判断 L 2 任意、任意→ブール
=== 裁判官の身元 L 2 任意、任意→ブール
! == 非同一性を判断する L 2 任意、任意→ブール
& ビット単位の AND L 2 int、int→int
^ ビットごとの XOR L 2 int、int→int
| ビット単位の OR L 2 int、int→int
&& 論理積 L 2 任意、任意→任意
|| 論理和 L 2 任意、任意→任意
?: 条件演算子 R 3 ブール、任意、任意→任意
= 変数の割り当てまたはオブジェクトのプロパティの割り当て R 2 lval、任意→任意

*= /= %= = -= &=

^= |= <<= >>= >>>=

操作と割り当て R 2 lval、任意→任意

最初のオペランド

を無視します。

2 番目のオペランドを返します。

L 2 任意、任意→任意

i. オペランドの数

演算子はオペランドの数によって分類できます。

JavaScript のほとんどの演算子は二項演算子であり、2 つの式を結合して、より複雑な式を作成します。
JavaScript は、ある式を別の少し複雑な式に変換するいくつかの単項演算子もサポートしています。式 -x の「-」演算子は単項演算子です。 x の負の値を取ることです。
JavaScript は三項演算子、つまり 3 つの式を 1 つの式に結合する条件判定演算子「?:」をサポートしています

ii. オペランドの型と結果の型

一部の演算子は任意のデータ型で使用できますが、それでも指定された型のデータを演算することが期待されます。

iii. 左の値

テーブル内の代入演算子とその他のいくつかの演算子は、オペランドが lval 型であることを想定しています (lvalue は古い用語です)。これは、「式は代入演算子の左側にのみ使用できる」ことを意味します。 JavaScript では、変数、オブジェクトのプロパティ、および配列要素はすべて左辺値です。 ECMAScript 仕様では、スコープ付き組み込み関数が左辺値を返すことを許可していますが、定義された関数は左辺値を返すことができません。

iiii. 演算子の優先順位

上の表では、示されている演算子は優先順位が高いものから低いものへと並べられており、各水平分割線内の演算子のグループは同じ優先順位を持っています。演算子の優先順位は、演算子の実行順序を制御します。優先順位の高い演算子 (表の一番上) は常に、優先順位の低い演算子 (表の一番下) よりも前に実行されます。

次の式を見てください

w=x y*z;
乗算演算子「*」は加算「」よりも優先度が高いため、乗算が最初に実行されます。次に、代入演算子「=」の優先順位が最も低くなります。したがって、代入演算は、右辺の式が評価された後に実行されます。

演算子の優先順位は括弧を使用して記述できます。上の式は次のように書くことができます。

w = (x y) * z;
プロパティ アクセス式と呼び出し式は、表内のすべての演算子よりも優先されることに注意してください。

my.Function[x](y) の型
typeof は最も優先順位の高い演算子の 1 つですが、typeof は 2 つのプロパティ アクセスと関数呼び出しの後にも実行されます。

実際、使用している演算子の優先順位がよくわからない場合、最も簡単な方法は、括弧を使用して演算の順序を強制することです。覚えておくべき重要なルールがいくつかあります。乗算と除算は加算と減算よりも優先され、代入演算の優先順位は非常に低く、通常は最後に実行されます。

iiiiii. 演算子の結合性

表のこのセクションでは、A というタイトルの列が演算子の結節性を示しています。 L は左から右へ結合することを意味し、R は右から左へ結合することを意味します。 Tuberculity は、複数の演算子式の演算の順序を同じ優先順位で指定します。

たとえば、減算演算は左から右に連想的に実行されます。

コードをコピーします コードは次のとおりです:

w = x - y - z

このコードと同じ:

コードをコピーします コードは次のとおりです:

w = ((x - y) - z)

逆に言うと、次のような式になります。

コードをコピーします コードは次のとおりです:

x = ~-y;
w = x = y = z;
q=a?b:c?d:e?f:g;

このコードとまったく同じです

コードをコピーします コードは次のとおりです:

x=~(-y);
w=(x=(y=z));
q=a?b:(c?d:(e?f:g))

単項演算子、代入、および三項条件演算子はすべて右から左への結合性を持っているためです。

iiiiii. 操作の順序

演算子の優先順位と結合性は、代入式での演算の順序を指定しますが、部分式の計算プロセスでの演算の順序は指定しません。 JavaScript は常に式を左から右に厳密に評価します。例:

式 w=x y*z では、最初に式 w が計算され、次に x、y、z が計算され、次に y の値に z が乗算され、x の値が加算されます。最後に、式 w が指す変数または属性。式に括弧を追加すると、乗算、加算、代入演算の間の関係が変わります。ただし、左から右への順序は変わりません。

8. 算術式

このセクションでは、算術計算を実行する演算子とオペランドの算術演算について説明します。乗算、除算、減算の演算子は非常に単純です。加算演算子は文字列の連結を演算でき、その型変換はやや特殊であるため、加算演算は別個のセクションにあります。

基本的な算術演算子は *、/、%、、、- です。加算を除く他の演算子は、必要に応じて演算子を数値に変換し、積、商、剰余 (モジュラス)、および差を計算するだけです。数値に変換できない演算はすべて NaN 値に変換されます。オペランド (または変換結果) が NaN 値の場合、算術演算の結果も NaN

になります。

整数と浮動小数点数を区別するプログラミング言語を使用している場合、演算子「/」は 2 番目のオペランドを最初のオペランドで除算します。次に、整数を整数で除算すると、望ましい結果も整数になります。 JavaScript の数値はすべて浮動小数点型であり、除算の結果も浮動小数点型になります。たとえば、5/2 の結果は 2 ではなく 2.5 になります。 0 で除算する演算の結果は、正の無限大または負の無限大になります。そして 0/0 の結果は NaN になります。これらすべての操作にエラーはありません。

演算子「%」は、第 1 オペランドから第 2 オペランドまでの係数を計算します。つまり、第 1 オペランドを第 2 オペランドで割った余りです。結果の符号は、第 1 オペランド (被除数) の符号と同じままです。たとえば、5%2 の結果は 1、-5%2 の結果は -1 です。

剰余演算子のオペランドは通常整数ですが、浮動小数点数でも動作します。 6.5%2.1 は 0.2 であることがわかります。 (0.19999999999999973)

i. " " 演算子

二項加算演算子 " " は 2 つの数値を加算でき、文字列連結演算も実行できます。

コードをコピーします コードは次のとおりです:

1 2 //=> 3
"こんにちは" "" "そこ" // =>"こんにちは"
"1" "2" //=>"12"

両方のオペランドが数値または文字列の場合、計算結果は明らかです。ただし、その他の場合には、必要な型変換をいくつか実行する必要があります。また、演算子の動作は型変換の結果によって異なります。技術的に言えば、加算演算子は次のように動作します:

オペランドがオブジェクトの場合、オブジェクトはプリミティブ値へのオブジェクトの変換規則に従ってプリミティブクラス値に変換されます(第3章、第8節、第3節を参照)。日付はオブジェクトの toString() メソッドによって変換され、他のオブジェクトは valueOf() メソッドによって変換されます (valueOf() メソッドがプリミティブ値を返す場合)。ほとんどのオブジェクトには利用可能な valueOf() メソッドがないため、toString() メソッドを通じてキャプチャと置換を実行します
オブジェクトをプリミティブ値に変換した後、オペランドの 1 つが文字列の場合、もう 1 つのオペランドも文字列に変換されます。次に、文字列の連結を実行します。
それ以外の場合、両方のオペランドが数値 (または NaN) に変換され、加算演算が実行されます。
以下にいくつかの例を示します

コードをコピー コードは次のとおりです:

1 2 //=>3 加算
"1" "2" //=>"12" 文字列連結
"1" 2 //=>"12"数値を文字列に変換し、その文字列を接続します
1 {} // =&gt; "1 [Object object]":オブジェクトを文字列に変換し、文字列連結
を実行します true true //=>2 ブール値を数値に変換して加算します
2 null //=>2 null は 0 に変換されて加算されます
2 未定義 //=>NaN 未定義は加算のために NaN に変換されます

最後に、特に注意すべき点があります。加算演算を文字列で使用する場合、演算の順序に対する加算の影響を考慮する必要があります。つまり、演算の結果は、

などの演算子の演算順序に依存します。

コードをコピーします コードは次のとおりです:

1 2 "bmice" //=> "3 bmice"
1 (2 "bmice") => "12bmice"

ii. 単項演算子

単項演算子は単一のオペランドに作用します。そして新たな価値を生み出します。 JavaScript では、単項演算子は優先順位が高く、右結合です。このセクションでは、必要に応じて演算を数値に変換する単項演算子 ( 、-、および --) について説明します。 - は単項演算子であり、二項演算子である

であることに注意してください。

1ドル追加

単項加算演算子は、オペランド数値を数値 (または NaN) に変換し、変換された数値を返します。オペランド自体が数値の場合、その数値が直接返されます。

1 ドルの減算 -

- 記号を単項演算子として使用すると、必要に応じてオペランドを数値に変換し、演算結果の符号を変更します。

増分

インクリメント " " 演算子は、左辺値 (変数、配列要素、またはオブジェクト属性) であるオペランドに対してインクリメント (1) 演算を実行します。演算子はオペランドを数値に変換します。次に、その数値に 1 を加算し、加算した値を変数、配列要素、またはオブジェクトのプロパティに再割り当てします。

インクリメント 演算の戻り値は、オペランドの位置によって異なります。

演算子がオペランドの前にある場合、その演算子は「前置インクリメント」演算子と呼ばれ、オペランドに対して増分計算を実行し、計算された値を返します。

演算子がオペランドの後にある場合、それは「ポストインクリメント」演算子と呼ばれ、オペランドに対して増分計算を実行しますが、インクリメントされていない値を返します。

など

var i = 1,j = i //i と j の値は両方とも 2

var i = 1,j = i; //i は 2、j は 1
x と sum x=x 1 と同様に、 " " 演算子は文字列の連結を決して実行せず、常にオペランドを数値に変換し、それを 1 ずつ増分することに注意してください。 x が文字列 "1" の場合、結果はx のは数値 2、x 1 は文字列「11」です

デクリメントとインクリメントの演算方法は同じで、オペランドを配列に変換してから1ずつ減算します。

iii. ビット演算子

ビット演算子は、数値で表されるバイナリ データに対して下位レベルのビット演算を実行できます。これらは従来の純粋な数学演算ではありませんが、数値型を操作して数値を返すため、ここでは算術演算子として分類されます。これらの演算子は JavaScript では一般的ではありません。 (ここでは説明していません。詳細については Baidu を参照してください~-~)

9. 関係式

このセクションでは、JavaScript の関係演算子について説明します。関係演算子は、2 つの値 (等しい、未満、または「... の属性である」) 間の関係をテストするために使用され、値に応じて true と false を返します。関係式は常にブール値を返します。関係式は通常、プログラムの実行フローを制御するために if while または for ステートメントで使用されます。

次のいくつかのセクションでは、JavaScript の等価演算と不等式演算、比較演算子、および JavaScript の instanceof の他の 2 つの関係演算子について説明します

iEquality 演算子と不等式演算子

「==」演算子と「===」演算子は、2 つの値が等しいかどうかを比較するために使用されます。この 2 つの演算子では、任意のタイプの演算子を使用できます。等しい場合は true を返し、そうでない場合は false を返します。「===」は厳密等価演算子 (恒等演算子とも呼ばれます) とも呼ばれ、2 つのオペランドが厳密に等しいかどうかを検出するために使用されます。 「==」演算子は等価演算子と呼ばれ、2 つのオペランドが等しいかどうかを確認するために使用されます。ここでの等価の定義は緩やかで、型変換が可能です。

JavaScript は「=」、「==」、「===」演算子をサポートしていますが、(代入、等価、同一性) 演算子の違いを理解する必要があります。プログラミングでは注意して使用してください。混乱を避けるために、「=」は「取得または代入」、「==」は「等価」、「===」は「厳密な等価」と呼ばれます。

「!=」および「!==」演算子ルールは「==」演算子の否定であり、「!」はブール型の非演算子です。「!=」となります。 「 !== は、厳密な平等ではなく、不等号と呼ばれます

JavaScript オブジェクトの比較は、値の比較ではなく、参照の比較です。物体はそれ自体と等しいが、人も物体も等しくない。 2 つのオブジェクトが同じ数のプロパティ、同じプロパティ名と値を持っている場合でも、それらは等しくありません。対応する位置の配列要素が等しい場合でも、2 つの配列は等しくありません。

厳密等価演算子「===」は、まずオペランドの値を計算し、次に型変換を行わずに 2 つの値を比較します。

2 つの値の型が同じでない場合、それらは等しくありません
両方の値が null または未定義の場合、それらは等しくありません
両方の値がブール値 true または false の場合、それらは等しい
いずれかの値が NaN である場合、または両方の値が NaN である場合、NaN はそれ自体を含む他の値と等しくありません。
2 つの値が数値で等しい場合、それらの値は等しいです。値が 0 と値が -0 の場合も、それらは等しいです。
2 つの値が文字列であり、対応するビットにまったく同じ 16 桁が含まれている場合、それらの値は等しいです (第 3 章、セクション 2 を参照)。長さや内容が異なる場合、それらは同等ではありません。 2 つの文字列はまったく同じように機能し、同じ文字を表示する場合がありますが、JavaScript はエンコードなしで 16 ビット値を持ちます。そのため、そのような文字列は「===」と「==」を介して渡されます。演算子の比較結果も等しくありません。パート 3 の String.localeCompare() は、文字列を比較する別の方法を提供します。
2 つの参照値が同じオブジェクト、配列、または関数を指している場合、それらは等しいです。それらが異なるオブジェクトを指している場合、両方のオブジェクトがまったく同じプロパティを持っていても、それらは等しくありません。
等価演算子「==」は恒等演算子に似ていますが、等価演算子の比較は厳密ではありません。 2 つの数値が同じ型ではない場合、等価演算子は型変換を試みてからそれらを比較します。

2 つの演算タイプが同じ場合、比較ルールは上記の等価演算子と同じになります。厳密に等しい場合、比較結果は等しいです。厳密に等しくない場合、比較の結果は不等になります。
2 つの操作タイプが異なる場合、「==」等価演算子もそれらを等しいとみなします。等価性の検出は、次のルールと型変換に従います:
一方の型が null で、もう一方の型が未定義の場合、それらは等しい
一方の値が数値で、もう一方の値が文字列の場合、まず文字列を数値に変換し、変換された値を比較に使用します。
値が true の場合は 1 に変換され、値が false の場合は 0 に変換されて比較されます。
一方の値がオブジェクトで、もう一方の値が数値または文字列の場合は、第 3 章、第 8 項、第 3 項のメソッドの変換規則を使用してオブジェクトをプリミティブ値に変換し、比較します。オブジェクトは、toString() メソッドまたは valueOf() メソッドを通じてプリミティブ値に変換されます。 JavaScript 言語のコアにある組み込みクラスは、最初に valueOf() を使用しようとし、次に toString() を使用しようとします。日付クラスを除き、日付クラスは toString() を通じてのみ変換できます。コア JavaScript 言語の一部ではないオブジェクトは、実装で定義されたメソッドを使用してプリミティブ値に変換されます。
他の異なるタイプ間の比較は等しくありません
これが平等の小さな例です

"1" == true
この式は true と評価され、まったく異なる型の値が等しいことを示します。ブール値 true は、比較が実行される前に、まず数値 1 に変換されます。次に、文字列「1」も数値 1 に変換されます。2 つの数値の値が等しいため、結果は true になります。

ii. 比較演算子

未満 (<)

最初のオペランドが 2 番目のオペランドより小さい場合、「<」演算結果は true、それ以外の場合は false

以下 (<=)

(>) より大きい

以上 (>=)

....(意味の詳細は述べません)

比較演算子のオペランドは任意の型にすることができます。ただし、実際に比較演算子を実行できるのは数値と文字列のみであるため、数値または文字列ではないオペランドは型変換されます。型変換ルールは次のとおりです:

オペランドがオブジェクトの場合、第 3 章、セクション 8、サブセクション 3 のロックの説明に記載されている変換規則に従ってプリミティブ値に変換されます。 valueOf() がプリミティブ値を返す場合は、このプリミティブ値を使用します。直接的に価値を感じます。それ以外の場合は、toString() の変換結果が比較に使用されます。
ペアをプリミティブ値に変換した後、両方のオペランドが文字列の場合、2 つの文字列はアルファベット順に比較され、16 ビット Unicode 文字のインデックス順序が決まります。
オブジェクトがプリミティブ値に変換された後、少なくとも 1 つのオペランドが文字列でない場合、両方のオペランドが数値的に比較されます。 0 と -0 は等しいです。 Infinty は他の数値 (infinty 自体を除く) より大きく、-infinty は他の数値 (infinty 自体を除く) より小さいです。オペランド (または変換された) が NaN の場合、比較演算子は常に false
を返します。 数値演算子と文字列演算子の場合、プラス演算子は比較演算子とは異なる動作をします。前者は文字列を優先し、オペランドの 1 つが文字列の場合は文字列の連結を実行します。比較演算子は、両方のオペランドが文字列である場合にのみ数値を優先します。文字列比較が実行されます。

コードをコピー コードは次のとおりです:

1 2 //=>3 の加算、結果は 3
"1" "2" //文字列の連結、結果は "12"
"1" 2 //文字列の連結、2 は "2" に変換され、結果は "12" になります
11 < 数値比較、結果は true
"11" < "3" //文字列比較、結果は true
"11" < 3 //数値の比較、"11" は 11 に変換され、結果は true
"one" < 3 //数値比較、"one" は NaN に変換され、結果は false

最後に、「<=」および「>=」演算子は、等価性を判断する際に等価演算子や厳密な等価比較ルールに依存しないことに注意してください。対照的に、以下演算子は単に「以下」であり、以上演算子は単に「以下ではない」です。例外が 1 つだけあり、オペランドの 1 つ (変換後) が NaN の場合、4 つの比較演算子はすべて fasle を返します。

iii.in 演算子

in 演算子は、左側のオペランドが文字列または文字列に変換可能であること、右側がオブジェクトであることを期待します。右側のオブジェクトに左側のオペランド値という名前のプロパティ名がある場合、式は true を返します。たとえば、

です。

コードをコピーします コードは次のとおりです:

var point = {
x: 1、
y: 1
//オブジェクトを定義します
"x" in point //=>true このオブジェクトには x
という名前のプロパティがあります "z" in point //=>false オブジェクトの名前のない属性は z
です "toString" in point // =>true オブジェクトは toString メソッドを継承します

var data = [7, 8, 8]
データの「0」 //=>真の配列には 0
が含まれています 1データ// =&gt;文字列に変換された真の数字
3 in data //=>fase インデックス 3 の要素はありません

iiii.演算子のインスタンス

instanceof 演算子は、左側の演算子がオブジェクトであり、右側のオペランドがオブジェクトのクラスを示すことを期待します。左側のオブジェクトが右側のクラスのインスタンスである場合、式は true を返します。これについては第 9 章で説明します。 JavaScript オブジェクトのクラスは、コンストラクターを初期化することによって定義されます。この場合、instanceof の右側のオペランドは関数である必要があります。例:

コードをコピーします コードは次のとおりです:

var d = new Date() //新しいオブジェクトを構築します
dinstanceofDate //計算結果は true、d は Date()
によって作成されます。 dinstanceof Object //計算結果は true、すべてのオブジェクトは Object
のインスタンスです dinstanceof Number //計算結果は false、d は Number オブジェクトではありません
var a = [1,2,3] //配列リテラルは配列を作成します
a instanceof Array //計算結果は true a は配列です
a instanceof Object //true すべての配列はオブジェクトです
インスタンスの RegExp //fasle 配列は正規表現ではありません

すべてのオブジェクトは Object のインスタンスであることに注意してください。オブジェクトがクラスのインスタンスであるかどうかをinstanceofでチェックする場合、この判断は「スーパークラス」検出とも呼ばれます。instanceofの左側の操作オブジェクトがオブジェクトでない場合、instanceofはfalseを返します。右側の演算が関数ではない場合、typewrong の例外がスローされます。

instanceof 演算子の仕組みを理解するには、まず JavaScript の継承メカニズムである「プロトタイプ チェーン」について理解する必要があります。プロトタイプ チェーンについては、第 6 章、第 2 節、第 2 章で詳しく説明します。

式 o instanceof f を計算するために、JavaScript PenXian は最初に f.prototyoe を計算し、次にプロトタイプ チェーン内の o をクエリします。見つかった場合、o は f のインスタンス (または f の親クラス) です。 true が返されます。それ以外の場合は false

10. 論理式

論理演算子「&&」、「||」、および「!」は、複数の関係式を組み合わせて演算を実行します。

i. 論理積

「&&」演算子は 3 つの異なるレベルで理解できます。最も単純な理解は、オペランドが両方ともブール値である場合、「&&」は 2 つのブール値に対してブール AND (AND) 演算を実行し、最初のオペランドと 2 番目のオペランドが両方とも true の場合にのみ true を返すということです。オペランドが false の場合、false を返します。

「&&」は 2 つの関係式を接続するために使用されます

x == 0 && y == 0; //x と y が両方とも 0 の場合にのみ true を返します
関係式は常に true または false を返すため、このように使用すると、「&&」自体も true または false を返します。関係演算子は「&&」 (および「||」) よりも高い優先順位を持っているため、このような式は括弧を必要とせずに安全に作成できます。

「&&」オペランドは必ずしもブール値である必要はありません。一部の値は「真の値」と「偽の値」とみなされる可能性があることに注意してください。 (第 3 章、セクション 3 と同様に、偽の値は次のとおりです: false、null、未定義、0 -0、NaN および ""、すべてのオブジェクトを含むすべての値とその他の値は true 値です)。 「&&」の 2 番目のレベルの理解は、「&&」が true 値と false 値に対してブール AND (AND) 演算を実行できるということです。両方のオペランドが true の場合は true 値が返され、それ以外の場合は少なくとも 1 つのオペランドが false になります。 JavaScript でブール値が使用されると、式ステートメントはそれを true または false の値として扱うため、実際には「&&」が常に true と false を返すわけではありませんが、それは大したことではありません。

上記の演算子は「真の値」と「偽の値」を返しますが、「真の値」と「偽の値」が何であるかについては説明していないため、詳しく説明します。 . 「&&」の第 3 層の理解。演算子は最初に左側のオペランドの値を計算します。つまり、最初に「&&」の左側の式を計算します。計算結果が偽の値の場合、式全体の結果も偽の値になる必要があります。したがって、「&&」は右側のオペランドを計算せずに、単純に左側のオペランドの値を返します。

コードをコピーします コードは次のとおりです:

var o = {
x: 1
};
var p = null;
o && o.x; //=>1 : 1:0 は true 値であるため、戻り値は o.x
になります。 p && p.x //= null: p は false 値であるため、p.x を計算せずに返されます

これは、「&&」が正しいオペランドを計算しない可能性があることを理解するために重要です。上記のコードでは、変数 P の値が null であるため、p.x が計算されると例外エラーがスローされます。

は true 値の場合にのみ計算されます (null または未定義にすることはできません)。

「&&」の動作は「ショートサーキット」と呼ばれることもあり、これを利用して条件付きでコードを実行するコードが多く見られます。たとえば、次の 2 つのコードは同等です

コードをコピーします コードは次のとおりです:

if (a == b) stop () // a == B のみの場合のみ stop ()
を転送できます。 (a == b) && stop() //上記と同じ

一般に、「&&」の右側の式に副作用がある場合には注意してください (代入、インクリメント、デクリメント、および関数呼び出し式)。副作用のあるこれらの式の実行は、左側の演算子マウスの計算結果に依存するためです。

「&&」は、第 2 レベルと第 3 レベルの理解に従っていくつかの複雑な式演算を実行できますが、ほとんどの場合、「&&」は true と false の値に対するブール計算を実行するためにのみ使用されます。

ii. 論理和 (||)

「||」演算子は、2 つのオペランドに対してブール OR (OR) 演算を実行します。いずれかのオペランドが true の場合は true を返し、両方のオペランドが false の場合は false を返します。

「||」演算子は、ほとんどの場合、「&&」のような単純なブール OR (OR) 演算を実行しますが、最初に最初のオペランドの値を計算します。つまり、左側の式が最初に計算され、計算結果が true の場合は、true の値が返されます。それ以外の場合は、2 番目の値が計算されます。

「&&」と同様、右側で副作用のある式を明示的に使用しない限り、右側のオペランドに副作用のある式を含めることは避けるべきです。右側の式は評価されない可能性があります。

この演算子の最も一般的な使用方法は、一連の代替式から最初の true 値の式を選択することです。

コードをコピーします コードは次のとおりです:

// max_width が定義されている場合は、それを直接使用します。割り当てでは、設定オブジェクト内の max_width
を探します。 //定義されていない場合は、ハードコーディングされた定数が使用されます。
var max =max_width || 設定.max_windth ||

この一般的な使用法は通常、関数の本体内でパラメータのデフォルト値を提供するために使用されます。

コードをコピーします コードは次のとおりです:

// o の成功した属性を p にコピーし、 p
を返します。 関数 copy(o, p) {
p = p || //パラメータ p にオブジェクトが渡されない場合は、新しく作成されたオブジェクトが使用されます。
//関数本体のメインロジック

iii. 論理否定 (!)

「!」演算子は、単一のオペランドの前に置かれる単項演算子です。その目的は、オペランドのブール値を否定することです。

「&&」および「||」演算子とは異なり、「!」演算子はまずオペランドをブール値に変換し (第 3 章のアピール規則を参照)、次にそのブール値を否定します。つまり、「!」は常に true と false を返します。さらに、値のブール値は、2 つの論理 NOT 演算を使用して取得できます: (!!x、第 3 章、セクション 8、セクション 2 を参照)

「!」は優先度が高く、p && q を比較する場合は、庭括弧 (p && q) が必要です。次のコード:

コードをコピーします コードは次のとおりです:

!(p && q) === !p || !q
!(p || q) === !p && !q

p と q の任意の値に対して、これら 2 つの式は常に成り立ちます。

11. 代入式

JavaScript は、変数または属性に値を割り当てるために「=」演算子を使用します。例:

コードをコピーします コードは次のとおりです:

i = 0 //変数 i を 0 に設定します
o.x = 1 //オブジェクト o の属性 x を 1 に設定します

「=」演算子は、その左側のオペランドが変数またはオブジェクト プロパティ (または配列要素) である左辺値であることを期待し、その右側のオペランドは任意の型の任意の値にすることができます。代入式の値は右オペランドの値です。代入式の副作用として、右側のオペランドの値が左側の変数またはオブジェクトのプロパティに割り当てられることが挙げられます。この場合、この変数およびオブジェクトのプロパティへの後続の参照では、この値が取得されます。

代入式の値は非常に単純ですが、場合によっては代入式を含む複雑な式が見られることがあります。例: 代入操作と検出操作を 1 つの式に入れます:

コードをコピーします コードは次のとおりです:

(a = b) == 0

この場合、「=」と「==」の違いを明確に理解する必要があります。通常、代入ステートメントが長い式で使用される場合、演算の正しい順序を確保するために大括弧を追加する必要があります。

代入演算子の結合性は右から左です。つまり、式内に複数の代入演算子が出現し、演算の順序も右から左になります。したがって、複数の変数を次の方法で代入できます。 。

コードをコピーします コードは次のとおりです:

i=j=k=0; // 3 つの変数を 0
に初期化します。

オペレーションによる代入オペレーション:

JavaScript は、通常の代入演算に加えて、代入演算を他の演算子に接続する他の代入演算子もサポートしています。より高速な計算方法を提供します。たとえば、= 演算子は、次の式のように加算演算子と代入演算を実行します:

合計 = 給与税;
次の式

と同等

合計 = 給与税の合計
演算子「=」は数値または文字列に作用します。演算が数値の場合は加算と代入の演算を実行し、文字列の場合は文字列の連結と代入の演算を実行します。

このタイプの演算子には、次の代入演算子の表に示すように、「-=」、「*=」、「&=」なども含まれます

演算子の例
と同等 = a =b a=a b
-= a-=b a=a-b
*= a*=b a=a*b
/= a/=b a=a/b
%= a%=b a=a%b
<<= a<<=b a=a< >>= a>>=b a=a>>b
>>>= a>>>=b a=a>>>b
&= a&=b a=a&b
|= a|=b a=a|b
^= a^=b a=a^b
ほとんどの場合、式は

です。

a op =b
ここでの op は演算子を表し、この式は

と同等です。

a =a op b
最初の行では式 a が 1 回評価され、2 行目では式 a が 2 回評価されます。

この 2 つは、 a に副作用のある式 (関数呼び出しや代入演算など) が含まれている場合にのみ同等ではありません。次の 2 つの式は同等ではありません

コードをコピーします コードは次のとおりです:

データ[i] *= 2;
データ[i] = データ[i] * 2

12. 式の計算

多くのインタープリター型言語と同様、JavaScript も JavaScript ソース コードで構成される文字列を解釈して実行し、値を生成できます。 JavaScript はグローバル関数 eval() を使用してこの作業を完了します。

eval("3 2") //=>5
ソース コード内の文字列を動的に決定することは強力な言語機能ですが、実際に適用する必要はほとんどありません。 eval() を使用する場合は、それが本当に必要かどうかを慎重に検討する必要があります。

以下では、eval() の基本的な使用法を簡素化し、コード最適化の観点から、これら 2 つの方法が元のコードに最も影響を与えないように厳密に使用する 2 つの方法を紹介します。

i.eval (eval() は関数ですが、演算子として扱われます。)

eval() にはパラメータが 1 つだけあり、渡されたパラメータが文字列でない場合は、このパラメータを直接返します。パラメータが文字列の場合、文字列は JavaScript としてコンパイルされます (解析)。コンパイルが失敗すると、構文エラー (SyntaxError) がスローされます。コンパイルが成功すると、このコードが実行され、文字列内の最後の式またはステートメントの値が返されます。最後の式にステートメントまたは値が含まれていない場合は、最終的に unknown が返されます。文字列が例外をスローした場合、その例外は呼び出しを eval()

に渡します。

eveal() について最も重要なことは、呼び出し元の変数スコープ環境を使用することです。つまり、変数の値を検索し、コード内のコードと同じ方法で新しい変数と関数を定義します。ローカルコードスコープ。関数がローカル変数 x を定義して eval("x") を呼び出すと、ローカル変数の値が返されます。 eval("x=1") を呼び出すと、ローカル変数の値が変更されます。関数が eval("var y=3;") を呼び出すと、新しいローカル変数 y が宣言されます。同様に、関数は次のコードを通じてローカル関数を宣言できます:

eval("function f(){return x 1;}");
eval() がトップレベルコードで呼び出された場合。もちろん、グローバル変数とグローバル関数に作用します。

ii. グローバル eval()

eval() にはローカル変数を変更する機能があります。これは JavaScript オプティマイザーにとって大きな問題ですが、JavaScript は eval() 関数を呼び出す行と同じことは行いません。 。しかし、JavaScript インタープリターを簡素化するために、スクリプトでエイリアスを定義し、それを名前で呼び出す場合、JavaScript インタープリターはどのように動作するのでしょうか。 ECMAScipt3 標準では、インタプリタが eval() にエイリアスを割り当てることは許可されないことが規定されています。別のエイリアスを使用して eval() を呼び出すと、EvalError 例外がスローされます。

実際には、ほとんどの実装はこれを行いません。エイリアスを通じて呼び出された場合、 eval() はその文字列をトップレベルのグローバル コードとして実行します。コードを実行すると、新しいグローバル変数とグローバル関数が定義される場合があります。実行されたコードは、新しいグローバル変数とグローバル関数を定義したり、グローバル変数に値を割り当てたりする場合があります。ただし、呼び出し元の関数内のローカル変数は変更または変更できないため、関数内のコードの最適化には影響しません。

ECMAScript5 は EvalError の使用に反対し、eval() の動作を標準化します。 「直接 eval」。修飾されていない「eval」名を使用して eval() 関数が直接呼び出される場合、関数は常にそのコンテキスト スコープ内で分岐します。他の間接呼び出しは、コンテキスト スコープとしてグローバル関数を使用します。また、ローカル変数や関数の読み取り、書き込み、定義はできません。コード例は次のとおりです:

コードをコピー コードは次のとおりです:

var geval = eval; //Calling eval using an alias will be a global eval
          var x = "global",
                   y = "global"; //Two global variables
              function f() { //Local eval
executed within the function ​​​​​​​​ var                    eval("x = 'changed';"); // Directly eval changes the
of the local variable                                                                                                                                                      Return             }
             function g() { //This function executes global eval
                    var y = "local" //Local variables are defined
                    geval("y = 'changed';"); //Indirectly changed the value of local variables
Return y; // Return to the unchanged local variables
            }
                   console.log(f(), x); //Local variables have been changed, output local changed global
                 console.log(g(), y); //The global variable has been changed, output local globalchanged


13. Other operators.

Javascript supports many other various operators.

i. Conditional operator (?:)

The conditional operator is the only ternary operator in JavaScript. Usually this operator is written as "?:". This operator has three operands. The first operand is before "?" and the second operand is between "?" and ":". The third operand is as early as after ":", such as

x > 0 ? x : -x; //Find the absolute value of x

The operands of conditional operators can be of any type. The first operand is treated as a Boolean value. If it is true, the second operand is evaluated and the result is returned. Assignment If the first value operand is false, then the third operand is evaluated. and return the calculation result. The second and third operands always evaluate to one of them. It’s impossible to do both at the same time. In fact, the same effect can be achieved using if statements (5.4.1). The "?:" operator just provides a shorthand form. Here is a typical usage scenario of "?:", which determines whether a variable is defined. If it is defined, it is used. If it is not defined, a default value is used.


grett = "hello" (username ? username : "three");


Is equivalent to the code below, but the above is more concise

          grett = "hello";
&n
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。