javascript - 在 JavaScript 中,我应该对函数参数是正确类型的信任度有多少?

标签 javascript

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

7年前关闭。




Improve this question




我应该总是使用 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并相信论点有效是否可以接受?我想知道,因为这是我唯一使用过的弱类型语言,所以我对不总是知道正在处理的对象的类型感到有点不舒服。

最佳答案

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

  • 错误论证的可能性有多大? 如果您是该功能的唯一客户,那么您可以决定您的功能是否需要保护自己免受您自己的编程错误的影响。如果它只是一个常规网页,而不是该函数所属的特别重要的操作,那么可能没有实际理由添加额外的代码,因为您可以控制确保正确使用该函数并传递适当的数据。另一方面,如果您正在编写一个很多人会使用的 API,并且您的代码成功或遵循记录的错误路径非常重要,那么您很可能希望检查您的参数,以便您可以采取行动如果传递错误,则 100% 可预测路径..
  • 如果你发现它是错误的类型,你能做任何特别有用的事情吗? 如果您只是要更快地失败几行代码并且失败的方式与您首先检查类型时没有什么不同,那么早点检查它可能没有任何好处。
  • 该论证类型错误的后果是什么? 如果结果(考虑到这个函数试图做的范围)不是那么重要,那么额外的代码可能不值得。另一方面,如果您希望完成一个重要的事务,并且您绝对希望尽可能多地保护该操作免受意外错误的影响,那么一定要检查每个参数的类型和范围。
  • 数据来自哪里? 如果数据来自最终用户或您无法控制的某些外部来源,那么您几乎总是希望在使用它之前对其进行检查。
  • 这段代码会被很多不同的开发人员在很多情况下使用吗? 如果是这样,那么您可能希望尽早失败并使用适当的错误通知/调试消息在开发过程中尽早告诉函数的使用者他们没有传递正确的数据。
  • 您是否特别允许在参数列表中的给定位置传递不同类型的数据? 在 javascript 中重载函数的一种常见方法是允许同一个函数接受几种不同类型的参数,以便根据传递的内容执行略有不同的事情。例如,jQuery 一直都是这样做的。如果您这样做,那么您将不得不检查参数类型,以区分允许调用此函数的不同方式。而且,这样做时,您也可能会发现不受支持的参数类型。
  • 这是一个多低/多高的功能? 如果这是一个非常低级的函数,远离原始数据源,那么您可能希望在更接近原始数据源的更高级别进行类型检查,而不是在每个中间函数级别进行类型检查称呼。
  • 性能有多重要? 如果此函数的性能非常重要,因为它经常被调用并且经常从循环结构中调用,那么您可能需要确保在更高级别完成任何必要的类型检查,而不是在您的瓶颈主函数之一中完成.
  • 这个函数的概念应该是严格的还是宽松的? 根据上下文的性质,如果某些函数尽最大努力从给定的任何输入中产生有用的值,则它们会更有用。其他函数只有在它们只做它们应该做的事情而不试图允许有问题的数据被强制转换成有用的东西时才有用。如果您正在计算胰岛素剂量,您真的不希望有任何机会认为输入并不完全符合您的解释。但是,如果您正在计算仅用于临时显示给最终用户的操作的时间估计,您可能只是尽力使用所提供的任何数据。


  • 如果您想为您的普通网页类型提供真正快速的答案,我通常会检查来自外部来源或最终用户的所有数据,并且我会相信来自我自己代码其他部分的数据。显然,中间有许多灰色区域或一些不同类型的代码,这就是我让这些其他因素影响决策的地方。

    关于javascript - 在 JavaScript 中,我应该对函数参数是正确类型的信任度有多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24856883/

    相关文章:

    javascript - 使用 ES6 语法和动态路径导入模块

    javascript - Wijmo 饼图对象引用错误?

    javascript - 正确调用 JQuery 方法

    JavaScript 数组查询

    javascript - 如何在 amchart 中显示特定图例的无值?

    javascript - 以编程方式结束对所有可编辑实例的编辑

    javascript - 通过点击事件获取数据属性

    javascript - 使用javascript去除图像边框

    javascript - 如何在外部元素上设置内部元素边框?

    javascript - Google 图表 - 超过 1 个差异列