简单来说,js里面有七大数据类型,也就是number,string,boolean,symbol,null,undefined,object,在这七类中,前六类我们一般称为简单类型,而最后一类(object),我们称为复杂类型。
众所周知,js由Branden Eich发明,这位兄弟在设计js时,由于本人比较擅长scheme,所以当老板告诉他要写的跟Java语法类似,他的心态崩了。老兄花了十天时间就设计完了js,因此,存在许多逻辑上的bug,毕竟时间很短嘛,可以理解。接下来让我们对七大类型进行逐个研究和探讨:
1.Number
JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。根据国际标准 IEEE 754,JavaScript 浮点数的64个二进制位,从最左边开始,是这样组成的。
第1位:符号位,0表示正数,1表示负数
第2位到第12位(共11位):指数部分
第13位到第64位(共52位):小数部分(即有效数字)
符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。
指数部分一共有11个二进制位,因此大小范围就是0到2047。IEEE 754 规定,如果指数部分的值在0到2047之间(不含两个端点),那么有效数字的第一位默认总是1,不保存在64位浮点数之中。也就是说,有效数字这时总是1.xx...xx的形式,其中xx..xx的部分保存在64位浮点数之中,最长可能为52位。因此,JavaScript 提供的有效数字最长为53个二进制位。
由于JavaScript的创立时候,Unicode编码还没有大行其道,于是,js有自己的一套运行体系,这就造成了小数运算会出现一定的问题。所以涉及到小数的时候,要特别小心,最好先化为整数。
js中表示数的方法很多:比如 0.1 可以写成 (.1),科学计数法表达时我们一般写成(2.1e2),他就等于210
二进制的表述方法:0b110(6) 十六进制0x11(17) 八进制011(9)
特别注意因为八进制以0开头的,所以保存电话号码的时候,最好要字符串"0575-74933445"
2.String
字符串就是()零个或多个排在一起的字符,放在单引号或双引号之中。(这两种都可以"abc" === 'abc')
那么我们遇到一些(" , ')这些符号时怎么办?我们可以采用转义符来解决。
如果要用上转义符号自己呢?那就两次转义呗(\\)
字符串中,有时需要换行来写,总共有三种方法:
1.var a = "acs\
cscs"
2.var a = "acs" +
"cscs" (这种是我们推荐的)
3.var a = `acs
cscs`
3.Boolean
boolean的发明者是George Boole,这位兄弟的故事比较奇葩,有兴趣点这里George Boole
boolean类型比较少,只有两种,true 和 false
在表示这两种逻辑方式的时候,下列运算符会返回布尔值:
两元逻辑运算符: && (And),|| (Or)
前置逻辑运算符: ! (Not)
相等运算符:===,!==,==,!=
比较运算符:>,>=,<,<=
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值
转换规则是除了下面六个值被转为false,其他值都视为true。
1.undefined 2.null 3.false 4. 0 5.NaN 6.""或''(空字符串)
4.Symbol(这个是ES6新增的,暂时不涉及)
5.null 6.undefined
这两位兄弟是js特色,其他都只有一个null
一般来说,对这二位有如下规定:
1.如果一个变量没有赋值 ---- undefined
2.如果有一个对象,但是我们目前不想赋值 ----- null
如果是一个非对象,那我们用 ----- undefined
7.Object
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
我们一般如此定义一个对象
特别说明,function和array也是对象的一种,他们是特殊的对象
有趣的是,每个我们定义的变量,自身会携带一个 __proto__ 属性指向 Object.prototype ,他叫做对象的原型,这个我们下次再说
有一点要记住,简单类型在内存中的存储都是键值对的形式存储的,而复杂类型存的键值对是一个地址,他指向堆内存的某个对象。我们可以把简单类型和复杂类型区分为士兵和兵团的区别,假设var a 是一个战场,我们可以派一个士兵(number),一辆坦克(string),一架飞机(Boolean),但是我们对于军团,则必须把军团打包成一个团,我们必须给他一个番号,然后把他部署在那里。js也是一样,遇到比较多的number,string这些的时候,就把他们打包成一个团,然后给这团一个番号(坐标),然后才能赋值
对对象中是否存在某元素 ,我们可以使用语法 "xxx" in object
将某个元素从对象中删去,我们可以用语法delete,用for(var key in Object) 来遍历数组
对这七大类型。我们可以用typeof函数来检验元素
特别值得注意的是 typeof null 的值为object,而typeof function 的值为function