3.5 操作符 (JavaScript高级程序设计 第3版)

3.5.1  一元操作符

1.递增(++)和递减(--)操作符

前置递增递减与后置递增递减最重要的区别:后置递增递减操作是在包含他们的语句被求值后才执行的。

a:前置递增和递减

语法:递增递减操作符位于要操作的变量之前,如 ++num ;

var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;    //等于21
var num4 = num1 + num2;      //等于21

//from page 37

b:后置递增和递减

语法:递增递减操作符位于要操作的变量之后,如 num-- ;

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;    //等于22   这句先用原来的num1+num2得到值22后,才执行的num1--
var num4 = num1 + num2;      //等于21   此时num1已经递减,值为1,所以得到21的值

//from page 37

 

递增递减操作符对任何值都适用,遵循以下原则:

①:应用于一个包含有效数字的字符串时,先转换为数字值,再执行递增递减

②:应用为不包含有效数字的字符串时,将变量值转换为NaN

③:应用为布尔值时,转换为0或1,再递增递减

④:应用浮点数值时,执行递增递减

⑤:应用于对象时,先调用valueOf()方法,再应用前述规则

 

2 一元加和减操作符

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
    valueOf:function (){
        return -1;
    }
};

//一元加操作符
s1 = +s1;   //值变成数值1
s2 = +s2;   //值变成数值1.1
s3 = +s3;   //值变成NaN
b = +b;     //值变成数值0
f = +f;     //值未变,仍然是1.1
o = +o;     //值变成数值-1

//一元减操作符
s1 = -s1;   //值变成数值-1
s2 = -s2;   //值变成数值-1.1
s3 = -s3;   //值变成NaN
b = -b;     //值变成数值0
f = -f;     //值变成了-1.1
o = -o;     //值变成数值1

//from page 38-39

 

3.5.2  位操作符

看不懂,以后补

3.5.3  布尔操作符

逻辑非,逻辑与,逻辑或

1.逻辑非(NOT)

用(!)表示,适用于任何值,返回布尔值,然后再求其反。

操作规则:

返回true的有:空字符串,数值0,null,NaN,undefined;

返回false的有:对象,非空字符串,任意非0数值(包括Infinity)

alert(!false);     //true
alert(!"blue");    //false
alert(!0);         //true
alert(!NaN);       //true
alert(!"");        //true
alert(!12345);     //false

//from page 44

2.逻辑与(AND)

用(&&)表示,有两个操作数,如下;

var result = true && false;

逻辑与的真值表

第一个操作数

第二个操作数结果
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

 

 

 

 

 

 

遵循规则如下

① 如果第一个操作数是对象,则返回第二个操作数;

② 如果第二个操作数是对象,则只有在第一个操作数求值结果为true的情况下才返回该对象;

③ 如果两个操作数都是对象,则返回第二个操作数;

④ 如果第一个操作数是null,则返回null;

⑤ 如果第一个操作数是NaN,则返回NaN;

⑥ 如果第一个操作数是undefined,则返回undefined;

逻辑与是短路操作,当第一个操作数是false时,结果肯定是false,所以不会执行第二个操作数了,如下:

var found = false;
var result = (found && someUndefinedVariable);   
//尽管第二个操作数未声明应该发生错误但不会发生错误,因为found是false,短路操作了
alert(result);    //会执行,弹出false

//from page 45

2.逻辑或(OR)

用(||)表示,有两个操作数,如下;

var result = true || false;

逻辑或的真值表

第一个操作数

第二个操作数结果
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

 

 

 

 

 

 

遵循规则如下

① 如果第一个操作数是对象,则返回第一个操作数;

② 如果第一个操作数的求值结果是false,则返回第二个操作数;

③ 如果两个操作数都是对象,则返回第一个操作数;

④ 如果两个操作数都是null,则返回null;

⑤ 如果两个操作数都是NaN,则返回NaN;

⑥ 如果两个操作数都是undefined,则返回undefined;

逻辑或 也是短路操作,当第一个操作数是true时,结果肯定是true,所以不会执行第二个操作数了,如下:

var found = true;
var result = (found || someUndefinedVariable);   
//尽管第二个操作数未声明应该发生错误但不会发生错误,因为found是true,短路操作了
alert(result);    //会执行,弹出true

//from page 46

我们可以利用逻辑或的这一形我来为变量赋null或undefined,如下:

var myObject = preferredObject || backupObject;
//preferredObject有值时优先赋给变量,没有值时backupObject再赋给变量;

 

3.5.4  乘性操作符

1.乘法

用(*)表示,计算两个值的乘积;

var result = 34 * 56;

遵循规则:

① 如果操作数都是数值,则执行常规乘法计算;

② 如果有一个操作数是NaN,结果则是NaN;

③ 如果是Infinity与0相乘,则结果是NaN;

④ 如果是Infinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号;

⑤ 如果是Infinity与Infinity相乘,则结果是Infinity;

⑥ 如果一个操作数不是数值,则后台调用Number()将其转换成数值,再应用上面的规则;

2.除法

用(/)表示,

var result = 66 / 11;

① 如果操作数都是数值,则执行常规除法计算;

② 如果有一个操作数是NaN,结果则是NaN;

③ 如果是Infinity被Infinity除,则结果是NaN;

④ 如果是0被0除,则结果是NaN;

⑤ 如果是非0的有限数被0除,则结果是Infinity或-Infinity,取决于有符号操作数的符号;

⑥ 如果是Infinity被任何非0数值除,则结果是Infinity或-Infinity,取决于有符号操作数的符号;

⑦  如果一个操作数不是数值,则后台调用Number()将其转换成数值,再应用上面的规则;

3.求模

求模(余数)操作符由(%)表示;

var result = 26 % 5;    //等于1

① 如果操作数都是数值,则执行常规除法计算,返回余数;

② 如果被除数是无穷大值而除数是有限大的数值,则结果是NaN;

③ 如果被除数是有限大的数值而除数是0,则结果是NaN;

④ 如果是Infinity被Infinity除,则结果是NaN;

⑤ 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;

⑥ 如果是Infinity被任何非0数值除,则结果是Infinity或-Infinity,取决于有符号操作数的符号; 如果是0被0除,则结果是0;

⑦  如果一个操作数不是数值,则后台调用Number()将其转换成数值,再应用上面的规则;

 

3.5.5  加性操作

1.加法

用(+)表示;

规则:

如果两个都是数值:

① 如果有一个操作数是NaN,则结果是NaN;

② 如果是Infinity加Infinity,则结果是Infinity;

③ 如果是-Infinity加-Infinity,则结果是-Infinity;

④ 如果是Infinity加-Infinity,则结果是NaN;

⑤ 如果+0加+0,则结果是+0;

⑥ 如果-0加-0,则结果是-0;

⑦ 如果是+0加-0,则结果是+0。

如果有操作数有字符串:

① 如果两个都是字符串,则将两个字符串拼接起来;

② 如果只有一个是字符串,则将另一个操作数转换成字符串再拼接起来

如果是对象、数值、布尔值,则调用toString()方法取得相应的字符串值再应用上面规则;

 

如果是null和undefined,则调用String()函数并取得字符串"null"和"undefined";

var result = 5 + 5;   //10
var result1 = 5 + "5";   //55,第二个操作数是字符串5,则拼接起来了

//from page 48

 

下面例子:num1+num2用括号括起来会使两者数值相加再与前面的字符串拼接起来;

​var num1 = 5;
var num2 = 10;
var mess = "The sum of 5 and 10 is " + num1 + num2;  //The sum of 5 and 10 is 510;

var mess1 = "The sum of 5 and 10 is " + (num1 + num2);  //The sum of 5 and 10 is 15;

//from page 49

2.减法

减法操作符用(-)表示;

var result = 2 - 1;

规则如下:

① 如果两个操作符都是数值,则执行常规的算术减法

② 如果有一个操作数是NaN,则结果是NaN;

③ 如果是Infinity减Infinity,则结果是NaN;

④ 如果是-Infinity减-Infinity,则结果是NaN;

⑤ 如果是Infinity减-Infinity,则结果是Infinity;

⑥ 如果是-Infinity减Infinity,则结果是-Infinity;

⑦ 如果是+0减+0;则结果是+0;

⑧ 如果是-0减+0;则结果是-0;

⑨ 如果是-0减-0;则结果是+0;

⑩ 如果有一个操作数是字符串、布尔值、null、undefined,则后台调用Number()转换为数值再执行以上规则;

⑪ 如果有一个操作数是对象,则调用对象的valueOf()取得该对象的数值;

 

3.5.6  关系操作符

小于(<)、大于(>)、小于等于(<=)和大于等于(>=);

规则:

① 如果两个操作数都是数值,执行数值比较

② 如果两个操作数都是字符串,则比较字符串的对应的字符编码;

③ 如果一个操作数是数值,则将另一个操作数转换为数值,再执行数值比较;

④ 如果一个操作数是对象,则先调用valueOf()方法,再应用以上规则;

⑤  如果一个操作数是布尔值,先转换成数值再比较;

看下面的例子:

var result = "Brick" < "alphabet";    //true; 由于大写字母的字符编码都小于小写字母的字符编码
var result = "23" < "3";   //true; 两个字符串其实是比较"2"(编码是50)和"3"(编码是51)的字符编码
var result = "23" < 3;    //false; 字符串23被转成数值
var result = "a" <3;    //false;  字符串a无法转换成数值(参考规则第3点),a被转换成NaN
var result = NaN <3;    //false;
var result = NaN >= 3;  //false

//from page 51

 

3.5.7  相等操作符

1.相等和不相等

两种都是强制转型,先转换再比较。相等用(==)表示,两个操作数相等返回true;不等用(!=)表示,两个操作数不等返回true。

基本规则:

① 如果两个操作数都是布尔值,先转换成数值

② 如果一个操作数是字符串,另一个是数值,则先将字符串转换成数值;

③ 如果一个操作数是对象,另一个不是,则调用valueOf()方法,再应用以上规则

④ null和undefined 是相等的

⑤ 比较相等性之前,不能将null和undefined转换成其他任何值;

⑥ 如果有一个操作数是NaN,则相等操作符返回false,不等操作符返回true;

⑦ 如果两个操作符都是对象,则比较他们是不是同一对象;

表达式null==undefined"NaN"==NaN5==NaNNaN==NaNNaN!=NaNfalse==0true==1"5"==5undefined==0null==0
truefalsefalsefalsetruetruetruetruefalsefalse

2.全等和不全等

不转换仅比较,数据类型必须相同。全等用(===)表示,两个操作数全等返回true;不等用(!==)表示,两个操作数不全等返回true。

var result1 = ("55" == 55);   //true, 因为转换后相等
var result2 = ("55" === 55);  //false, 因为不同的数据类型

var result3 = ("55" != 55);   //false, 因为转换后相等
var result4 = ("55" !== 55);  //true, 因为不同的数据类型

//from page 52

值得注意的是:null和undefined

var result1 = (null == undefined);   //true;
var result2 = (null === undefined);   //false;   因为他们是不同类型的值

 

3.5.8  条件操作符

也就是三元运算符,基本格式是:variable = boolean_expression ? true_value : false_value;

例子:

var max = (num1 > num2) ? num1 : num2;
//如果num1>num2为true则将num1赋给变量max,否则将num2赋给变量max

 

3.5.9  赋值操作符

简单赋值操作(=),如下:

var num = 2;

符合赋值操作,如下:

var num = 10;
num += 10;  //20,  这一行相当于num = num + 10;

每个算术操作符都有符合赋值操作:

乘/赋值除/赋值模/赋值加/赋值减/赋值左移/赋值有符号右移/赋值无符号/赋值
*=/=%=+=-+=<<=>>=>>>=

 

3.5.10  逗号操作符

逗号操作符可以在一条语句中执行多个操作

var num1=1 , num2=2 , num3=3;   //声明多个变量

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值