typeof
typeof运算符会返回操作数类型的字符串表示。主要有两个需要注意的地方:
未定义或未声明的变量将会返回"undefined",比如。如果a没有被声明,那么typeof a将会返回"undefined"。
typeof在操作数是null或函数的种情况下会"撒谎"。
除了这些,操作数和对应的类型字符串可以从下表查出:
我标记“⚠”的两处地方就是上面提到的typeof误导我们的地方:type of null应该返回"Null",而任意函数的类型应该是"object"。
将两边的操作数都转换为数字。"8" - true 会被转换为 8 - 1。的确非常的简单,不过下面的加法可就不是了。
加法是JavaScript中最麻烦的运算符了.让我们看看在执行a + b的时到底发生了什么:
两边的操作数首先被转换成原始值.这里我们称之为A 和 B。
如果有任意一个原始值是字符串,则把另一个也转换成字符串,执行A和B的连接操作并返回连接后的字符串。
否则把A和B都转换为数字返回两个数字的和。
和加法运算符不同小于运算符只在两个操作数都为字符串的时候才将他们作为字符串来比较。下面是正式的操作步骤:
两边的操作数都转换成原始值.这里我们称之为A 和 B。
如果这个两个原始值都为字符串则把A和B按照字符串来比较。
否则将他们都转换位数字按照数字大小比较。
严格相等(===)
许多运算符中最让人省心的一个,也被称为三等号(===),它的操作很简单:检查两个操作数的类型是否相等,如果相等的话,检查他们的值是否相等。他的兄弟运算符(==)就比较复杂了。
JavaScript中最让人讨厌的运算符。它的工作机制是这样的:
首先检查两个操作数的类型,如果他们是相同的类型,那么继续执行严格相等比较。
如果两个操作数都是null或者是undefined返回true。
如果其中一个操作数是字符串另外一个是数字,则将他们都转换数字,再执行严格相等比较。
如果其中一个操作数是布尔值,把它转换成数字,然后回到步骤1继续执行。
如果其中一个操作数是字符串或者数字,另外一个是对象值,把这个对象值转换成原始值,然后回到步骤1继续执行。
返回false。
这基本上意味着,如果两个操作数的类型不同,则判断的工作机制类似于小于<比较,如果类型相同,则类似于严格相等比较。总结一下就是:当类型不同时,将两个操作数都转换为原始值,除非两个原始值都是字符串,否则再次将两个原始值转换成数字再比较,还有就是null == undefined是true。
这六个运算符并不是全部的运算符,但肯定是最麻烦的几个了。