>웹 프론트엔드 >JS 튜토리얼 >JavaScript 고급 프로그래밍(3판) 학습 노트 4 js 연산자 및 연산자_기본 지식

JavaScript 고급 프로그래밍(3판) 학습 노트 4 js 연산자 및 연산자_기본 지식

WBOY
WBOY원래의
2016-05-16 17:49:151102검색

在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 비트 정렬된 비트 단위 연산으로, 두 연산 비트가 다르면 1을 반환하고, 그렇지 않으면 비트는 0을 반환하며, 최종적으로 모든 비트 연산 결과의 조합을 반환합니다
왼쪽으로 이동 이진수가 왼쪽으로 이동하며 왼쪽으로 이동해도 부호 비트는 변경되지 않습니다.
>> 오른쪽 쉬프트 이진수가 오른쪽으로 이동하고 상위 비트가 일치하는 비트로 채워집니다.
>>> 부호 없는 오른쪽 시프트 이진수는 오른쪽으로 바로 이동합니다. 양수의 경우 결과는 >>와 동일합니다. 음수의 경우 음수의 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는 모두 단항 연산자로 간주할 수 있으며 자동 증가( )도 사용됩니다. 많은 자료가 산술 연산자로 분류됩니다. 정리할 때 주로 원서의 분류를 참고했고, 자연스러움도 고려했습니다.

2. 더하기 기호( )의 사용법은 비교적 유연합니다. 특히 계산에 사용할 때 그 안의 문자열을 무시하면 실수하기 쉽습니다.

3. Typeof는 일반적으로 단순 데이터 유형을 결정하는 데 사용됩니다. 객체 유형인 경우 반환되는 객체의 대부분이 객체이므로 실용성이 거의 없습니다. 동일한 컨텍스트를 사용하지 않으면 오류가 발생하므로 나중에 개체를 설명할 때 보다 안정적인 또 다른 방법에 대해 자세히 설명합니다.

4. 먼저 다음 코드를 보세요.

코드를 복사하세요 코드는 다음과 같습니다.

var numVal = 10.00,
strVal = '10',
strObj = new String('10')
console.info(numVal == strVal);//true
console.info(typeof (strVal strObj));//string

첫 번째 출력이 사실입니다. 기대 이상인가요? 여기서 == 비교 연산자의 암묵적 유형 변환으로 인해 Number 유형이 String 유형으로 변환되고, Number 유형 10.00은 소수점 이하 0 이외의 값이 없기 때문에 정수 10으로 파싱됩니다. 포인트이므로 비교는 동일합니다. 두 번째 출력은 실제로 비교적 이해하기 쉬운 문자열입니다. strVal은 문자열이고 strObj는 문자열 개체입니다. 두 개를 추가하면 개체가 문자열로 변환되므로 최종 결과도 문자열 유형이 됩니다. (2) 불리언형으로 변환하려면 이중논리부정(!!)을 사용하세요.
(3) 논리 AND(&&)를 사용하여 객체가 존재하는지 감지하고 후속 작업을 수행합니다.
(4) 논리 OR(||)를 사용하여 함수 매개변수에 대한 기본값을 제공합니다.
(5) 그룹화(())를 사용하여 명시적으로 표현식으로 지정합니다.
(6) 중괄호({})를 사용하여 객체 리터럴, JSON 데이터 형식 및 코드 블록을 정의합니다.
(7) 대괄호([])를 사용하여 배열 리터럴, JSON 데이터 형식, 액세스 배열 및 이름이 변수 또는 특수 문자인 액세스 속성을 정의합니다.
6. 비트 연산에 관해서는 결과가 그다지 직관적이지는 않지만 연산 효율이 높고 중간 변수를 사용하지 않고 두 값을 직접 교환하는 것, 홀수와 짝수를 판단하는 것, MD5 암호화 등 흥미로운 응용이 많습니다. 등 관심 있는 친구들이 스스로 관련 정보를 찾고 연구를 진행할 수 있습니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.