第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 逗号操作符


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZHOU_VIP

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

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

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

打赏作者

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

抵扣说明:

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

余额充值