2

我正在查看indexOf来自MDN的实现。这是我很好奇的:

n = (n > 0 || -1) * Math.floor(Math.abs(n));

在我看来,这(n > 0 || -1)将评估为trueor false,但随后它被相乘了?

如果链接中断,这是indexOfMDN 的实现:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
        "use strict";
        if (this == null) {
            throw new TypeError();
        }
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) {
            return -1;
        }
        var n = 0;
        if (arguments.length > 1) {
            n = Number(arguments[1]);
            if (n != n) { // shortcut for verifying if it's NaN
                n = 0;
            } else if (n != 0 && n != Infinity && n != -Infinity) {
                n = (n > 0 || -1) * Math.floor(Math.abs(n));
            }
        }
        if (n >= len) {
            return -1;
        }
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) {
            if (k in t && t[k] === searchElement) {
                return k;
            }
        }
        return -1;
    }
}
4

3 回答 3

3

在我看来, (n > 0 || -1) 将评估为真或假

没有。||JavaScript 中的运算符非常强大,如果n<= 0,则该表达式的结果是-1,不是false

如果n > 0,则该表达式确实会产生true,是的,它们确实乘以true一个数字。没关系(不会这样做,但这是允许的),true将自动强制转换为数字 ( 1),因为 a 的两边*在乘法之前都被强制转换为数字。各种类型到数字的转换在规范的第 9.3 节中。

于 2013-05-07T14:39:59.790 回答
2

第一的:

(n > 0 || -1)

按以下顺序进行:

  n > 0  // if true it stops here and -1 is not evaluated.
  -1

然后它尝试乘以

   true * Math.floor(Math.abs(n))
   or
   -1 * Math.floor(Math.abs(n))

最后它要么存储:

n = 1 * Math.floor(Math.abs(n))
or 
n = -1 * Math.floor(Math.abs(n))
于 2013-05-07T14:39:41.680 回答
0

如果第一部分为假,那么它将乘以-1,否则将乘以1OR如果左侧为“假”,则运算符返回表达式的右侧

于 2013-05-07T14:40:09.227 回答