Javascript 为什么要检查Array.prototype.indexOf的布尔值?

Javascript 为什么要检查Array.prototype.indexOf的布尔值?,javascript,fabricjs,Javascript,Fabricjs,在Fabric.js中,您可以看到许多地方的代码块都包含在格式的条件检查中: 如果(!Array.prototype.indexOf){}或 if(!Array.prototype.forEach){}等 结果不总是假的吗?为什么要检查方法的布尔值 谢谢。它正在检查该方法是否存在。如果它不存在,它将未定义,因此它将执行!未定义,导致为真 如果垫片不存在,我会假设代码正在引入垫片。它正在检查该方法是否存在。如果它不存在,它将未定义,因此它将执行!未定义,导致为真 如果不存在,我会假设代码引入了一个

在Fabric.js中,您可以看到许多地方的代码块都包含在格式的条件检查中:

如果(!Array.prototype.indexOf){}

if(!Array.prototype.forEach){}

结果不总是假的吗?为什么要检查方法的布尔值


谢谢。

它正在检查该方法是否存在。如果它不存在,它将
未定义
,因此它将执行
!未定义
,导致
为真


如果垫片不存在,我会假设代码正在引入垫片。

它正在检查该方法是否存在。如果它不存在,它将
未定义
,因此它将执行
!未定义
,导致
为真


如果不存在,我会假设代码引入了一个垫片。

如果没有定义函数,这些测试就会通过

旧浏览器没有这些功能。这就是为什么他们要测试他们的存在

(经典)用于定义array.indexOf(适用于版本9之前的IE)的替换函数:

if(!Array.prototype.indexOf){
Array.prototype.indexOf=函数(searchElement/*,fromIndex*/){
“严格使用”;
if(this==null){
抛出新的TypeError();
}
var t=对象(本);
var len=t.length>>>0;
如果(len==0){
返回-1;
}
var n=0;
如果(arguments.length>1){
n=数量(参数[1]);
if(n!=n){//验证是否为NaN的快捷方式
n=0;
}else如果(n!=0&&n!=无穷大&&n!=-无穷大){
n=(n>0 | |-1)*数学地板(数学abs(n));
}
}
如果(n>=len){
返回-1;
}
var k=n>=0?n:Math.max(len-Math.abs(n),0);
对于(;k
未定义函数时,这些测试通过

旧浏览器没有这些功能。这就是为什么他们要测试他们的存在

(经典)用于定义array.indexOf(适用于版本9之前的IE)的替换函数:

if(!Array.prototype.indexOf){
Array.prototype.indexOf=函数(searchElement/*,fromIndex*/){
“严格使用”;
if(this==null){
抛出新的TypeError();
}
var t=对象(本);
var len=t.length>>>0;
如果(len==0){
返回-1;
}
var n=0;
如果(arguments.length>1){
n=数量(参数[1]);
if(n!=n){//验证是否为NaN的快捷方式
n=0;
}else如果(n!=0&&n!=无穷大&&n!=-无穷大){
n=(n>0 | |-1)*数学地板(数学abs(n));
}
}
如果(n>=len){
返回-1;
}
var k=n>=0?n:Math.max(len-Math.abs(n),0);
对于(;k
你了解JavaScript中的真实值吗。@自从你问起,我想我真的不了解。我知道
!!undefined==false
,但在本例中没有建立连接。您了解JavaScript中的truthy值吗。@epascarello我想我不太了解,因为您问了。我知道
!!undefined==false
,但在本例中未建立连接。
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;
    }
}