阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      JS 关系运算符

      比较运算符比较其操作数,并 Boolean 根据比较结果是否为真返回一个值。

      说明

      JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符。对于严格比较运算符(===)来说,仅当两个操作数的类型相同且值相等为 true,而对于被广泛使用的比较运算符(==)来说,会在进行比较之前,将两个操作数转换成相同的类型。对于关系运算符(比如 <=)来说,会先将操作数转为原始值,使它们类型相同,再进行比较运算。

      字符串比较则是使用基于标准字典的 Unicode 值来进行比较的。

      比较的特点:

      • 对于两个拥有相同字符顺序,相同长度,并且每个字符的位置都匹配的字符串,应该使用严格比较运算符。
      • 对于两个数值相同的数字应该使用严格比较运算符,NaN 和任何值不相等,包括其自身,正数零等于负数零。
      • 对于两个同为 true 或同为 false 的布尔操作数,应使用严格比较运算符。
      • 不要使用严格比较运算符或比较运算符来比较两个不相等的对象。
      • 当比较一个表达式和一个对象时,仅当两个操作数引用相同的对象(指针指向相同对象)。
      • 对于 Null 和 Undefined 类型而言,应使用严格比较运算符比较其自身,使用比较运算符进行互相比较。

      in

      在 in 操作员确定对象是否具有给定的属性。

      instanceof

      在 instanceof 操作员确定对象是否是另一对象的一个实例。

      <

      少于运算符。

      >

      大于运算符。

      <=

      小于或等于运算符。

      >=

      大于或等于运算符。

      注意:=>不是运算符,而是 Arrow 函数的表示法。

      使用比较操作符

      标准相等操作符 (== and !=) 使用 Abstract Equality Comparison Algorithm 去比较两个操作数。当两个操作数类型不相等时,会在比较前尝试将其转换为相同类型。 e.g., 对于表达式 5 == ‘5’, 在比较前会先将右边字符串类型的操作数 5 转换为数字。

      严格相等操作符 (=== and !==) 使用 Strict Equality Comparison Algorithm 并尝试对两个相同操作数进行相等比较,如果它们的类型不相等,那么永远会返回 false 所以 5 !== ‘5’。

      当需要明确操作数的类型和值的时候,或者操作数的确切类型非常重要时,应使用严格相等操作符。否则,当你允许操作数在比较前进行类型转换时,可以使用标准相等操作符来比较。

      当比较运算涉及类型转换时 (i.e., non–strict comparison), JavaScript 会按以下规则对字符串,数字,布尔或对象类型的操作数进行操作:

      • 当比较数字和字符串时,字符串会转换成数字值。 JavaScript 尝试将数字字面量转换为数字类型的值。 首先,一个数学上的值会从数字字面量中衍生出来,然后这个值将被转为一个最接近的 Number 类型的值。
      • 如果其中一个操作数为布尔类型,那么布尔操作数如果为 true,那么会转换为 1,如果为 false,会转换为整数 0,即 0。
      • 如果一个对象与数字或字符串相比较,JavaScript 会尝试返回对象的默认值。操作符会尝试通过方法 valueOf 和 toString 将对象转换为其原始值(一个字符串或数字类型的值)。如果尝试转换失败,会产生一个运行时错误。
      • 注意:当且仅当与原始值比较时,对象会被转换为原始值。当两个操作数均为对象时,它们作为对象进行比较,仅当它们引用相同对象时返回 true。

      注意:字符串对象的类型是对象,不是字符串!字符串对象很少被使用,所以下面的结果也许会让你惊讶:

      // true as both operands are Type String (i.e. string primitives):
      'foo' === 'foo'
      
      var a = new String('foo');
      var b = new String('foo');
      
      // false as a and b are Type Object and reference different objects
      a == b
      
      // false as a and b are Type Object and reference different objects
      a === b
      
      // true as a and 'foo' are of different type and, the Object (a)
      // is converted to String 'foo' before comparison
      a == 'foo'
      
      目录
      目录