在Javascript承诺上,大于/小于运算符的行为与等于运算符的行为不同

时间:2015-07-27 22:12:13

标签: javascript promise q

当使用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结果的特殊能力,而等于运算符(==,===)则没有。

任何人都可以解释这种行为吗?

1 个答案:

答案 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.valueOfb.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