在许多第三方图书馆和最佳实践博客/建议等中…常见的语法如下:
1 2 3
| 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实际上是什么,那么==应该足够,而==不必要。
在什么情况下,typeof不会返回字符串文本?即使有一些边缘情况,为什么要对对象、字符串、函数等使用附加类型检查呢?
- 没有任何情况。大多数人只是出于某种原因而极度害怕打字(咳嗽克劳福德)
- @当javascript中的类型转换规则如此武断时,不信任可能是件好事。
- 在这种情况下是真的是类型铸造?typeof运算符是内置的,而不是用户定义的。那么,真正的风险是什么?
- @Eric使用==和typeof没有危险,但是在比较不可靠的值时使用它是有危险的,因为你不会总是得到你期望的答案。
- 当然,但我只是问一下使用typeof时的用法。如果人们只是空白地使用某个IDE将代码中的每一个==更改为==,那么我认为这是错误的。
- @埃里克P这不是"错"。这可能不是绝对必要的,但没有什么不正确的地方。
- @埃里克,我想说最好保持一致。在任何地方使用===有什么问题?
- 最好使用构造函数属性,而不是
- @法尔肯:不,绝对不是。可以重写constructor属性,但typeof始终有效。
- @斯基尔德里克:我想说,在使用==操作符时,学习关于类型强制的规则比说"哇,有点奇怪"并完全避免它要好。
- 真的有多奇怪?其他动态的"无类型"语言,比如python/ruby/php,类型强制是否也被避免了呢?
- @moogoo python和ruby是强类型的,而javascript是弱类型的。它们只是不可比。查看我的编辑了解更多关于它有多奇怪的细节。
- 我宁愿到处使用==和==只在需要的地方使用。使代码更加语义化
回答主要问题-使用typeof和==没有危险。下面是您可能希望使用===的原因。
Crockford的建议是,在许多情况下使用===更安全,并且如果您在某些情况下使用它,最好保持一致并将其用于所有事情。
这种想法是,你可以在每次检查平等性时考虑是使用==还是===,或者你可以养成总是写===的习惯。
用==代替===几乎没有任何理由——如果你与true或false比较,并且你想要强制(例如你想要0或''对false进行评估,那么只需使用if(! empty_str)而不是if(empty_str == false)。
对于那些不了解==的问题的人,在typeof的上下文之外,从好的部分来看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| '' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t
' == 0 // true |
- 不,这不是我问的:我在使用类型运算符时特别问。
- 不应该是'if(empty_str==false)';)
- @Eric我知道,但我要说的是,使用===的原因是为了与您的代码的其余部分保持一致。
- 谢谢。似乎是迄今为止的共识——风格过于需要。
- @Eric很多好的编码实践都是关于样式的。这并不意味着他们是在浪费时间。
- 我完全同意。但与此同时,这种风格似乎是源于对语言实现的不信任。
- @埃里克,我认为这是一种根深蒂固的不信任!类型强制的规则非常奇怪。
- 当然,但在type of中,我们应用的是一个内置的运算符,它声明返回一个特定类型的值,这意味着您不信任该运算符。
- @埃里克,我明白了,但我想说的是,不必说"在……的情况下",而只说"在……的情况下",更容易。
- 嗯,我只是按我所知的方式输入它,而且有一个涉及到的操作符这一事实使它成为一个明确的情况。
- @埃里克,不同的人有不同的笔触!你这样做是完全有道理的;我的回答是,为什么其他人经常用橡皮布覆盖1(0)。
- 当然。谢谢你的回复。我没想到会有人这么快跳上去。
- 应该是if (!empty_str)。
- @Nyuszika-你说得对,谢谢!
If the typeof operator already returns
a string, what's the need to type
check the return value as well? If
typeof(typeof(x)) is always string, no
matter what x actually is, then ==
should be sufficient and ===
unnecessary.
这是主观的。你可以很容易地扭转这种局面,然后问,"当你不期望隐式转换时,为什么要使用=="两者在这里都很好,所以用你感觉更好的表达你的意图。试着在项目中保持一致。
在这种情况下,没有任何理由支持===而不是==,因为这两个操作数都保证是字符串,因此两个操作数都会给出相同的结果。由于==是一个字符较少,我会赞成。
克罗克福德对此的建议是一直使用===,这对初学者是合理的建议,但如果你知道问题(在其他答案中涉及),就毫无意义地偏执。
因为==比==快,因为省略了类型强制。当然,这可能是一个微不足道的差异,但它仍然存在。
- 这不一定是正确的:如果您查看ECMAScript规范中每个运算符需要执行的步骤,在比较同一类型的两个对象(如两个字符串)时,它们实际上是相同的。尝试基准测试。
三重相等运算符主要用于变量类型和值检查(全部在1表达式中),也称为无类型强制的相等。
例子:
1 2 3 4 5 6 7 8
| 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 |
看道格·克罗克福德的《尤伊剧院关于类型强制》。
If the typeof operator already returns
a string, what's the need to type
check the return value as well? If
typeof(typeof(x)) is always string, no
matter what x actually is, then ==
should be sufficient and ===
unnecessary.
不使用typeof的最有效原因是浏览器之间的类型强制(解释)。有些浏览器可以将6=="6"作为真的传递,而有些浏览器则不会传递(取决于JS解释器的严格性),因此通过引入类型强制可以澄清这一点。此外,它会带来"面向对象"的方法,因为JavaScript的变量不是基于类型的变量(即,变量类型在Java中没有在编译时声明)。
例如,在爪哇,这将失败:
1
| if ("6" instanceof Number) { // false |
希望我回答了你的问题。
- 再说一遍-不是我问的。
- 哎呀……对不起,永远不要把你的问题看得很清楚……正在更新……
- 不,我特别询问涉及使用类型运算符的情况。typeof 6应始终返回字符串文字"number",因此不必进行类型检查"typeof 6"。
- 嗯,typeof取决于浏览器如何解释变量或值……所以您的typeof可以在一个浏览器上工作,而在另一个浏览器上失败(典型的情况是IE)。大多数JS开发人员需要一个运行在所有兄弟上的库,对每个浏览器的了解最少。因此,完全使用语言而不必学习每个浏览器工具,会有所帮助。
- 例如,typeof不返回字符串?
- @绅士:typeof在浏览器中实现一致。你有一个在浏览器之间工作方式不同的例子吗?
- 我同意typeof在浏览器中是一致的。我要说的是,执行typeof需要您知道类型(这并不能保证每个类型对所有浏览器都有效)。这就是我想说的。
- 我非常怀疑是否有任何javascript解释器会将6=="6"评估为false。