我目前正在创建一个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)这可能会让我的方法做得非常奇怪。
修改的
为了使事情更清楚:我不希望进行类型转换,传递的变量应该是正确的类型。告诉我的库用户传递的变量类型不正确的最佳方法是什么?
答案 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 === false
但window.__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调试消息也放入其中。