代码之家  ›  专栏  ›  技术社区  ›  Pim Jager

告诉我的库函数的用户传递的变量类型不正确的最佳方法是什么

  •  5
  • Pim Jager  · 技术社区  · 17 年前

    我目前正在创建一个javascript函数库。主要是供我自己使用,但你永远无法确定是否有其他人最终在他们的项目中使用了它,我至少在创建它,就好像这可能发生一样。
    大多数方法只有在传递的变量的数据类型正确时才起作用。现在我的问题是:提醒用户变量类型不正确的最佳方法是什么?应该抛出这样的错误吗?

    function foo(thisShouldBeAString){ //just pretend that this is a method and not a global function
     if(typeof(thisShouldBeAString) === 'string') {
      throw('foo(var), var should be of type string');
     }
     #yadayada
    }
    

    我知道javascript进行内部类型转换,但这会产生非常奇怪的结果(即'234'+5='2345'但'234'*1=234),这可能会使我的方法做非常奇怪的事情。

    编辑

    6 回复  |  直到 17 年前
        1
  •  4
  •   AnthonyWJones    17 年前

    类型检查的问题是它实际上很难做到。例如:-

    var s = new String("Hello World!");
    alert(typeof s);
    

    如果只是提供一个库,则为true)我使用以下一组原型调整:-

    String.prototype.isString = true;
    Number.prototype.isNumber = true;
    Boolean.prototype.isBoolean = true;
    Date.prototype.isDate = true;
    Array.prototype.isArray = true;
    

    因此,常见类型的测试可以简单到:-

    if (x.isString)
    

    if (x != null && x.isString)
    

    除了避免 new String("thing") 明白了,这种方法尤其适用于日期和数组。

        2
  •  2
  •   Christoph    17 年前

    关于类型检查的一些小评论-实际上没有那么复杂:

    使用 typeof 检查原语和 instanceof 检查特定的对象类型。

    示例:检查带有

    typeof x === 'string'
    

    typeof x === 'string' || x instanceof String
    

    如果要包括字符串对象。

    x instanceof Array
    

    这应该可以很好地工作(有一些已知的例外-例如Firefox 3.0.5有一个bug,其中 window instanceof Object === false window.__proto__ instanceof Object === true

    功能对象的检测还存在一些问题:

    原则上,你们两个都可以使用 typeof func === 'function' func instanceof Function

    'object' ).我知道没有解决方法-检查只对用户定义的函数有效。。。

    从其他窗口/框架传递的对象也存在问题,因为它们将从不同的全局对象(即 运算符 将失败。存在内置对象的变通方法:例如,您可以通过 Object.prototype.toString.call(x) === '[object Array]' .

        3
  •  1
  •   Andreas Grech    17 年前

    像jQuery这样的库不会通知用户错误。

    如果一个函数需要一个数字,并且用户传递了一个字符串,那么该函数只返回而不做任何操作。

    这样,您将避免在实时网站上出现JavaScript错误。

        4
  •  1
  •   Andreas Grech    17 年前

    怎么样 throw : https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/throw

    另外,类型不能很好地区分数组、Null和对象。看看这里的函数: http://javascript.crockford.com/remedial.html

    就我个人而言,我不会做类型检查,因为这是一个只会给代码增加更多处理时间的步骤。如果您关心性能,您可能希望尽可能缩短毫秒的处理时间。良好的文件将解决检查的需要。

        5
  •  0
  •   Thevs    17 年前

    您始终可以确定“字符串”的数据类型。你不能吗?

        6
  •  0
  •   Malx    17 年前

    您可以检查一些值,如“debug=1”集。如果有-您可以输出错误,如警报。所以在开发模式下,用户将看到它们,但在真实的站点上,他将关闭它。同样,浏览器不会显示错误消息-您需要查看JS控制台。

    还有萤火虫。您可以检测到这一点,并将FB调试消息也放入其中。