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

时间:2009-01-10 13:10:20

标签: javascript typechecking

我目前正在创建一个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 个答案:

答案 0 :(得分:4)

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

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

什么得到警报?答:“对象”。它确实是一个初始化字符串的愚蠢方式,但我经常看到它。我更愿意在必要时尝试转换,或者什么也不做。

在我完全控制的Javascript环境中说过(如果你只是提供一个库,那么 为真)我使用这组原型调整: -

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

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

if (x.isString)

虽然您仍需要注意null / undefined: -

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

除了避免new String("thing")陷阱之外,这种方法在日期和数组中尤为突出。

答案 1 :(得分:2)

关于类型检查的一些小评论 - 它实际上并不复杂:

使用typeof检查基元,instanceof检查特定对象类型。

示例:使用

检查字符串
typeof x === 'string'

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

如果你想包含字符串对象。

要检查数组,只需使用

x instanceof Array

这应该运行得相当好(有一些已知的例外 - 例如Firefox 3.0.5有一个window instanceof Object === falsewindow.__proto__ instanceof Object === true的错误。

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

原则上,您可以使用typeof func === 'function'func instanceof Function

问题在于,在大公司的未命名浏览器中,这些检查会为某些预定义函数返回错误的结果(其类型为'object')。我知道没有解决方法 - 检查只能可靠地用于用户定义的函数......

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

答案 2 :(得分:1)

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

如果函数期望一个数字,并且用户传递一个字符串,那么该函数只会返回而不做任何事情。

这样,您就可以避免在网站上弹出JavaScript错误。

PS。只需确保始终键入检查输入的参数,以避免抛出JavaScript错误。

答案 3 :(得分:1)

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

另外类型不能很好地区分Array,Null,Object。看看这里的功能:http://javascript.crockford.com/remedial.html,还有其他一些方法可以做到。

我个人不会进行类型检查,因为它只是为代码增加了更多的处理时间。如果您关心性能,则需要尽可能多地缩短处理时间。良好的文档将弥补检查的需要。

答案 4 :(得分:0)

在函数启动时将字符串静默转换为numeric数据类型是什么意思?

您始终可以确定'string'的数据类型。不是吗?

答案 5 :(得分:0)

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

还有FireBug。您可以检测到并将FB调试消息也放入其中。