第3章 基本概念(4)操作符:一元操作符......

3.5 操作符

ECMA-262 描述了一组用于操作数据值的操作符,包括算术操作符(如加号和减号)、位操作符、关系操作符和相等操作符。

ECMAScript 操作符的与众不同之处在于,它们能够适用于很多值,例如字符串、数字值、布尔值,甚至对象。

不过,在应用于对象时,相应的操作符通常都会调用对象的valueOf()和(或)toString()方法,以便取得可以操作的值。

3.5.1 一元操作符

只能操作一个值的操作符叫做一元操作符。一元操作符是ECMAScript 中最简单的操作符。

1. 递增和递减操作符

前置型和后置型。顾名思义,前置型应该位于要操作的变量之前,而后置型则应该位于要操作的变量之后。

因此,在使用前置递增操作符给一个数值加1 时,要把两个加号(++)放在这个数值变量前面,如下所示:

var age = 29;

++age;

在这个例子中,前置递增操作符把age 的值变成了30(为29 加上了1)。

实际上,执行这个前置递增操作与执行以下操作的效果相同:

var age = 29;

age = age + 1;

执行前置递减操作的方法也类似,结果会从一个数值中减去1。使用前置递减操作符时,

要把两个减号(--)放在相应变量的前面,如下所示:

var age = 29;

--age;

这样,age 变量的值就减少为28(从29 中减去了1)。

执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种情况通常被称作副效应。)请看

下面这个例子。


<!DOCTYPE html>
<html>
<head>
    <title>Increment/Decrement Example 1</title>
    <script type="text/javascript">
          
        var age = 29;
        var anotherAge = --age + 2;
        
        alert(age);         //输出28
        alert(anotherAge);  //输出30

    </script>

</head>
<body>
  
</body>
</html>

这个例子中变量anotherAge 的初始值等于变量age 的值前置递减之后加2。由于先执行了减法操作,age 的值变成了28,

所以再加上2 的结果就是30。由于前置递增和递减操作与执行语句的优先级相等,因此整个语句会从左至右被求值。

再看一个例子:


<!DOCTYPE html>
<html>
<head>
    <title>Increment/Decrement Example 2</title>
    <script type="text/javascript">
          
        var num1 = 2;
        var num2 = 20;
        var num3 = --num1 + num2;    //等于21
        var num4 = num1 + num2;      //等于21

        alert(num3);
        alert(num4);
    </script>

</head>
<body>
  
</body>
</html>

在这里,num3 之所以等于21 是因为num1 先减去了1 才与num2 相加。

而变量num4 也等于21 是因为相应的加法操作使用了num1 减去1 之后的值。

----------------------------------------------------------------------------------------------------------------------------------------

后置型递增和递减操作符的语法不变(仍然分别是++和--),只不过要放在变量的后面而不是前面。

后置递增和递减与前置递增和递减有一个非常重要的区别,

即递增和递减操作是在包含它们的语句被求值之后才执行的。这个区别在某些情况下不是什么问题,例如:

var age = 29;

age++;

把递增操作符放在变量后面并不会改变语句的结果,因为递增是这条语句的唯一操作。但是,当语

句中还包含其他操作时,上述区别就会非常明显了。请看下面的例子:


<!DOCTYPE html>
<html>
<head>
    <title>Increment/Decrement Example 3</title>
    <script type="text/javascript">
          
        var num1 = 2;
        var num2 = 20;
        var num3 = num1-- + num2;    //equals 22
        var num4 = num1 + num2;      //equals 21

        alert(num3);
        alert(num4);
    </script>

</head>
<body>
  
</body>
</html>

这里仅仅将前置递减改成了后置递减,就立即可以看到差别。在前面使用前置递减的例子中,num3和num4 最后都等于21。

而在这个例子中,num3 等于22,num4 等于21。差别的根源在于,这里在计算num3 时使用了num1 的原始值(2)完成了加法计

算,而num4 则使用了递减后的值(1)

----------------------------------------------------------------------------------------------------------------------------------------------

所有这4 个操作符对任何值都适用,也就是它们不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。

在应用于不同的值时,递增和递减操作符遵循下列规则。

  • 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1 的操作。字符串变量变成数值变量。
  • 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
  • 在应用于布尔值false 时,先将其转换为0 再执行加减1 的操作。布尔值变量变成数值变量。
  • 在应用于布尔值true 时,先将其转换为1 再执行加减1 的操作。布尔值变量变成数值变量。
  • 在应用于浮点数值时,执行加减1 的操作。
  • 在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。然后对该值应用前述规则。如果结果是NaN,则在调用toString()方法后再应用前述规则。对象变量变成数值变量。

以下示例展示了上面的一些规则:


<!DOCTYPE html>
<html>
<head>
    <title>Increment/Decrement Example 4</title>
    <script type="text/javascript">
          
        var s1 = "2";
        var s2 = "z";
        var b = false;
        var f = 1.1;
        var o = { 
            valueOf: function() {
                return -1;
            }
        };
        
        s1++; // 值变成数值3
        s2++; // 值变成NaN
        b++; // 值变成数值1
        f--; // 值变成0.10000000000000009(由于浮点舍入错误所致)
        o--; // 值变成数值-2

        alert(s1);
        alert(s2);
        alert(b);
        alert(f);
        alert(o);

    </script>

</head>
<body>
  
</body>
</html>

2. 一元加和减操作符

绝大多数开发人员对一元加和减操作符都不会陌生,而且这两个ECMAScript 操作符的作用与数学

书上讲的完全一样。一元加操作符以一个加号(+)表示,放在数值前面,对数值不会产生任何影响,

如下面的例子所示:

var num = 25;

num = +num; // 仍然是25

不过,在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。

换句话说,布尔值false 和true 将被转换为0 和1,字符串值会被按照一组特殊的规则进行解析,而

对象是先调用它们的valueOf()和(或)toString()方法,再转换得到的值。

下面的例子展示了对不同数据类型应用一元加操作符的结果:


<!DOCTYPE html>
<html>
<head>
    <title>Unary Plus/Minus Example 1</title>
    <script type="text/javascript">
          
        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

        alert(s1);
        alert(s2);
        alert(s3);
        alert(b);
        alert(f);
        alert(o);

    </script>

</head>
<body>
  
</body>
</html>

一元减操作符主要用于表示负数,例如将1 转换成-1。下面的例子演示了这个简单的转换过程:

var num = 25;

num = -num; // 变成了-25

在将一元减操作符应用于数值时,该值会变成负数(如上面的例子所示)。而当应用于非数值时,

一元减操作符遵循与一元加操作符相同的规则,最后再将得到的数值转换为负数,如下面的例子所示:


<!DOCTYPE html>
<html>
<head>
    <title>Unary Plus/Minus Example 2</title>
    <script type="text/javascript">
          
        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

       alert(s1);
        alert(s2);
        alert(s3);
        alert(b);
        alert(f);
        alert(o);

    </script>

</head>
<body>
  
</body>
</html>

3.5.2 位操作符

位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。

记不住,用到再学害羞

3.5.3 布尔操作符

3.5.4 乘性操作符

3.5.5 加性操作符

3.5.6 关系操作符

3.5.7 相等操作符

3.5.8 条件操作符

3.5.9 赋值操作符

3.5.10 逗号操作符


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHOU_VIP

您的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值