转圈圈

题目:`[] == ![]`

解析:

  1. ! 优先级高于 == 先计算 ![]部分。[]为非falsy值,转化为true,因此![]false。题目转换为[] == false
  2. 比较运算符的左右操作数类型不一致,[]先通过toString() 转化为原始值"",题目转化为"" == false
  3. 比较操作符左右两边为基本类型的值,操作符右边有布尔类型的值,将布尔类型的值转换为数值,因此false 转化为0。题目转换为"" == 0
  4. 比较操作符两边是数值和字符串的比较,调用Number()将字符串转化为数值。Number("") 转化为00 == 0 ,结果为true。

扩展:

var a = 0;
!a++ == ++a
//  false  此时 a = 2


目录

  1. 运算符优先级
  2. ! 运算符
  3. 比较操作符

运算符优先级

  1. 运算符 ! 优先级高于 == 因此先计算 ![]
  2. 常用运算符优先级:
    1. 后置递增、后置递减 a++ a--
    2. 逻辑非 ! 前置递增、前置递减 ++a --a 从右向左
    3. 大于、小于、大于等于 、小于等于 > < >= <=
    4. 等于、全等于 == === !==
    5. 逻辑与 &&
    6. 逻辑或 ||
    7. 条件运算符
    8. 赋值 =

参考:

  1. MDN:运算符优先级
  2. 逻辑运算符

! 运算符

  1. falsy 值
    • null
    • NaN
    • 0
    • 空字符串 '' ""
    • undefined
  2. 其他值都是 true

比较操作符

  • ==比较操作符 ,比较前,将两个操作数转换为相同的数据类型。

  • === 严格比较,操作数类型和值都必须相等

特点:

  1. null == undefined // true 不严格相等
  2. +0 === -0 // true 严格相等
  3. null undefined 严格和自身相等
  4. NaN == NaN //false NaN 都不等 NaN

== 相等运算符

  1. 左右操作数都是基本类型的值时,转换为相同类型的值作比较。

    1 == "1" //true
    1 == true // true
    0 == false // true
    "" == 0  //  true ,Number("") = 0
    
  2. 左右操作数都是复杂数据类型(对象、数组)时,他们在内存中的引用地址(堆内存)相同时才相等。

    [] == [] // false  
    [1,2] == [1,2] //false
    
    var arr = [1,2];
    var a = arr;
    var b = arr;
    a == b  //true
    a === b  //true 
    
    // 同理 对象一样
    {} == {}  //false
    var obj = {a:1};
    var a = obj;
    var b = obj;
    a === b  true
    
  3. 左右操作数类型不一致,基本数据类型和复杂数据类型(对象)作比较,对象会被转化为原始值。

    1. 数字和字符串比较

      字符串会转换为相应的数值 (Number())

       1 == "1";  //true  "1"会转化为 数值 1  
      "1" == 1;  //true
        //  Number实现字符串转换
      "1.1.1" == 1.1  //false 
      parseInt("1.1.1")  //  1
      parseFloat("1.1.1")  //  1.1
      Number("1.1.1")  //  NaN 
      
      Number("1.1")  //  1.1
      parseInt("1.1")  //  1
      parseFloat("1.1")  //  1.1 
      
      Number("")  //  0 相当于 Number()
      parseInt("") // NaN 相当于parseInt()
      parseFloat("")  //  NaN 相当于parseFloat()
      
      
    2. 如果其中一个操作数为布尔值,则true 转换为1 ,false转换为0

      1 == true  //  true
      "1" == true  //  true
      
      
    3. 对象与数字或字符串作比较时,操作符通过valueOf() toString()将对象转换为原始值(字符串、数值),转换失败会产生运行时错误。

      var obj = {a:1};
      obj.toString()  //  "[object Object]"
      obj.valueOf()  //  obj
      obj.valueOf() === obj  //  true
      
      var arr = [];
      arr.toString() //  ""
      arr.valueOf()  //  	arr
      arr.valueOf() === arr  //  true
      
      [] == 0  //  true
      [] == false  //  true
      [1] == 1  //  true
      [1] == "1"  //  true
      
      
      [1,2].toString() //  "1,2"
      [1,2].join()  //  "1,2"
      [1,2].join(',')  // "1,2"
      [1,2].join('')  //  "12"
      

=== 全等运算符

操作数值和数据类型相等时返回true 否则返回false

1 === "1"  //false
1 === 1  //true

参考:

  1. MDN:比较操作符
posted @ 2019-04-22 08:43  rosendolu  阅读(128)  评论(0编辑  收藏  举报