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

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)这可能会让我的方法做得非常奇怪.

编辑
为了使事情更清楚:我不希望进行类型转换,传递的变量应该是正确的类型.告诉我的库用户传递的变量类型不正确的最佳方法是什么?

Chr*_*oph 2

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

用于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 === falsewindow.__proto__ instanceof Object === true

编辑:函数对象的检测还存在一些进一步的问题:

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

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

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