红宝书阅读笔记ch3-2

红宝书阅读笔记ch3-2

操作符

操作符用于操作数据值,包括算术操作符、位操作符、关系操作符和相等操作符。
ECMAScript操作符适用于很多值,例如字符串、数字值、布尔值,甚至对象。

一元操作符

  • 递增和递减操作符

    • 递增和递减操作符,有前置型和后置型。

    • 执行前置型递增和递减操作时,变量的值都是在语句求值以前改变的。

    • 后置型递增和递减操作是在它们的语句被求值之后才执行的。

  • 一元加和减操作符

    • 一元加操作符以一个加号(+)表示,可用以加对非数值进行转换。

    • 一元减操作符以一个加号(-)表示,同样也可以用于对非数值的转换,然后再将数值转换为负数。

  • 位操作符,简单点说就操作二进制的运算。

    • 按位非(NOT),由一个波浪线(~)表示,返回二进制数值的反码。

    • 按位与(AND),由一个和号字符(&)表示,它有两个操作数,将两个数值的每一位对齐,1 0 得0,0 1得0,1 1得1。

    • 按位或(OR),由一个竖线符号(|)表示,同样也有两个操作数,在两个位有一个位是1就返回1,而只有两个0才返回0。

    • 按位异或(XOR),由一个插入符号(^)表示,也有两个操作数,1 1得0,1 0得1,0 1得1,0 0得0。

    • 左移操作符由两个小于符号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数,左移会以0来填充空位。

    • 有符号的右移操作符由两个大于号(>>)表示,将数值向右移动,但保留符号位。

    • 无符号右移操作符由3个大于号(>>>)表示,这个操作符会将所有的32位都向右移动,对于正数来说有符号右移和无符号右移相同,但是对于负数来说无符号右移会把负数的二进制码当成正数的二进制码,而且负数以其绝对值的二进制补码形式表示,会导致无符号右移后结果会非常大。

布尔操作符

布尔操作符有三个:NOT、AND、OR。

  • 逻辑非操作符由一个叹号(!)表示,可以应用于所有数据类型。无论这个值是什么类型,这个操作符都会返回一个布尔值。逻辑非会先将值转换为布尔值,再将其求反。

    • 转换规则:

    • 如果操作数是一个对象,返回false;

    • 如果操作数是一个空字符串,返回true;

    • 如果操作数是一个非空字符串,返回false;

    • 如果操作数是数值0,返回true;

    • 如果操作数是任意非0数值(包括Infinity),返回false;

    • 如果操作数是null,返回true;

    • 如果操作数是Nan,返回true;

    • 如果操作数是undefined,返回true。

alert(!false); //返回true
alert(!"blue"; //返回false
alert(!0); //返回true
  • 逻辑与操作符由两个和号(&&)表示,有两个操作数,真真为真,真假为假,假真为假,假假为假,可应用于所有类型的操作数。

    • 在有一个操作数不是布尔值的情况下,逻辑与就不一定返回布尔值;此时它遵循以下规则:

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

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

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

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

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

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

    • 逻辑与操作属于短路操作,即第一个是为false,那么就不会判断第二个是真还是假的了,它会直接返回false,而不会判断第二个操作数。

  • 逻辑或操作符由两个竖线符号(||)表示,有两个操作数,真真为真,真假为真,假真为真,假假为假。

    • 如果有一个操作数不是布尔值,逻辑或不一定返回布尔值,遵循规则如下:

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

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

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

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

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

    • 如果两个操作数是undefined,则返回undefined。

    • 逻辑或同样也是短路操作,如果一个操作数的值为true,那么就不会判断第二个操作数的值了。通过这一点我们可以用来避免给变量赋值为null或undefined值。

var myObject = preferredObject || backupObject;

乘性操作符

  • ECMAScript定义了三个乘性操作符,乘法(*)、除法(/)和求模(%),与其他语言用途类型,只是操作数为非数值的情况下会执行自动类型转换,也就是空字符串将被当做0,布尔值true会被当做0。

  • 其他类型的转换规自行看书,P47。

加性操作符

在ECMAScript中加和减除了简单的算术运算外还有一系列的特殊操作。

  • 加法,用(+)表示

    • 如果操作数两个都是数值,执行常规的加法计算;

    • 如果是NaN、Infinity、-Infinity那么返回的结果也是这三种数据类型。

    • 如果+0、-0那么返回的还是0。

    • 如果有两个操作数都是字符串,则将第二个操作数和第一个操作数拼接起来。

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

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

  • 减法操作符,(-)

    • 如果两个操作数都是数值,则执行常规的算术减法并返回结果。

    • 正无穷减正无穷的结果是NaN,负无穷减负无穷的结果是负无穷。

    • 零减零的结果是零。

    • 如果有一个操作数是字符串、布尔值、null、或undefined,则先在后台调用Number()函数将其转换为数值,然后在根据前面的规则执行减法运算。如转换的是NaN,则减法的结果就是NaN。

    • 如果有一个操作数是对象的话,则调用对象的valueOf()方法取得表示该对象的数值。如果得到的是NaN,则减法的结果就是NaN。如果对象没有valueOf()方法,则调用其的toString()方法并将得到字符串转换为数值。

关系操作符

小于(<)、大于(>)、小于等于(<=)和大于等于(>=)这几个关系操作符用于对两个值的比较,并返回一个布尔值。

  • 如何两个操作数都是数值,则执行数值比较。

  • 如果两个都是字符串,则比较两个字符串对应的字符编码值。

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

  • 如果有一个操作数是对象,则先调用这个对象的valueOf()方法,用得到的结果按照前面的规则进行比较,如没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较。

相等操作符

相等不相等-–先转换再比较
全等不全等—仅比较不转换

  • 相等操作符由两个等号(==)表示,如果两个操作数相等,则返回true。而不相等操作符由叹号后跟等号(!=)表示,如果两个操作数不相等,则返回true。这两个操作符都会先转换操作数(俗称强制转型),然后再比较它们的相等性。

    • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值—false转换为0,而true转换为1;

    • 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先把字符串转换为数值;

    • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型按照前面的规则进行比较;

    • null和undefined是相等的;

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

    • NaN和任何类型的值都不相等,包括它自己。

    • 如果两个操作数都是对象,则比较它们是不是同一个对象。

  • 全等和不全等
    全等和不全等,除了不转换操作数之外,其比较规则与相等和不相等一样。

    • 全等操作符由三个等号(===)表示。

    • 不全等操作符由一个叹号和三个等号(!===)表示。

    • 需要注意的一点null和undefined是相等的,但不是全等的,因为它们不是一个类型。

条件操作符

ECMAScript的条件操作符与Java的条件操作符语法相同。

var variable = boolean_expression ? true_value : false_value;

赋值操作符

简单的赋值操作符由等于号(=)表示,其作用就是把右侧的值赋给左侧的变量。除此之外还可以在等于号前面添加 加减乘除、取模操作符或位操作符完成复合操作。

var num=10;
num +=10; //等同于num = num +10

逗号操作符

逗号操作符多用于声明多个变量;除此之外逗号操作符还可以用于赋值。在用于赋值时,逗号操作符总会返回表达式的最后一项。

var num1=1,num2=2,num3=3;
var num = (5,4,1,8,0); //num的值为0