当使用Javascript promises时,我遇到了这种奇怪的行为。请考虑以下代码:
var Q = require('q');
var d1 = Q.defer();
var d2 = Q.defer();
compare(d1.promise, d2.promise);
d1.resolve(3);
d2.resolve(3);
function compare(a, b) {
Q.all([a,b]).then(function(results) {
console.log('a: ' + a + ' b: ' + b);
var result = (a == b)? 1: -1;
console.log(result);
});
}
运行此代码时,您获得-1。我意识到我当时没有评估传递给匿名函数的结果变量(正如我所知)。我的具体问题是:
如果使用大于(>)或小于(<)运算符更改松散等式(==)运算符,并更改传递给resolve()的值,则代码将按预期运行
所以奇怪的行为是= =在承诺方面的行为与<或者>。似乎小于(<)和大于(>)以某种方式具有等待promises结果的特殊能力,而等于运算符(==,===)则没有。
任何人都可以解释这种行为吗?
答案 0 :(得分:3)
如果相等,结果为false
,因为您要比较两个不相同的对象:
来自https://dev.evernote.com/doc/articles/enscript.php:
7.2.12抽象平等比较
...
3.如果Type(x)与Type(y)相同,则为
返回执行Strict Equality Comparison x === y。的结果 ...
和
7.2.13严格的平等比较
...
8.如果x和y是相同的Object值,则返回true 9.返回false。
但是,spec仅针对字符串和数字定义。因此,JavaScript在比较承诺之前执行类型转换。在此过程中,它将调用对象的the relational comparison方法,因此它实际上会比较a.valueOf
和b.valueOf
的返回值。除此之外,valueOf
:
// XXX deprecated
promise.valueOf = function () {
if (messages) {
return promise;
}
var nearerValue = nearer(resolvedPromise);
if (isPromise(nearerValue)) {
resolvedPromise = nearerValue; // shorten chain
}
return nearerValue;
};
但你可以看到图书馆不鼓励它,很可能是因为Q overrides the default valueOf
implementation to return the resolved value没有实现这样的行为。
简化演示:
> var a = {valueOf: function() { return 0; }};
> var b = {valueOf: function() { return 0; }};
> a == b
false
> a >= b
true