• 比较运算符


    原文地址:https://wangdoc.com/javascript/

    概述

    JavaScript一共提供了8个比较运算符。

    • >大于比较运算符
    • <小于比较运算符
    • <=小于等于比较运算符
    • >=大于等于比较运算符
    • ==相等运算符
    • ===严格相等运算符
    • !=不相等运算符
    • >=严格不相等运算符
      这八个比较运算符分为两类:相等比较和非相等比较。两者的规则是不一样的,对于非相等比较,算法是先看两个运算子是否都是字符串,如果是的,就按照字典顺序比较(实际上是比较Unicode码点);否则,将两个运算子都转成数值,再比较数值的大小。

    非相等运算符:字符串的比较

    JavaScript引擎内部首先比较首字符的Unicode码点。如果相等,在比较第二个字符的Unicode码点,以此类推。

    非相等运算符:非字符串的比较

    如果两个运算子都不是字符串,分为以下两种情况
    (1)原始类型值
    如果两个运算子都是原始类型的值,则是先转成数值再比较。

    5 > '4'
    // 等同于 5 > Number('4')
    

    任何值(包括NaN本身)与NaN比较,返回的都是false
    (2)对象
    如果运算子是对象,会转为原始类型的值,再进行比较。对象转换成原始类型的值,算法是先调用valueOf方法;如果返回的还是对象,再接着调用toString方法。

    var x = [2];
    x > "11" // true
    // 等同于 [2].valueOf().toString() > "11"
    // 即"2" > "11"
    
    x.valueOf = function() { return "1"; }
    x > "11" // false
    // 等同于 [2].valueOf() > "11"
    // 即"1" > "11"
    

    严格相等运算符

    JavaScript提供两种相等运算符:=
    简单的,它们的区别是相等运算符()比较两个值是否相等,严格相等运算符()比较它们是否为同一个值。如果两个值不是同一类型,严格相等运算符直接返回false,而相等运算符会将它们转换成同一类型,再用严格相等运算符进行比较。
    (1)不同类型的值
    如果两个值类型不同,直接返回false

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

    (2)同一类的原始类型
    同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相等就返回true,值不同就返回falseNaN与任何值都不相等,包括自身。另外,正0等于负0
    (3)复合类型值
    两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址。

    [] === [] // false
    {} === {} // false
    (function() {} === function() {}) // false
    

    var v1 = {};
    v2 = v1;
    v1 === v2; // true

    注意:**对于两个对象的比较,严格相等运算符比较的是地址,而大于或小于运算符比较的是值**。
    **(4)undefined和null**
    <font color=red>undefined</font>和<font color=red>null</font>与自身严格相等。
    ```js
    undefined === undefined // true
    null === null // true
    

    由于变量声明后默认值是undefined,因此两个只声明没有赋值的变量是相等的。

    var v1;
    var v2;
    v1 === v2 // true
    

    (6)相等运算符
    相等运算符用来比较相同类型的数据是,与严格相等运算符完全一样。

    1 == 1.0
    1 === 1.0
    

    比较不同类型的数据是,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。

    • 原始类型值
      原始类型的值会转换成数值再进行比较。
    1 == true // true
    // 等同于 1 === Number(true)
    
    • 对象与原始类型值比较
      对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。
    // 对象和数值比较时,对象转为数值
    [1] == 1 //true
    // 等同于 Number([1]) == 1
    
    // 对象和字符串比较时,对象转为字符串
    [1] == "1" // true
    // 等同于String([1]) == "1"
    [1, 2] == "1,2" // true
    
    // 对象和布尔值比较时,两边都转为数值
    [1] == true // true
    [2] == true // false
    
    • undefined和null
      undefinednull与其他类型比较时,结构都为false,它们互相比较时,结果为true
    false == null //false
    false == undefined // false
    0 == null // false
    0 == undefined // false
    undefined == null // true
    

    由于相等运算符隐藏的类型转换,会带来一些违反直觉的结果。因此建议不要使用相等运算符,最好只使用严格相等运算符。

  • 相关阅读:
    Silverlight未能加载文件或程序集“XXX”或它的某一个依赖项。系统找不到指定的文件。
    Silverlight button样式
    全局变量的优缺点
    安装、卸载WINDOWS 服务
    递归
    数组常用api
    节流函数&防抖函数 柯里化函数
    数组
    js无缝轮播 和淡入淡出轮播
    作用域链和域解析
  • 原文地址:https://www.cnblogs.com/chris-jichen/p/9987325.html
Copyright © 2020-2023  润新知