告诉用户我的库函数传递变量的最佳方法是不正确的类型
-
08-07-2019 - |
题
我目前正在创建一个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)这可能会让我的方法做得非常奇怪。
修改的结果, 为了使事情更清楚:我不希望进行类型转换,传递的变量应该是正确的类型。告诉我的库用户传递的变量类型不正确的最佳方法是什么?
解决方案
关于类型检查的一些小评论 - 它实际上并不复杂:
使用 typeof
检查基元,使用 instanceof
检查特定的对象类型。
示例:使用
检查字符串typeof x === 'string'
或
typeof x === 'string' || x instanceof String
如果你想包含字符串对象。
要检查数组,只需使用
x instanceof Array
这应该运行得相当好(有一些已知的例外 - 例如Firefox 3.0.5有一个错误, window instanceof Object === false
虽然 window .__ proto__ instanceof Object == = true
)。
编辑:检测功能对象还存在一些问题:
原则上,您可以使用 typeof func ==='function'
和 func instanceof Function
。
问题在于,在大公司的未命名浏览器中,这些检查会为某些预定义函数返回错误的结果(它们的类型以'object'
的形式给出)。我知道没有解决方法 - 检查只能可靠地用于用户定义的函数......
edit2:从其他窗口/框架传递的对象也存在问题,因为它们将从不同的全局对象继承 - 即 instanceof
将失败。存在内置对象的变通方法:例如,您可以通过 Object.prototype.toString.call(x)==='[object Array]'
检查数组。
其他提示
类型检查的问题在于它实际上很难做到。例如: -
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”)
之后,这种方法在日期和数组中尤为突出。
像jQuery这样的库不会告知用户错误。
如果函数期望一个数字,并且用户传递一个字符串,那么该函数只会返回而不做任何事情。
这样,您就可以避免在网站上弹出JavaScript错误。
PS。只需确保始终键入检查输入的参数,以避免抛出JavaScript错误。
throw
怎么样:
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/扔
另外类型不能很好地区分Array,Null,Object。请看这里的功能: http://javascript.crockford.com/remedial.html ,另外还有其他一些方法可以做到。
我个人不会进行类型检查,因为它只是为代码增加了更多的处理时间。如果您关心性能,则需要尽可能多地缩短处理时间。良好的文档将弥补检查的需要。
在函数启动时将字符串静默转换为numeric数据类型是什么意思?
您始终可以确定'string'的数据类型。不是吗?
您可以检查某些值,例如“debug = 1”组。如果有 - 您可以输出警报之类的错误。所以在开发模式下,用户会看到它们,但在真实网站上,他会将其关闭。同样的方式浏览器也不会显示错误消息 - 您需要查看JS控制台。
还有FireBug。您可以检测到并将FB调试消息也放入其中。