在JavaScript中,我应该对函数参数的正确类型有多大的信任?

在JavaScript中,我应该对函数参数的正确类型有多大的信任?,javascript,Javascript,我应该总是使用instanceof和typeof来检查类型吗 addRow : function(rowBefore) { if(rowBefore instanceof Y.PopulateList.makeRow) { this.allRows[row.toString()] = row; row.altered = true; Y.DragAndDrop.addNewDrag(row.rowDiv); node.ins

我应该总是使用instanceof和typeof来检查类型吗

addRow : function(rowBefore) {
    if(rowBefore instanceof Y.PopulateList.makeRow) {
        this.allRows[row.toString()] = row;
        row.altered = true;
        Y.DragAndDrop.addNewDrag(row.rowDiv);
        node.insert(row.rowDiv, 'after');

    }
    else {
        console.log('not adding a makeRow');
    }  
},

或者省略instanceof并相信该参数有效是可以接受的吗?我想知道,因为这是我使用过的唯一一种弱类型语言,所以我对不总是知道所作用对象的类型感到有点不舒服。

默认情况下,只需信任即可。只有在必须快速失败时才检查类型

在JS(以及Ruby、Python和类似的动态类型语言)等语言中,这是非常常见的。通过显式检查类型,您的函数变得不那么通用,因此也就没有那么有用了

举例来说,
Array.prototype
中的许多标准JS函数虽然设计用于
Array
实例,但有意对其进行编码,以允许传入支持与数组相同操作的任何对象,即使实际上不是
数组
。(在中搜索短语“故意泛型”。

如果您需要某个特定类型的内容,否则它会中断,请检查其类型或强制将其转换为正确的类型。如果值也是一个问题,那么显然,您也应该检查它的值

这实际上取决于你的论点的来源。如果只是您的代码,那么就没有理由检查您的代码是否正确编写了类型。如果它是外部源(即,您正在编写库函数或接受用户输入的函数),那么您应该验证该参数

简单地说,当您有理由认为类型不正确时,请检查类型。否则,只需编写代码,就不会发生类型不匹配


放弃动态类型将使您最终与该语言作斗争,而不是利用它。

正确记录您的代码,其他使用您的代码的开发人员将知道您的函数支持什么类型。如果您没有提供可靠的回退,那么就没有必要检查对象的类型,因为JavaScript将设法自己抛出错误。显然,如果没有数据丢失的危险,最终安全退出程序。

对于所有情况,都没有“正确”的答案。代码是否应检查传入参数的类型取决于许多因素:

  • 错误参数的可能性有多大?如果您是该函数的唯一客户,那么您可以决定您的函数是否需要保护自己不受自己编程错误的影响。如果它只是一个常规网页,而不是该函数所属的一个特别重要的操作,那么可能没有实际理由添加额外的代码,因为您可以确保该函数得到适当的使用并传递适当的数据。另一方面,如果您正在编写一个很多人都会使用的API,并且您的代码成功或遵循记录的错误路径非常重要,那么您很可能希望检查您的参数,以便在出现错误时可以100%以可预测的路径进行操作

  • 如果检测到它是错误的类型,您能做些特别有用的事情吗?如果您只是想更快地使几行代码失败,并且失败的方式与您首先检查类型时没有什么不同,那么尽早检查可能没有任何好处

  • 该参数类型中的错误的后果是什么?如果后果(考虑到该函数试图执行的操作的范围)不是那么重要,那么额外的代码可能也不值得。另一方面,如果您希望完成一个重要的事务,并且您绝对希望尽可能多地保护该操作不受意外错误的影响,那么请务必检查每个参数的类型和范围

  • 数据从何而来?如果数据来自最终用户或您无法控制的外部来源,那么在使用之前,您几乎总是希望检查数据

  • 这段代码会被许多不同的开发人员在很多情况下使用吗?如果会,那么您可能希望尽早失败,并通过适当的错误通知/调试消息,在开发过程中尽早告诉函数的使用者,他们没有传递正确的数据

  • 您是否特别允许在参数列表中的给定点中传递不同类型的数据?javascript中重载函数的一种常见方法是允许同一个函数接受几种不同类型的参数,根据传递的内容执行可能略有不同的操作。例如,jQuery总是这样做。如果要这样做,则必须检查参数类型,以区分允许调用此函数的不同方式。而且,在这样做的过程中,您还可能发现不支持的参数类型

  • 这是一个多低/多高级别的函数?如果这是一个非常低级别的函数,远离原始数据源,那么您可能希望在更高级别上进行类型检查,更接近原始数据源,而不是在函数调用的每个中间级别进行类型检查

  • 性能有多重要?如果此函数的性能非常重要,因为它经常从循环结构中调用,那么您可能需要确保在更高级别上执行任何必要的类型检查,而不是在瓶颈主函数中执行

  • 这个函数的概念应该是严格的还是允许的?根据上下文的性质,一些函数如果尽最大努力生成