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

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

比较的特点:

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

## 相等运算符

### 相等(==)

比较操作符会为两个不同类型的操作数转换类型，然后进行严格比较。当两个操作数都是对象时，JavaScript会比较其内部引用，当且仅当他们的引用指向内存中的相同对象（区域）时才相等，即他们在栈内存中的引用地址相同。

#### 语法

    x == y

#### 例子

     1   ==  1     // true
    "1"  ==  1     // true
     1   == '1'    // true
     0   == false  // true

### 不相等 (!=)

不等操作符仅当操作数不相等时返回true，如果两操作数不是同一类型，JavaScript会尝试将其转为一个合适的类型，然后进行比较。如果两操作数为对象类型，JavaScript会比较其内部引用地址，仅当他们在内存中引用不同对象时不相等。

#### 语法

    x != y

#### 例子

    1 !=   2     // true
    1 !=  "1"    // false
    1 !=  '1'    // false
    1 !=  true   // false
    0 !=  false  // false

### 一致/严格相等 (===)

一致运算符不会进行类型转换，仅当操作数严格相等时返回true

#### 语法

    x === y

#### 例子

    3 === 3   // true
    3 === '3' // false
    var object1 = {"value":"key"}, object2={"value":"key"};
    object1 === object2 //false

### 不一致/严格不相等 (!==)

不一致运算符当操作数不相等或不同类型时返回true

#### 语法

    x !== y

#### 例子

    3 !== '3' // true
    4 !== 3   // true

## 关系运算符

### 大于运算符 (>)

大于运算符仅当左操作数大于右操作数时返回true

#### 语法

    x > y

#### 例子

    4 > 3 // true

### 大于等于运算符 (>=)

大于等于运算符当左操作数大于或等于右操作数时返回true

#### 语法

     x >= y

#### 例子

    4 >= 3 // true
    3 >= 3 // true

### 小于运算符 (<)

小于运算符仅当左操作数小于右操作数时返回true

#### 语法

     x < y

#### 例子

    3 < 4 // true

### 小于等于运算符 (<=)

小于等于运算符当左操作数小于或等于右操作数时返回true

#### 语法

     x <= y

#### 例子

    3 <= 4 // true

## 使用比较操作符

标准相等操作符(`==` 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 尝试将数字字面量转换为数字类型的值。 首先, 一个数学上的值会从数字字面量中衍生出来，然后得到被四舍五入后的数字类型的值。
- 如果其中一个操作数为布尔类型，那么布尔操作数如果为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'

## Specifications

Specification | Status | Comment
--- | --- | ---
ECMAScript 1st Edition. | Standard | Initial definition. Implemented in JavaScript 1.0
ECMAScript 3rd Edition. | Standard | Adds `===` and `!==` operators. Implemented in JavaScript 1.3
ECMAScript 5.1 (ECMA-262) Relational Operators ECMAScript 5.1 (ECMA-262) Equality Operators | Standard | Defined in several sections of the specification: Relational Operators, Equality Operators
ECMAScript 2015 (6th Edition, ECMA-262) Relational Operators ECMAScript 2015 (6th Edition, ECMA-262) Equality Operators | Standard | Defined in several sections of the specification: Relational Operators, Equality Operators
ECMAScript Latest Draft (ECMA-262) | Draft | Defined in several sections of the specification: Relational Operators, Equality Operators

## Browser compatibility

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

- Desktop
- Mobile

Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari
--- | --- | --- | --- | --- | ---
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes)

Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile
--- | --- | --- | --- | --- | --- | ---
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes)

## See also

- `Object.is()`
- Equality comparisons and sameness