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) // InfinityMath.pow(2,-1075) // 0
2.1.4 数值的表示
JS数值有很多种表示方法,如35(十进制),0xFF(十六进制),科学表示法等。
二进制:0b 或0B 为前缀的数值
八进制:有前缀 0o 或 0O 的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
十进制:没有前导0的数值
十六进制:前缀为 0x 或 0X 的数值
科学计数法:允许字母e或E后面跟一个整数表示数值的指数部分
默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。
0b11 // 30o377 // 2550xff // 255// 科学计数法123e3 //123000123e-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'"// 以上均是合法的表达
想要字符串写在多行中,下图这样就会报错
image
所以有3种方式
// 方式1 注意\后不可以有空格,否则就会报错'345\ 453\ 78';// 方式2'123'+'456'+'78';// 方式3 `12345 67890`// ES6新增加,反引号,且下一行首字母需要顶到头,负责空格也会算进去// 比如上面这行代码,长度是11,尽管6顶到了头,因为5后面还有一个回车。
image
我们最常用的是方式2,毕竟只是多打几个引号,方式1那是坑死你不解释啊,不服来看图
image
第一个和第二个几乎没什么差别,可第一个就是报错了,为什么,因为我加了空格啊,可是几乎看不出来,所以说坑死人不解释啊
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 码点。
这个怎么用,我们假设想定义一个单引号
image
很显然报错了,浏览器是这样读的,var a = '' ' ,也就是一对单引号,然后剩下一个不知道干什么的单引号,浏览器不想看到它,当然就报错了。那么我们怎么定义,可以用转义符。
image
如果定义反斜杠呢?同样是使用转义符就可以
image
2.2.3 字符串与数组
字符串可被视为字符数组,因此可以用数组的方括号运算符来返回某个位置字符,但切记,字符串与数组相似性仅此而已,它是无法像真正的数组一样改变字符串内的字符。
image
2.2.4 length
length返回字符串的长度
image
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 typevar name = 'cxy'var age = 18var gender = 'female'// 以下是对象,合成类型complex typevar 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 值也可以作为键名),所以加不加引号都可以。但是如果不加引号就一定要注意取名要符合标识符规则。否则就会报错。
如果键名是数值,会被自动转为字符串。
image
2.5.3 表达式还是语句
对象采用大括号表示,这导致了一个问题:如果行首是一个大括号,它到底是表达式还是语句?
{ foo: 123 }
比如上述代码,可能就有两层意思,第一种可能是,这是一个表达式,表示一个包含foo属性的对象;第二种可能是,这是一个语句,表示一个代码区块,里面有一个标签foo,指向表达式123。
为了避免这种歧义,V8 引擎规定,如果行首是大括号,一律解释为对象。不过,为了避免歧义,最好在大括号前加上圆括号。
({ foo: 123})
这种差异在eval
语句(作用是对字符串求值)中反映得最明显。
eval('{foo: 123}') // 123eval('({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"
作者:饥人谷_陈杨
链接:https://www.jianshu.com/p/581c44e11d71