ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 応用プログラミング(第 3 版)学習ノート 4 js 演算子と演算子_基礎知識

JavaScript 応用プログラミング(第 3 版)学習ノート 4 js 演算子と演算子_基礎知識

WBOY
WBOYオリジナル
2016-05-16 17:49:151086ブラウズ

在ECMAScript中,有非常丰富的运算符和操作符,在这篇文章中将按通常的分类来稍微整理一下,不过在整理之前,先说明一下:

1、虽然标题是运算符和操作符,然而在我看来并没有多少严格区分的必要,在英文中,貌似也是用一个Operator来表示,所以在下文中我可能会混用。甚至,一些不属于运算符和操作符范畴的,我也整理在这里,只要我觉得必要。

2、对于运算符的优先级,你无需一一牢记——我相信你知道最简单的”先乘除,后加减”,至于其它的,如果你不确定,加上括号好了。在ECMAScript中,优先级相同的从左向右运算。

3、对于一些编程语言通用的运算符,比如常用算术运算符(+-*/),我只会简单的列举一下,不会展开,但是请注意,并不是说这些不重要,相反,这些通用运算符甚至处于一个非常基础的地位,只是我觉得你应该早已经熟悉,没必要在这里花时间强调。

4、那么,这里重点关注什么呢?就是一些在ECMAScript中比较特殊的操作符,或者我认为值得花时间强调的一些地方。

运算符与操作符

などの算術演算子に対応します。
类别 操作符  描述 说明
一元操作符 ++  自增1

1、自增(减)有前置和后置两种类型,前置先自增(减)再参与其它运算,后置先参与其它运算再自增(减)。

2、在ES中,自增(减)不仅适用于整数,它们可以作用于任意值,对于不是Number类型的值,会先按前一篇文章中的规则隐式转换为Number,然后再自增(减),此时变量类型也会变成Number类型。

--  自减1
+  一元加 一元加最主要的应用就是将操作数转变为Number类型,相当于调用Number()转换。 
-  一元减 一元减则是在一元加的基础之上再取其相反数。
算术操作符 +  加

1、除了加(+)之外,如果操作数不是Number类型,会自动调用Number()转换为Number类型再进行计算。

2、对于加减(+-),除了作为算术运算符。还可以作为一元操作符(见上)。当然,由于字符串操作中对加号(+)的重载,还可以用于将任意数值(的字符串)相连,这也是第1点中为什么要除了加(+),它在含有非Number类型值时,会将所有操作数转换为字符串相连接。

3、与一般类C语言不同,在ES中,除(/)和取模(%)并不会区分整数和浮点数,比如 5 / 2 = 2.5 而不是2,5.3 % 3 = 2.3 而不是2。

4、任意运算,只要操作数含NaN,结果就是NaN。但并不是结果为NaN就一定有一个操作数为NaN,比如0/0也返回NaN。

5、对于含无穷Infinity的运算,规定比较多,这里就不列举了,可以参考原书,或者自行测试。

-  减
*  乘
/  除
%  取模
逻辑操作符

(布尔操作符)

!  逻辑非

首先将操作数转换为Boolean类型值,然后再取反。可以使用双重非!!将一个数值转换为相应的Boolean值。 

&&  逻辑与

1、当两个操作数相应的Boolean值均为true时,返回true

2、短路:当第一个操作数相应的Boolean值为false时,会直接返回false,不会再计算第二个操作数。这常常被应用在判断一个变量(属性)是否有定义,如:
if(object && object.name && object.name = 'linjisong'){ }
 这里会首先判断object存在,不存在的话就不会解析object.name从而阻止错误的发生,同样,也只有object.name存在,才会去比较这个值。

||  逻辑或

1、当两个操作数相应的Boolean值至少有一个为true时,返回true

2、短路:当第一个操作数相应的Boolean值为true时,会直接返回true,不会再计算第二个操作数。

3、逻辑或,除了用于一般的判断之外,还常常被应用在提供默认值的情况,如:

function Fn(obj){
   obj = obj || {};
}

这里如果调用Fn未传入obj,则会自动给obj赋值为undefined,然后因为undefined的相应Boolean值为false,所以会将一个空对象{}赋值给obj,如果调用传入了obj,则因为任意对象的Boolean值为true,所以就不会取后面的{},从而达到给obj一个默认值{}的效果。

这种方式还被应用在大型JS库的多个相对独立的文件中:
//jsLib
var jsLib;
//file1
(function (jsLib){
   jsLib = jsLib || {};
})(jsLib);

//file2
(function (jsLib){
   jsLib = jsLib || {};
})(jsLib);


使用这种方式,无论先加载哪个文件,都会判断jsLib是否已经定义,如果未定义就提供一个默认值,这样做可以使得相对独立模块可以不用考虑加载顺序。

关系操作符

(比较操作符)

< 小于

1、只要有一个操作数是Number类型或Boolean类型值,就将两个操作数转换成Number类型值(如果需要转换)执行数值比较。

2、字符串比较,会逐个比较字符编码值。

3、操作符是对象时,调用valueOf()(如果没有,就调用toString()),再将结果按上面规则比较。

4、任意数和NaN比较返回false。

<= 小于或等于
>  大于
>=  大于或等于
==  相等

1、相等和不等(==、!=)在比较时,只要有必要,就会隐式类型转换。

2、全等和不全等(===、!==)在比较时,不会转换类型,如果类型不一致,直接为!==。

3、结合1、2,可以知道,a===b则一定有a==b,而a!=b则一定有a!==b。

!= お待ちください
=== 合同
!== 一致しません
代入演算子 = 課題
複合算術代入演算子 算術演算子プラス = は、=、-=、*=、/=、%=
複合ビット単位代入演算子 ビット演算子プラス = は、~=、&=、|=、^=、<<=、>>=、>>>=
ビット演算子 ~ ビット単位ではありません ビット単位の反転、つまり補数コードを返します
& ビット単位 AND ビット位置合わせされたビットごとの演算。両方の演算ビットが 1 の場合にのみ 1 が返され、それ以外の場合、ビットは 0 を返し、最後にすべてのビット演算結果の組み合わせが を返します。
| ビット単位 OR ビット位置合わせされたビットごとの演算。両方の演算ビットが 0 の場合にのみ 0 が返され、それ以外の場合、ビットは 1 を返し、最後にすべてのビット演算結果の組み合わせが返されます。
^ ビット単位 XOR ビット位置合わせされたビットごとの演算。2 つの演算ビットが異なる場合は 1 を返し、それ以外の場合、ビットは 0 を返し、最後にすべてのビット演算結果の組み合わせを返します。
<< 左に移動 2 進数は左にシフトされ、左シフトによって符号ビットは変更されません
>> 符号付き右シフト 2 進数は右にシフトされ、上位ビットは一致するビットで埋められます
>>> 符号なし右シフト 2 進数は右にシフトされ、正の数の場合は結果は >> と同じになります。負の数の 2 の補数が処理されます。正の数のバイナリコードとして
文字列演算子 文字列連結 は concat() 関数と同等で、最初にすべてのオペランドを文字列に変換してからそれらを連結します。文字列の連結を実行すると、バックグラウンドで中間接続と破棄の処理が行われるため、文字列の連結操作が多数発生すると、その文字列は変更されないことに注意してください。実行されました。
= 文字列連結 a =b、a=a b と同等。
オブジェクト演算子 . 属性アクセサー 単純なオブジェクト プロパティ アクセサー。
[] プロパティまたは (クラス) 配列へのアクセス [] を通じて、名前が変数であるか、特殊文字が含まれているプロパティにアクセスできます。
新しい コンストラクターを呼び出してオブジェクト を作成します 新しく作成されたオブジェクトを返します。コンストラクター内の this は、この新しく作成されたオブジェクトを指します。
delete  变量、属性删除 删除属性(变量可以看成是全局对象或执行环境的一个属性)。
void   返回undefined。
in  判断属性 对象属性或原型链上的属性。
instanceof  原型判断 比较同一个上下文中的对象是否为另一个对象的原型。
其它操作符 ?:  条件操作符 语法;var value = exp ? trueExp : falseExp。 相当于var value; if(exp){ value = trueExp;}else{value = falseExp;}
,  逗号操作符 主要用于声明多个变量,这也是很多JS库的流行做法。例如:var num1=1,num2=2,num3=3;
()  分组操作符

主要用途:

1、结合逗号操作符用于赋值。例如:var num = (5,1,4,8,0);这里num最后的值为0。

2、转换为表达式。比如eval('('+jsStr+')');又比如:
function fn(){
}//函数声明,不能直接调用
(function fn(){
})();//使用()将函数括起来,便可以直接调用
3、用于调用函数。比如fn();。

typeof  类型操作符

返回一个字符串值:Undefined类型—>'undefined'、Null类型—>'object'、Boolean类型—>'boolean'、Number类型—>‘number'、String—>'string'、内置Function对象的实例—>'function'、其它Object类型—>'object'。(有些浏览器实现略有不同)

いくつかの点を説明します:

1. ここでの分類はそれほど厳密ではありません。たとえば、ビット単位の NOT (~)、論理 NOT (!)、delete、void、typeof はすべて単項演算子と見なされ、autoincrement () も使用されます。多くのマテリアルは算術演算子に分類されます。整理する際には主に原書の分類を参考にし、自然性も考慮しました。

2. プラス記号 ( ) の使用は比較的柔軟です。特に計算で使用する場合、その中の文字列を無視すると間違いが起こりやすいことに注意してください。

3. Typeof は通常、単純なデータ型を決定するために使用されます。オブジェクト型の場合、返されるオブジェクトのほとんどがオブジェクトであるため、instanceof の判断も、その条件を満たす必要があります。同じコンテキストである場合、エラーが発生します。別のより信頼性の高い方法については、後でオブジェクトを説明するときに説明します。

4. まず次のコードを確認します。

コードをコピーします コードは次のとおりです。 >
var numVal = 10.00,
strVal = '10',
strObj = new String('10')
console.info(numVal == strVal);//true
console.info(typeof (strVal strObj));//string

最初の出力は true ですが、予想を超えていますか?ここでは、== 比較演算子の暗黙的な型変換により、Number 型は String 型に変換され、その後、Number 型 10.00 は、小数点以下に 0 以外の値がないため、整数 10 に解析されます。ポイントなので、比較は等しくなります。 2 番目の出力は string で、これは実際には比較的簡単に理解できます。strVal は文字列であり、strObj は文字列オブジェクトであるため、この 2 つを加算すると、最終結果も文字列型になります。
5. 記号について、いくつかの一般的な使用法を繰り返してみましょう (正規表現での使用法はここでは関係ありません)。
(1) 単項プラス記号 ( ) を使用して Number 型に変換します。
(2) 二重論理否定(!!)を使用してブール型に変換します。
(3) 論理積 (&&) を使用して、オブジェクトが存在するかどうかを検出し、後続の操作を実行します。
(4) 論理和 (||) を使用して関数パラメータのデフォルト値を指定します。
(5) グループ化(())を使用して式として明示的に指定します。
(6) 中括弧 ({}) を使用して、オブジェクト リテラル、JSON データ形式、およびコード ブロックを定義します。
(7) 角括弧 ([]) を使用して、配列リテラル、JSON データ形式、配列へのアクセス、名前が変数または特殊文字であるプロパティへのアクセスを定義します。
6. ビット単位の演算に関しては、結果はあまり直感的ではありませんが、演算効率が高く、中間変数を使用せずに 2 つの値を直接交換したり、奇数と偶数を判断したり、MD5 暗号化など、興味深い応用例が多数あります。 、など。興味のある友人は、関連する情報を見つけて、自分で調査することができます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。