2011-08-16 23 views
1

我看到有很多不同的方法来检查JavaScript中var的typeof。在Javascript中检查仅使用typeof运算符的类型不好?

但是使用操作符的类型看起来比其他方式更简单 - 例如 例如,

if(typeof someVar == typeof "") 

if(typeof someVar == typeof []) 


function myFunc() {} 

if(typeof someVar == typeof myFunc) 

这样做甚至是有效的或非常糟糕的做法吗?为什么?

谢谢。

回答

2

typeof完全可以使用,但不适用于一般类型检查。这不是它的目的。

typeof [] == "object" 

它只能"object""function""undefined"和基元"boolean""number""string"之间进行区分。要进行更多高级检查,您需要使用instanceof或更复杂的检查。

[] instanceof Array // works reliably only if there's a single frame 
toString.call([]) == "[object Array]" // always works, but only with some types. 
+0

时如果您有多个窗口对象(例如在i /帧中),'instanceof Array'测试将不起作用。那就是'window.frames [0] .Array ==这就是window.frames [1] .Array'返回false –

+0

@JuanMendes:哎呀!我的意思是说,但似乎让我的文章中出现了一些词语。编辑。 –

0

如果需要检查,如果这两个值和类型都一样,你可以使用===比较操作;但是,如果您只需检查类型,则最适合使用instanceof

+0

请不要添加到w3schools问题http://w3fools.com –

+0

虽然我同意你的看法,但这并不意味着w3schools上的所有内容都是不准确的。它可以是一个有用的资源,就像StackOverflow一样。 –

+0

大多数网站开发人员不同意你的说法诺曼,可能在那里有一些准确的信息,但为什么你会一直提到一个网站,他们的描述很sl and,例子使得编码风格长期存在。 –

2

typeof的一个主要问题是,如果使用构造函数创建这些对象,它将不会返回“string”,“boolean”,“number”。看看字符串

typeof "my-string" // "string" 
typeof String('my-string') // 'string' 
typeof new String("my-string") // "object". 

因此本例中的测试,测试参数或变量是否是字符串,布尔值,数字,你需要使用Object.prototype.toString返回一致的结果

function isString(obj) { 
    return Object.prototype.toString.call(obj) == "[object String]"; 
} 
相关问题