Pim*_*ger 5 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
}
Run Code Online (Sandbox Code Playgroud)
我知道javascript会进行内部类型转换,但这会产生非常奇怪的结果(即'234'+ 5 ='2345'但是'234'*1 = 234)这可能会让我的方法做得非常奇怪.
编辑
为了使事情更清楚:我不希望进行类型转换,传递的变量应该是正确的类型.告诉我的库用户传递的变量类型不正确的最佳方法是什么?
关于类型检查的一些小评论 - 实际上并不那么复杂:
用于typeof检查基元和instanceof检查特定对象类型。
示例:检查字符串
typeof x === 'string'
Run Code Online (Sandbox Code Playgroud)
或者
typeof x === 'string' || x instanceof String
Run Code Online (Sandbox Code Playgroud)
如果你想包含字符串对象。
要检查数组,只需使用
x instanceof Array
Run Code Online (Sandbox Code Playgroud)
这应该工作得相当好(有一些已知的例外 - 例如 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]'.
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |