运算符基本规则

1、算术运算符

1.1、对象的相加

  • 如果运算子是对象,必须先转成原始类型的值,然后再相加。
  • 对象转成原始类型的值,规则如下。
  • 首先,自动调用对象的valueOf方法
  • 一般来说,对象的valueOf方法总是返回对象自身,这时再自动调用对象的toString方法,将其转为字符串。

1.2、指数运算符

  • 指数运算符(**)完成指数运算,前一个运算子是底数,后一个运算子是指数。
  • 指数运算符是右结合,而不是左结合。即多个指数运算符连用时,先进行最右边的计算。
  • 先计算第二个指数运算符,而不是第一个。

1.3、赋值运算符

  • 赋值运算符(Assignment Operators)用于给变量赋值。
  • 赋值运算符还可以与其他运算符结合,形成变体。下面是与算术运算符的结合。

2、比较运算符

  • 1、比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件。
  • 2、JavaScript 一共提供了8个比较运算符。
    • 非相等运算符:字符串的比较
    • > 大于运算符
    • < 小于运算符
    • <= 小于或等于运算符
    • >= 大于或等于运算符
    • == 相等运算符
    • === 严格相等运算符
    • != 不相等运算符
    • !== 严格不相等运算符
  • 3、非相等运算符:字符串的比较
    • 字符串按照字典顺序进行比较。
  • 4、非相等运算符:非字符串的比较
    • 如果两个运算子之中,至少有一个不是字符串,需要分成以下两种情况。
      • (1)原始类型值
        • 如果两个运算子都是原始类型的值,则是先转成数值再比较。
      • (2)对象
        • 如果运算子是对象,会转为原始类型的值,再进行比较。
  • 5、严格相等运算符
    • 1、如果两个值的类型不同,直接返回false。
    • 2、同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false。
    • 3、两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址
      • 对于两个对象的比较,严格相等运算符比较的是地址,而大于或小于运算符比较的是值。
    • 4、undefined和null与自身严格相等。
  • 6、严格不相等运算符
    • 严格相等运算符有一个对应的“严格不相等运算符”(!==),它的算法就是先求严格相等运算符的结果,然后返回相反值。
  • 7、相等运算符
    • 1、原始类型的值会转换成数值再进行比较
    • 2、对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。
    • 3、undefined和null只有与自身比较,或者互相比较时,才会返回true;与其他类型的值比较时,结果都为false。
    • 4、相等运算符隐藏的类型转换,会带来一些违反直觉的结果。
  • 8、不相等运算符
    • 相等运算符有一个对应的“不相等运算符”(!=),它的算法就是先求相等运算符的结果,然后返回相反值。

3、布尔运算符

  • 二进制位运算符
  • 布尔运算符用于将表达式转为布尔值,一共包含以下运算符。
    • 1、取反运算符(!)
      • 取反运算符是一个感叹号,用于将布尔值变为相反值,即true变成false,false变成true。
    • 2、且运算符(&&)
      • 如果第一个运算子的布尔值为true,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为false,则直接返回第一个运算子的值,且不再对第二个运算子求值。
    • 3、或运算符(||)
      • 或运算符(||)也用于多个表达式的求值。它的运算规则是:如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为false,则返回第二个运算子的值。
    • 4、三元条件运算符(?:)
      • 三元条件运算符由问号(?)和冒号(:)组成,分隔三个表达式。它是 JavaScript 语言唯一一个需要三个运算子的运算符。如果第一个表达式的布尔值为true,则返回第二个表达式的值,否则返回第三个表达式的值。

4、二进制位运算符

  • 1.1、概述
    • 二进制或运算符
    • 二进制位运算符用于直接对二进制位进行计算,一共有7个。
      • 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。
      • 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。
      • 二进制否运算符(not):符号为~,表示对一个二进制位取反。
      • 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。
      • 左移运算符(left shift):符号为<<,详见下文解释。
      • 右移运算符(right shift):符号为>>,详见下文解释。
      • 头部补零的右移运算符(zero filled right shift):符号为>>>,详见下文解释。
  • 1.2、这些位运算符直接处理每一个比特位(bit),所以是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能使用它们,否则会使代码难以理解和查错。
  • 2.1、二进制或运算符
    • 二进制或运算符(|)逐位比较两个运算子,两个二进制位之中只要有一个为1,就返回1,否则返回0。
    • 0 | 3 // 3
  • 2.2、二进制与运算符
    • 二进制与运算符(&)的规则是逐位比较两个运算子,两个二进制位之中只要有一个位为0,就返回0,否则返回1。
    • 0 & 3 // 0
  • 2.3、二进制否运算符
    • 二进制否运算符(~)将每个二进制位都变为相反值(0变为1,1变为0)。它的返回结果有时比较难理解,因为涉及到计算机内部的数值表示机制。
  • 2.4、异或运算符
    • 异或运算(^)在两个二进制位不同时返回1,相同时返回0。
    • “异或运算”有一个特殊运用,连续对两个数a和b进行三次异或运算,a^=b; b^=a; a^=b;,可以互换它们的值。这意味着,使用“异或运算”可以在不引入临时变量的前提下,互换两个变量的值。
  • 2.5、左移运算符
    • 左移运算符(<<)表示将一个数的二进制值向左移动指定的位数,尾部补0,
    • 即乘以2的指定次方。向左移动的时候,最高位的符号位是一起移动的。
  • 2.6、右移运算符
    • 右移运算符(>>)表示将一个数的二进制值向右移动指定的位数。如果是正数,头部全部补0;如果是负数,头部全部补1。
    • 右移运算符基本上相当于除以2的指定次方(最高位即符号位参与移动)。
  • 2.7、头部补零的右移运算符
    • 头部补零的右移运算符(>>>)与右移运算符(>>)只有一个差别,就是一个数的二进制形式向右移动时,头部一律补零,而不考虑符号位。所以,该运算总是得到正值。对于正数,该运算的结果与右移运算符(>>)完全一致,区别主要在于负数。
  • 3、开关作用
    • 假定某个对象有四个开关,每个开关都是一个变量。那么,可以设置一个四位的二进制数,它的每个位对应一个开关。

5、其他运算符,运算顺序

  • 1、void 运算符
    • void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。
    • void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4 + 7实际上等同于(void 4) + 7。
    • 这个运算符的主要用途是浏览器的书签工具(Bookmarklet),以及在超级链接中插入代码防止网页跳转
    • 下面是一个更实际的例子,用户点击链接提交表单,但是不产生页面跳转。
      • <a href="javascript: void(document.form.submit())"> 提交</a>
  • 2、运算顺序
    • 优先级:根据语言规格,这五个运算符的优先级从高到低依次为:小于等于(<=)、严格相等(===)、或(||)、三元(?:)、等号(=)。
    • 圆括号(())可以用来提高运算的优先级,因为它的优先级是最高的,即圆括号中的表达式会第一个运算。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值