gpt4 book ai didi

javascript - 大于/小于运算符在 Q Promise 上的行为与等于运算符不同

转载 作者:行者123 更新时间:2023-11-28 19:06:03 24 4
gpt4 key购买 nike

当使用 Javascript Promise 时,我遇到了这种奇怪的行为。考虑以下代码:

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() 的值,则代码将按预期工作。

所以奇怪的行为是 == 在 promise 方面的行为与 < 或 > 不同。似乎小于 (<) 和大于 (>) 在某种程度上具有等待 Promise 结果的特殊能力,而相等运算符 (==, ===) 却没有。

谁能解释一下这种行为吗?

最佳答案

如果相等,结果为false,因为您正在比较两个不相同的对象:

来自spec :

7.2.12 Abstract Equality Comparison

...
3. If Type(x) is the same as Type(y), then
    Return the result of performing Strict Equality Comparison x === y.
...

7.2.13 Strict Equality Comparison

...
8. If x and y are the same Object value, return true.
9. Return false.

<小时/>

但是,the relational comparison仅为字符串和数字定义。因此,JavaScript 在比较 Promise 之前会执行类型转换。在此过程中它将调用对象的valueOf方法,因此它实际上会比较 a.valueOfb.valueOf 的返回值。除此之外,Q overrides the default valueOf implementation to return the resolved value :

// XXX deprecated
promise.valueOf = function () {
if (messages) {
return promise;
}
var nearerValue = nearer(resolvedPromise);
if (isPromise(nearerValue)) {
resolvedPromise = nearerValue; // shorten chain
}
return nearerValue;
};

但是您可以看到库不鼓励这样做,很可能是因为 standard promises不要实现这样的行为。

<小时/>

简化演示:

> var a = {valueOf: function() { return 0; }};
> var b = {valueOf: function() { return 0; }};
> a == b
false
> a >= b
true

关于javascript - 大于/小于运算符在 Q Promise 上的行为与等于运算符不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com