将新的Object()与JavaScript中的另一个新Object()进行比较

Sar*_*yan 21 javascript

我创建了两个新对象:

var a = new Object();
var b = new Object();
Run Code Online (Sandbox Code Playgroud)

经过比较,我得到了这些结果:

var a = new Object();
var b = new Object();
console.log(a == b); //false
console.log(a > b); //false
console.log(b > a); //false
console.log(a >= b); //true
console.log(b >= a); //true
Run Code Online (Sandbox Code Playgroud)

请解释一下这是怎么回事?

T.J*_*der 44

较对象的引用==!=(或===!==)基于它们是否指所比较的相同的对象.如果是这样,他们是平等的; 如果没有,他们就不平等了.

但关系比较运算符(>,<,>=<=)不比较的基准,他们强迫自己操作数的东西,他们可以比较:数字或字符串.

在这种情况下new Object(),强制最终会创建一个字符串:"[object Object]".当然,这"[object Object]" >= "[object Object]"是真的,因为它们是平等的.

所以实际上,你实际做的是:

console.log(a == b);                 //false
console.log(String(a) > String(b));  //false
console.log(String(b) > String(a));  //false
console.log(String(a) >= String(b)); //true
console.log(String(b) >= String(a)); //true
Run Code Online (Sandbox Code Playgroud)

...但请注意,其他对象类型的强制方式不同,因为对象可以通过实现/覆盖来选择它们在这种情况下强制执行的方式(规范在字符串上优先使用数字)valueOf.例如,Date如果另一个操作数也可以强制转换为数字,则当您将关系运算符应用于它们时,对象会强制转换为数字.所以,你可以可靠地使用dt1 > dt2,看看是否dt1代表以后的日期/时间dt2 -但你不能使用dt1 == dt2检查dt1dt2(两个独立的Date对象)具有相同的日期/时间在他们,因为==会检查,看看他们是相同的反而是对象.这让我们感到有点兴奋:

var dt1 = new Date(2016, 5, 23);
var dt2 = new Date(2016, 5, 23);
console.log(dt1 < dt2);  // false
console.log(dt1 > dt2);  // false
console.log(dt1 == dt2); // false!
Run Code Online (Sandbox Code Playgroud)

所有血腥细节都可以在规范中找到:

  • 我真的很想知道那里发生了什么......现在很清楚:) (2认同)
  • 我喜欢JS,但看着日期==比较是假的让我头疼我的头...... (2认同)

Thr*_*gle 6

行为完全按照ECMAScript标准的定义.

  1. a == bfalse因为它们没有引用同一个对象,如抽象平等比较部分中所定义:

    1. 如果Type(x)与Type(y)相同,那么

      一个.返回执行Strict Equality Comparison x === y的结果.

    在检查了所有其他类型之后,严格相等比较算法本身指定:

    1. 如果x和y是相同的Object值,则返回true.
    2. 返回false.
  2. a < bfalse因为抽象关系比较算法首先通过转换操作数到非对象类型ToPrimitive抽象操作(其在对象结果的字符串表示的情况下"[object Object]").

    由于两个操作数都将转换为相同的字符串值,因此它们将彼此相等.

  3. a <= btrue因为b < afalse,按照旧定义低于或相等的运算符(<=) .

    1. 设r是执行抽象关系比较rval <lval,LeftFirst等于false的结果.(见11.8.5).
    2. 如果r为true或未定义,则返回false.否则,返回true.

    同样,抽象关系比较操作会将操作数转换"[object Object]"为彼此相等的字符串表示形式,以便b < a比较将评估为false: