我创建了两个新对象:
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); //trueRun 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检查dt1和dt2(两个独立的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)
所有血腥细节都可以在规范中找到:
行为完全按照ECMAScript标准的定义.
a == b是false因为它们没有引用同一个对象,如抽象平等比较部分中所定义的:
如果Type(x)与Type(y)相同,那么
一个.返回执行Strict Equality Comparison x === y的结果.
- 如果x和y是相同的Object值,则返回true.
- 返回false.
a < b是false因为该抽象关系比较算法首先通过转换操作数到非对象类型ToPrimitive抽象操作(其在对象结果的字符串表示的情况下"[object Object]").
由于两个操作数都将转换为相同的字符串值,因此它们将彼此相等.
a <= b是true因为b < a是false,按照旧定义的低于或相等的运算符(<=) .
- 设r是执行抽象关系比较rval <lval,LeftFirst等于false的结果.(见11.8.5).
- 如果r为true或未定义,则返回false.否则,返回true.
同样,抽象关系比较操作会将操作数转换"[object Object]"为彼此相等的字符串表示形式,以便b < a比较将评估为false:
| 归档时间: |
|
| 查看次数: |
679 次 |
| 最近记录: |