想要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原。编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系。JavaScript就是把数据和代码都简化到最原始的程度。
JavaScript中的数据是很简单的。简单数据只有undefined、null、boolean、number和string这5种,而复杂数据只有一种,也就是object。
JavaScript中的代码只体现为一种形式,那就是function。
注意:以上单词均为小写的,不要和Number、String、Object、Function等JavaScript内置函数混淆了。
在JavaScript中,我们可以使用typeof运算符,来获取元素的类型。由于typeof是运算符,因此,在JavaScript中有两种等价的写法。
1 typeof x 2 typeof(x)
typeof(x)运算后的结果是一个string类型的值。
1 typeof 123 //结果是number 2 typeof true //结果是boolean 3 typeof "i love javascript" //结果是string 4 typeof(undefined) //结果是undifined 5 typeof(null) //结果是object,但是null并非object,具有null值得变量也并非object 6 typeof(NaN) //结果是number 7 typeof(infinity) //结果是number
先来说说简单数据类型吧。
undefined | 代表一切未知事物,啥都没有,无法想象,代码也就无法处理了。 |
null | 有那么一个概念,但没有东西。无中似有,有中似无。虽难以想象,但已经可以用代码来处理了。 |
boolean | 是就是,非就非,没有疑义。对就对,错就错,绝对明确。既能被代码处理,也可以控制代码流程。 |
number | 线性的事物,大小和次序分明,多而不乱。便于代码进行批量处理,也控制代码的迭代和循环等。 |
string | 面向人类的理性事物,而不是机器信号。人机信息沟通,代码据此理解人的意图等功能,都靠他了。 |
在JavaScript中,为了进一步简化代码,JavaScript还在这些简单数据上,再规定了一些特殊的含义。这些含义可以使得JavaScript的语句写的更简洁。但是这些特殊含义有时候也会给我们设下难以琢磨的陷阱。
例如:undefined、null、""、0这四个值转换为逻辑值后都是false。除了这四个家伙,再加上false本身之外,其他任何东西(包括简单类型值、所有对象和函数)转换成逻辑值都是true。然而有趣的是undefined、null、""、0、false这五个家伙中,除了undefined == null,其他的他们却又互不相等。使用这些规定,我们可以编写出更简洁的逻辑判断语句。
再比如:完全有数字组成的字符串与该字符串表示的值是相等的。也就是说
1 "123" == 123 //结果是true
但是
1 0123 != "0123" //结果是false
这又是为什么呢?
因为,在JavaScript中,JavaScript引擎将"0"开头的整数常量当作是八进制数处理,所以0123其实是个八进制数。然而"0123"是按照十进制来转换成数值的,自然就不会想等了。
那么,如果我们不想让"123" == 123该怎么办呢?对了,JavaScript提供了一个"==="的运算符,那就是全等运算符。它的含义是不但这两个变量的值需要想等,这两个变量的数据类型也必须相同。也就是说
1 typeof(123 === "123") //结果是false
由此,我们引申出了另一个运算符,那就是"!==",他就是不全等运算符。
注意:"不全等"与"全不等"是两个概念哦。
"!=="这种不全等表示为以下这样的等价逻辑
1 A != B || typeof A != typeof B
然而,全不等表示的等价逻辑应该是
1 A != B && typeof(A) != typeof(B)
不过,在编写程序时,基本上遇不到"全不等"这样的判断,因此JavaScript也就没有专门的运算符了。
所谓简单类型都不是对象,JavaScript没有将对象化的能力赋予这些简单类型。直接被赋予简单类型的常量值得标识符、变量和参数都不是一个对象。
所谓对象话能力,就是可以将数据和代码组织成复杂结构的能力。JavaScript中只有object类型和function类您贵姓提供了对象化的能力。
文章声明:本文部分内容参考自《悟透JavaScript》,这是一本学习JavaScript非常好的书。