JS的历史和基本语法看阮一峰教程入门篇,这里不做赘述,本篇主要为js的数据类型。JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有七种。
- 数值(number):整数和小数(比如
1
和3.14
) - 字符串(string):文本(比如
Hello World
)。 - 布尔值(boolean):表示真伪的两个特殊值,即
true
(真)和false
(假) -
undefined
:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值 -
null
:表示空值,即此处的值为空。 - 对象(object):各种值组成的集合。
- symbol(符号,ES6新加,本次暂不讨论)。
- 最新增加 BigInt类型,是 JavaScript 中的一个新的数字基本(primitive)类型,可以用任意精度表示整数。使用
BigInt
可以安全地存储和操作大整数,即使这个数已经超出了Number
能够表示的安全整数范围。感谢评论指出。
number
1.整数和浮点数
JS内部,所有数字都是以64位浮点数形式存储,即使是整数也亦然。
1 === 1.0 // true
2.数值精度
根据国际标准IEEE 754,JS里64个二进制位,从最左边开始:
第一位:符号位,0是正数,1是负数
2~12位:指数部分 (决定数值的大小)
13~63位:小数部分(决定数值的精度)
3 .数值范围
64位浮点数的指数位共11位,也就是0-2047(2^11 -1),又因正负之分,所以JS 的表示范围就是2^1024~2^-1023(开区间)之中。
如果一个数大于2^1024,JS无法表示这么大的数,发生正向溢出,返回Infinity
如果一个数小于2^-1075(指数部分最小值-1023,再加上小数部分的52位), JS无法表示这么小的数,发生负向溢出,返回0
Math.pow(2,1024) // Infinity Math.pow(2,-1075) // 0
4 .数值的表示
JS数值有很多种表示方法,如35(十进制),0xFF(十六进制),科学表示法等。
- 二进制:0b 或0B 为前缀的数值
- 八进制:有前缀 0o 或 0O 的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
- 十进制:没有前导0的数值
- 十六进制:前缀为 0x 或 0X 的数值
- 科学计数法:允许字母e或E后面跟一个整数表示数值的指数部分
默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。
注:以下两种情况,JS会将数值自动转换为科学计数法
- 小数点前数字多于21位
- 小数点后的0多于5个
- 否则,就保持原来的字面形式
string
字符串就是0个或多个排在一起的字符,放在单引号或者双引号之中
'你','abc',"你" //合法字符串
"" // 空字符串,长度为0
" "//里面为空格的字符串,长度为2,但不是两个字符
想要字符串写在多行中,
// 方式1 注意后不可以有空格,否则就会报错
'345
453
78';
// 方式2
'123'
+'456'
+'78';
// 方式3
`12345
67890`
// ES6新增加,反引号,且下一行首字母需要顶到头,负责空格也会算进去
// 比如上面这行代码,长度是11,尽管6顶到了头,因为5后面还有一个回车。
反斜杠" " 在字符串中有特殊含义,用来表示一些特殊字符,所以又称为转义符,我们假设想定义一个单引号,如果直接写'''的话,浏览器是这样读的, '' ' ,也就是一对单引号,然后剩下一个不知道干什么的单引号。那么我们怎么定义,可以用转义符。
D : null (u0000)
b : 后退键 (u0008)
f : 换页符 (u000C)
n : 换行符 (u000A)
r : 回车键 (u000D)
t : 制表符 (u0009)
v : 垂直制表符 (u000B)
' : 单引号 (u0027)
" : 双引号 (u0022)
: 反斜杠 (u005c)
后面跟着的uXXXX 是u再加上四个十六进制,XXXX对应该字符的 Unicode 码点。
字符串可被视为字符数组,因此可以用数组的方括号运算符来返回某个位置字符,但切记,字符串与数组相似性仅此而已,它是无法像真正的数组一样改变字符串内的字符。当然,字符串也有属性length。
boolean
乔治·布尔是英格兰数学家和哲学家、数理逻辑学先驱。
由于其在符号逻辑运算中的特殊贡献,很多计算机语言中将逻辑运算称为布尔运算,将其结果称为布尔值。
布尔值只有两个值:true 和 false
下列运算符会返回布尔值:
- 两元逻辑运算符: && (And),|| (Or)
- 前置逻辑运算符: ! (Not)
- 相等运算符:===,!==,==,!=
- 比较运算符:>,>=,<,<=
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
- undefined
- null
- false
- 0
- NaN
- ""或''(空字符串)
a && b 在 a 和 b 都为 true 时,取值为 true;否则为 false
a || b 在 a 和 b 都为 false 时,取值为 false;否则为 true
undefined 和 null
都表示没有值,至于 JS 为什么有两个表示「没有值」的东西
- (规范)如果一个变量没有被赋值,那么这个变量的值就是 undefined
- (习俗)如果你想表示一个还没赋值的对象,就用 null。如果你想表示一个还没赋值的字符串/数字/布尔/symbol,就用 undefined(但是实际上你直接 var xxx 一下就行了,不用写 var xxx = undefined)
所以typeof undefined的返回值是undefined,typeof null是object。
object
- object 就是上面几种基本类型(无序地)组合在一起
- object 里面可以有 object ,var person = { name: 'Frank', 'child': { name: 'Jack' }, // 最后这个逗号可有可无 }
- object 的 key 一律是字符串,不存在其他类型的 key
- object[''] 是合法的
- object['key'] 可以写作 object.key
- 注意 object.key 与
object[key]
不同 - delete object['key']
- 'key' in object
- for in 遍历对象
对象是由键值对组成的无序复合数据组合,包含键名和键值,键值对之间用逗号分隔。对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。但是如果不加引号就一定要注意取名要符合标识符规则。否则就会报错。如果键名是数值,会被自动转为字符串。
1.属性的读取
读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。
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. 属性的赋值
点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。
JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。
var obj = { p: 1 }; // 等价于 var obj = {}; obj.p = 1;3. 属性的查看
查看一个对象本身的所有属性,可以使用Object.keys方法。
4.in:属性是否存在
存在就返回true,不存在就返回false.
5.delete
delete命令用于删除对象的属性,删除成功后返回true。
6.遍历 for…in
for...in循环用来遍历一个对象的全部属性。
typeof
可以返回一个值的数据类型