• JS_高程3.基本概念(4)操作符


      ECMA-262用于操作数据值的操作符包括:

      算术操作符

      位操作符

      关系操作符

      相等操作符

      ECMAScript操作符的不同之处在于:它能够适用于很多值,包括字符串,数字值,布尔值,甚至是对象。(在应用于对象时,相应的操作符通常会调用对象的valueOf()和(或)toString()方法,以便取得可以操作的值。)

    1.一元操作符

    (1)递增和递减操作符

      需要注意的是:

      eg:

        前置++age:变量的值在语句被求值之前改变。

        后置age++:变量的值在语句被求值之后改变。

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

      递增和递减操作符应用于其他数据类型遵循的规则详见高程书P37。

    (2)一元加和减操作符

      当一元加和减操作符放在数值前面时,相当于正负号。

      当一元加和减操作符放在非数值类型的数据类型前时,它会依照相应的规则进行数据类型的转换。

    2.位操作符

      ECMAScript中所有的数值都是以IEEE-754 64位格式存储的,但是为操作符并不是直接操作64位的值。而是先将64位的值转换成32位的整数,然后执行操作,最后在将结果转换回64位。但是这个转换过程也导致了一个严重的复效应,即在对特殊的NaN和Infinity值应用位操作时,这两个值都会被当成0来处理。

      如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),再进行位操作,最终得到一个数值。

    (1)负数以二进制补码的格式存储。

    计算一个数值二进制补码的过程如下:

    1.求这个数值绝对值的二进制码。

    2.求二进制的反码。

    3.得到的二进制反码加1。

     

    (2)ECMAScript中,当我们以二进制字符串形式输出一个负数时,我们看到的这个负数的绝对值的二进制码前面加了一个负号,它以更合乎逻辑的形式展示了出来。

    eg:

    1 var num=-18;
    2     alert(num.toString(2));

      注:

      默认情况下,ECMAScript中的所有整数都是有符号整数。当然,也存在无符号整数,无符号整数的值更大,因为第32位不再表示符号,可以用来表示数值。

    (3)按位非(NOT):符号~

      按位非的本质是操作数的负值减1。

    (4)按位与(AND):符号&

    (5)按位或(OR):符号|

    (6)按位异或(XOR):符号^

    (7)左移:符号<<,左移操作出现的空位以0填充。左移不会影响数值的符号位。

    (8)有符号的右移:符号>>,右移时保留符号位,右移出现的空位由符号位填充

    (9)无符号的右移:符号>>>,无符号的右移产生的空位以0填充。所以,正数的无符号右移和有符号右移结果一样,负数就不一样了。其次,无符号右移操作符会把负数的二进制码当成正数的二进制码,而且,由于负数以其绝对值的二进制的补码表示,因此就会导致无符号右移后的结果非常之大。

    3.布尔操作符

       布尔操作符有三个:非(NOT:!),与(AND:&&),或(OR:||)

    (1)逻辑非:运用该操作符时,首先会对它的操作数转换成一个布尔值,然后对其求反。详细规则见高程P44。

      注:同时使用两个逻辑非操作符,可以得到这个值真正对应的布尔值,与使用Boolean()函数的结果相同。

      eg:alert(!!123);//true

        alert(!!NaN);//false

    (2)逻辑与:该操作可以应用于任何类型的操作数,在有一个操作数不是布尔值的时候,逻辑与操作就不一定返回布尔值。详细规则见高程P45。

      注:逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。

    eg:

    1 var found=true;
    2     var result=(found && someUndefinedVariable);  //这里发生错误
    3     alert(result);          //这一行不会执行

      上面代码出现错误的原因是,因为found的值是true,所有逻辑与会继续对第二个变量求值,但是由于第二个变量没有定义,所以导致错误。说明不能再逻辑与中使用未定义的值。

      将found的值改为false,由于逻辑与的短路特性,就不会出现错误。如下所示:

    1 var found=false;
    2     var result=(found && someUndefinedVariable);//不会发生错误
    3     alert(result);//会执行

    (3)逻辑或:与逻辑与相似,也是短路操作符,详细的规则见高程P46。

      注:

      可以利用逻辑或的俩避免为变量赋null或undefined值。

      eg: var myobject = preferredObject || backupObject;

      ECMAScript程序的赋值语句经常会使用到这种模式,如果 preferredObject不是null,那么它的值将会赋给myobject,如果是null,则将backupObject的值赋给myobject

    4.乘性操作符:乘法(*),除法(/),求模(%)

      当操作数是非数值的时候,后台会先使用Number()转型函数将其转换为数值。

    (1)乘法。详细的规则见高程P47。

    (2)除法。详细的规则见高程P47。

    (3)求模。详细的规则见高程P48。

    5.加性操作符:加法(+),减法(-)。

    (1)加法

      有以下两种情况:

    一. 当两个操作数都是数值时,执行常规的加法运算,详细的规则见高程P48。

    二. 如果两个操作数存在字符串,当两个操作数都是字符串时,直接将两个字符串拼接起来,如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后在将两个字符串拼接起来。

    注意:

      如果有一个操作数是对象,数值或是布尔值,则调用toString()方法取得相应的字符串值,然后在应用前面的关于字符串的规则。对于undefined和null,则调用String()函数并取得字符串“undefined”和“null”。

    一个因为忽视加法操作符数据类型而导致的常见的错误:

    eg:

    1  var num1=2;
    2     var num2=8;
    3     var text="The sum of 2 and 8 is:"+ num1 +num2;
    4     alert(text);

    结果如下:

      

     要得到正确的结果,可以像下面这样使用圆括号:

    1 var num1=2;
    2     var num2=8;
    3     var text="The sum of 2 and 8 is:"+ (num1 +num2);
    4     alert(text);

    结果如下:

    (2)减法。详细的规则见高程P49

    6.关系操作符: < , > , <= , >= ,这几个操作都返回布尔值。详细的规则见高程P50。

     需要注意的是:当两个操作数都是字符串是,则比较两个字符串对应的字符编码值。

    eg:

      

    1 var result="23"<"3";
    2     alert(result);

    结果:

    出现这样结果的原因是:两个操作数都是字符串,,所以比较的是字符编码,(“2”的字符编码是50,而“3”的字符编码是51。)

    可以将其中一个操作数改为数值,这样的比较时,后台会自动将另一个操作数也转换为数值类型,这样就可以得到正确的结果,如下所示:

      

    1  var result="23"<3;
    2     alert(result);

    7.相等操作符

      (1)相等和不相等(== or  !=):先转换再比较。(强制转型)详细的规则见高程P51。

        注:

        null和undefined是相等的,且在比较相等性之前不能将null和undefined转换为其它任何值。

        如果两个操作数书对象,则比较它们是否是同一对象。

      (2)全等和不全等(=== or !===):仅比较而不转换。详细的规则见高程P52。

        eg:

    1  var result1=("55"==55);
    2     var result2=("55"===55);
    3     alert(result1);
    4     alert(result2);

    结果依次如下:

    1  var result1=(null==undefined);
    2     var result2=(null===undefined);
    3     alert(result1);
    4     alert(result2);

    结果依次如下:

    8.条件操作符

    eg:

    1 var max=(5>10)?5:10;
    2     alert(max);

    9.赋值操作符(=):把右侧的值赋给左侧的变量。复合赋值操作符详见高程P53。

      注:复合赋值操作符可以简化赋值操作,但是它们不会带来任何性能上的提升。

    10.逗号操作符

      (1)声明多个变量

      eg:var num1=1,num2=4,num3=9;

      (2)赋值,逗号操作符总是会返回表达中的最后一项。

      eg:var num=(4,5,6,0);

        alert(num);

    结果:

      

  • 相关阅读:
    shell:echo -e "33字体颜色"
    Linux配置swap
    软工2017第三周作业——词频效能分析
    ffmpeg——关于视频压缩
    软件工程2017第一次作业——随笔汇总
    软件工程2017第一次作业——随笔二
    软件工程2017第一次作业——随笔一
    02-分支结构
    iOS中如何知道app版本已更新
    socket编程中客户端常用函数 以及简单实现
  • 原文地址:https://www.cnblogs.com/LinSL/p/6146984.html
Copyright © 2020-2023  润新知