2010-09-27 92 views
22

全国各地的许多第三方库和最佳实践的博客/建议,等等...这是经常可以看到的语法是这样的:在Javascript中使用===而不是== typeof的原因是什么?

typeof x === 'object' (instead of typeof x == 'object') 
typeof y === 'string' (instead of typeof x == 'string') 
typeof z === 'function' (instead of typeof x == 'function') 

如果typeof操作已经返回一个字符串,什么是对类型检查的必要性返回值呢?如果typeof运算(typeof运算(X))总是,无论什么实际X是,那么==应该是足够的和===不必要的。

在什么情况下会输入而不是返回字符串?即使存在一些附带案例,为什么附加类型检查用于对象,字符串,函数等...

+7

没有任何情况。大多数人只是因为某种原因而死于类型转换(* cough * Crockford) – MooGoo 2010-09-27 13:02:07

+3

@MooGoo当JavaScript中的类型转换规则如此随意时,不信任它可能是件好事。 – Skilldrick 2010-09-27 13:07:21

+0

在这种情况下真的是类型铸造? typeof运算符是内置的,而不是用户定义的。那么,真正的风险是什么? – 2010-09-27 13:09:01

回答

19

要回答主要问题 - 使用typeof==没有任何危险。以下是您为什么想要使用===的原因。


从克罗克福德的建议是,它的安全在许多情况下使用===,而如果你打算在某些情况下使用它,最好是一致的,并用它的一切。

这个想法是,你可以考虑每次检查平等时是否使用=====,或者你可以养成总是写作===的习惯。

有几乎没有使用过==一个===原因 - 如果你比较truefalse,你想强迫(比如你要0'',以评估false)就用if(! empty_str)而非if(empty_str == false)


对于那些谁不明白==之外的typeof的背景下存在的问题,看到这一点,从The Good Parts

'' == '0'   // false 
0 == ''   // true 
0 == '0'   // true 

false == 'false' // false 
false == '0'  // true 

false == undefined // false 
false == null  // false 
null == undefined // true 

' \t\r\n ' == 0 // true 
+2

不,这不是我问的问题:我特别要求使用typeof运算符。 – 2010-09-27 13:07:10

+0

不应该是'if(empty_str === false)';) – 2010-09-27 13:07:12

+3

@Eric我知道,但我所说的是使用'==='的原因是为了与您的其他代码保持一致。 – Skilldrick 2010-09-27 13:08:51

5

如果typeof运算符已经返回 一个字符串,有什么需要输入 检查返回值?如果 typeof(typeof(x))始终是字符串,则没有 与x实际是什么关系,那么== 应该足够,并且不需要=== 。

这是主观的。您可以轻松地将其转换,然后询问:“当您不期望隐式转换时,为什么要使用==?”两者在这里都能很好地工作,所以用你觉得更好的表达你的意图。尝试在项目中保持一致。

+1

谢谢。似乎是迄今为止的共识 - 风格超过需求。 – 2010-09-27 13:19:29

0

三等分运算符主要用于变量类型和值检查(all in 1表达式),也称为没有类型强制的等于

实施例:

var a = 1; 
var b = 1; 
var c = "1"; 
var d = "1"; 

alert (a === b); //True, same value and same type (numeric) 
alert(c === d); //True, same value and same type (string) 
alert(b === c); //False, different type but same value of 1 

参见道格克罗克福德上的类型强制的YUI Theater


如果typeof运算符已经返回 一个字符串,什么是输入 检查返回值,以及需要?如果 typeof(typeof(x))始终是字符串,则没有 与x实际是什么关系,那么== 应该足够,并且不需要=== 。

不使用typeof而是使用===运算符的最有效的原因是用于浏览器之间的类型强制(解释)。有些浏览器可以通过6=="6"为真,有些浏览器不会(取决于JS解释器的严格性),所以通过引入类型强制来澄清这一点。 另外,由于JavasScript的变量不是基于类型的变量(即,变量类型不像在Java中那样在编译时声明),所以它会带来“面向对象”方法。

E.g.在Java中,这将失败:

if ("6" instanceof Number) { // false 

希望我回答了您的问题。

+0

再次 - 不是我问。 – 2010-09-27 13:12:22

+0

糟糕...抱歉,从未完全读过您的问题......正在更新.... – 2010-09-27 13:15:04

+0

不,我在涉及使用typeof运算符的情况下特别提出要求。 typeof 6应该总是返回字符串字符串“number”,因此检查“typeof 6”的类型不应该是必需的。 – 2010-09-27 13:29:26

2

在这种情况下,没有任何理由支持===而不是==,因为两个操作数都保证是字符串,因此两个操作符都会给出相同的结果。由于==少了一个字符,我会赞成这一点。

克罗克福德对此的建议是始终使用===,这对于初学者来说是合理的建议,但如果你知道这些问题(在其他答案中已经涵盖),这是毫无意义的偏执。

+0

谢谢。似乎是迄今为止的共识 - 风格超过需求。 – 2010-09-27 13:30:07

1

因为===比==快,因为省略了类型强制。 当然,它可能是一个可以忽略的差异,但它仍然存在。

+4

这不一定是正确的:如果您查看每个运算符在ECMAScript规范中需要采取的步骤,那么在比较两个相同类型的对象(如两个字符串)的情况下,它们实际上是相同的。尝试基准化它。 – 2010-09-28 08:58:07

相关问题