1、定义
JS里的每一个值都属于一种数据类型
2、数据类型(7种)
- number(数值):整数和小数(比如1和0.1)
- string(字符串):字符组成的文本(比如hello world)
- boolean(布尔值):两个值,true,flase
- symbol(符号,ES6新加)
- object(对象): 各种值的集合
- undefined:“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
- null:空值
所以,JS一切皆对象是大大的错误!明明还有其他6种类型,不能太偏心~
2.1 number
2.1.1 整数和浮点数
JS内部,所有数字都是以64位浮点数形式存储,即使是整数也亦然。
1 === 1.0 // true
2.1.2 数值精度
根据国际标准IEEE 754,JS里64个二进制位,从最左边开始:
第一位:符号位,0是正数,1是负数
2~12位:指数部分 (决定数值的大小)
13~63位:小数部分(决定数值的精度)
2.1.3 数值范围
64位浮点数的指数位共11位,也就是0-2047(2^11 -1),又因正负之分,所以JS 的表示范围就是21024~2-1023(开区间)之中。
如果一个数大于2^1024,JS无法表示这么大的数,发生正向溢出,返回Infinity
如果一个数小于2^-1075(指数部分最小值-1023,再加上小数部分的52位), JS无法表示这么小的数,发生负向溢出,返回0
Math.pow(2,1024) // Infinity
Math.pow(2,-1075) // 0
2.1.4 数值的表示
JS数值有很多种表示方法,如35(十进制),0xFF(十六进制),科学表示法等。
- 二进制:0b 或0B 为前缀的数值
- 八进制:有前缀 0o 或 0O 的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
- 十进制:没有前导0的数值
- 十六进制:前缀为 0x 或 0X 的数值
- 科学计数法:允许字母e或E后面跟一个整数表示数值的指数部分
默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。
0b11 // 3
0o377 // 255
0xff // 255
// 科学计数法
123e3 //123000
123e-3 //0.123
注:以下两种情况,JS会将数值自动转换为科学计数法
- 小数点前数字多于21位
- 小数点后的0多于5个
// 22位
1234567890123456789012
// 1.2345678901234568e+21
// 21位
123456789012345678901
// 123456789012345680000
// 小数点后紧跟5个以上的零,
// 就自动转为科学计数法
0.0000003 // 3e-7
// 否则,就保持原来的字面形式
0.000003 // 0.000003
2.2 string
2.2.1 定义
字符串就是0个或多个排在一起的字符,放在单引号或者双引号之中
'abc'
"abc"
'say "hello" '
"say 'hello'"
// 以上均是合法的表达
想要字符串写在多行中,下图这样就会报错
所以有3种方式
// 方式1 注意\后不可以有空格,否则就会报错
'345\
453\
78';
// 方式2
'123'
+'456'
+'78';
// 方式3
`12345
67890`
// ES6新增加,反引号,且下一行首字母需要顶到头,负责空格也会算进去
// 比如上面这行代码,长度是11,尽管6顶到了头,因为5后面还有一个回车。
我们最常用的是方式2,毕竟只是多打几个引号,方式1那是坑死你不解释啊,不服来看图
第一个和第二个几乎没什么差别,可第一个就是报错了,为什么,因为我加了空格啊,可是几乎看不出来,所以说坑死人不解释啊
2.2.2 转义
反斜杠" \ " 在字符串中有特殊含义,用来表示一些特殊字符,所以又称为转义符
\D : null (\u0000)
\b : 后退键 (\u0008)
\f : 换页符 (\u000C)
\n : 换行符 (\u000A)
\r : 回车键 (\u000D)
\t : 制表符 (\u0009)
\v : 垂直制表符 (\u000B)
' : 单引号 (\u0027)
" : 双引号 (\u0022)
\ : 反斜杠 (\u005c)
后面跟着的\uXXXX 是\u再加上四个十六进制,XXXX对应该字符的 Unicode 码点。
这个怎么用,我们假设想定义一个单引号
很显然报错了,浏览器是这样读的,var a = '' ' ,也就是一对单引号,然后剩下一个不知道干什么的单引号,浏览器不想看到它,当然就报错了。那么我们怎么定义,可以用转义符。
如果定义反斜杠呢?同样是使用转义符就可以
2.2.3 字符串与数组
字符串可被视为字符数组,因此可以用数组的方括号运算符来返回某个位置字符,但切记,字符串与数组相似性仅此而已,它是无法像真正的数组一样改变字符串内的字符。
2.2.4 length
length返回字符串的长度
2.3 boolean
布尔值代表真假两个状态,只有两个值,true和false。
下列运算符会返回布尔值:
- 两元逻辑运算符: && (And),|| (Or)
- 前置逻辑运算符: ! (Not)
- 相等运算符:===,!==,==,!=
- 比较运算符:>,>=,<,<=
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
- undefined
- null
- false
- 0
- NaN
- ""或''(空字符串)
2.4 null和undefined
null是一种类型,它只有一个值null,undefined也是一种类型,它也只有一个值undefined
var a = null
// 几乎等同于
var a = undefined
null和undefined都代表着空值,一无所有,至于为什么要设置两个空值,这跟历史原因有关,现在也可以算bug了,那么这两个的区别在哪里呢?
(1)、(语法)若是一个变量没有赋值,那么js返回undefined
(2)、(惯例) 若是对象object,不想赋值,推荐给null。若是非对象不想赋值,推荐给undefined
undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态.
2.5 object
2.5.1 定义
数值,字符串和布尔值都是最基本数据类型即原始类型(primitive type)的值。
对象是合成类型(complex type)的值,类似于容器,是由多个原始类型(primitive type)值得合成。
// 以下都是原始类型primitive type
var name = 'cxy'
var age = 18
var gender = 'female'
// 以下是对象,合成类型complex type
var person ={
'name':'cxy',
'age':18,
'gender':'female'
}
对象又可以分成三个类型:
- 狭义的对象(object)
- 数组(array)
- 函数(function)
对象是由键值对组成的无序复合数据组合,包含键名和键值,键值对之间用逗号分隔。
var person ={
'name':'cxy',
'age':18,
'gender':'female'
}
如上面代码,大括号定义了一个对象,它被赋值给变量person,所以变量person就指向一个对象。
该对象内部包含3个键值对(又称为3个“成员”):
第一个键值对是name: 'cxy',其中name是“键名”(成员的名称),字符串cxy是“键值”(成员的值)。
键名与键值之间用冒号分隔。
第二个键值对是'age':18,age是键名,18是键值。
两个键值对之间用逗号分隔。
第三个如上。
2.5.2 键名
对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。但是如果不加引号就一定要注意取名要符合标识符规则。否则就会报错。
如果键名是数值,会被自动转为字符串。
2.5.3 表达式还是语句
对象采用大括号表示,这导致了一个问题:如果行首是一个大括号,它到底是表达式还是语句?
{ foo: 123 }
比如上述代码,可能就有两层意思,第一种可能是,这是一个表达式,表示一个包含foo属性的对象;第二种可能是,这是一个语句,表示一个代码区块,里面有一个标签foo,指向表达式123。
为了避免这种歧义,V8 引擎规定,如果行首是大括号,一律解释为对象。不过,为了避免歧义,最好在大括号前加上圆括号。
({ foo: 123})
这种差异在eval
语句(作用是对字符串求值)中反映得最明显。
eval('{foo: 123}') // 123
eval('({foo: 123})') // {foo: 123}
上面代码中,如果没有圆括号,eval
将其理解为一个代码块;加上圆括号以后,就理解成一个对象。
2.5.4 属性的读取
读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。
var obj = {
p: 'Hello World'};
// 以下两种读取方法
obj.p // "Hello World"
obj['p'] // "Hello World"
注:如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。
数值不需要放在引号里,因为会自动转换成字符串
var obj = {
88: 'Hello World'
};
obj['88'] // "Hello World"
obj[88] // "Hello World"
注:数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符。
2.5.5 属性的赋值
点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。
上图中,分别使用点运算符和方括号运算符,对属性赋值。再读取是成功的。
JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。
var obj = { p: 1 };
// 等价于
var obj = {};
obj.p = 1;
2.5.6 属性的查看
查看一个对象本身的所有属性,可以使用Object.keys方法。
2.5.7 in:属性是否存在
存在就返回true,不存在就返回false.
2.5.8 delete
delete命令用于删除对象的属性,删除成功后返回true。
2.5.9遍历 for…in
for...in循环用来遍历一个对象的全部属性。
2.6 typeof 运算符
可以返回一个值的数据类型
至于typeof null会返回object,这主要是历史遗留原因造成的,1995年的JS 语言第一版只有5个类型(object ,整数,浮点数,string , boolean)当时没有考虑null,当做了object的特殊值,现在虽然独立了出来,为了兼容以前代码,typeof null依旧返回object。
参考:阮一峰 侵删~