二 数据类型
JavaScript目前总共有7+1
种基本
数据类型…吧(2024.1.28)毕竟JavaScript还在发展;
注意JavaScript是弱类型语言
使用typeof
关键字进行类型检查
console.log(typeof 99); // "number"
console.log(typeof 99n); // "bigint"
console.log(typeof "字符串"); // "string"
2.1 数值(Number)
在JS中所有的整数和浮点树都是Number
类型
JS中的数值并不是无限大的,在超过一定范围后会显示近似值或科学计数法
Infinity
是一个特殊的数值表示无穷
在JS中进行一些精度比较高的运算时要十分注意(ps:经典面试题之0.1+0.2 != 0.3)
NaN
(Not a Number)也是一个特殊的数值,表示非法的数值;是个狠人,用起来他自己都不认识他自己(NaN == NaN =>false)
let a = 10
a = 10.5 // 10.5
a = 999999999999999999999999999999999 // 1e+33
a = 99999 ** 99999 // Infinity
a = Infinity // Infinity
a = 1.11111111111111111111111111111111111111111111 // 1.1111111111111112
a = 0.0000000000000000000000000000000000001 //1e-37
a = 0.1 + 0.2 // 0.30000000000000004
a = 1 - 'a' // NaN
console.log(a);
表达式 | 打印值 | 备注 |
---|---|---|
10.5 | 10.5 | 没什么好说的 |
999999999999999999999999999999999 | 1e+33 | 直接整成科学计数了 |
99999 ** 99999 | Infinity | Infinity 表示无穷大 |
Infinity | Infinity | 同上 |
1.11111111111111111111111111111111111111111111 | 1.1111111111111112 | 近似值 |
0.0000000000000000000000000000000000001 | 1e-37 | 科学计数法 |
0.1 + 0.2 | 0.30000000000000004 | 和二进制、精度、底层实现有关其他语言也有类似问题 |
1 - ‘a’ | NaN | Not a Number |
5-‘3’ | 2 | 隐式类型转换 |
2.1.1 大整数(BigInt)
大整数用来表示一些比较大的数
大整数使用n
来结尾,它可以表示的数字范围是无限大
表达式 | 打印值 | 备注 |
---|---|---|
999999999999999999999999999999999n | 999999999999999999999999999999999n | |
999999999999999999999999999999999 | 1e+33 |
2.1.2 进制表示
-
二进制:
0b
-
八进制:
0o
-
十六进制:
0x
表达式 | 打印值 | 备注 |
---|---|---|
0b1010 | 10 | 二进制转十进制 |
0o10 | 8 | 八进制转十进制 |
0xff | 255 | 十六进制转十进制 |
2.1.3 字符串
在js中使用单引号或者双引号来表示字符串
let str = "Hello world"
let str2 = 'Hello world!'
转义字符:\
转义字符的使用:
表达式 | 打印结果 | 备注 |
---|---|---|
\" | " | |
\’ | ’ | |
\\ | \ | |
\t | 制表符 | |
\n | 换行 |
使用 键盘上左上角那个ESC下面那个东西设置模板字符串 `
let name = "孙悟空"
let str = `他的名字是${name},他有${1+1+1-2}根金箍棒`
console.log(str); // 他的名字是孙悟空,他有1根金箍棒
2.1.4 布尔值(Boolean)
布尔值主要用来进行逻辑判断
布尔值只有两个值 true
和false
console.log(typeof true); // boolean
2.1.5 空值(null)
空值用来表示“空”对象,而不是“空对象”({}这是“空对象”)
使用typeof null
会返回object
即使用typeof无法检查空值
let a = null
console.log(typeof a); // object
2.1.6 未定义(undefined)
当声明一个变量而没有赋值是,他的值就是undefined
let a
console.log(typeof a); // undefined
a = undefined
console.log(undefined); // undefined
可以说,null是给用户使用的而undefined是留给JavaScript用的…吧
2.1.7 Symbol
用来创建一个唯一的标识
使用typeof检查符号时会返回symbol
let a = Symbol()
console.log(typeof a); // symbol
ES6出来的,我现在还不会用
2.1.8 总结
JS中原始值一共有七种
Number
、BigInt
、String
、Boolean
、Null
、Undefined
、Symbol
+1 种object
类型
原始值在JS中是不可变类型,一旦创建就不能修改,只能等垃圾回收;
2.2 类型转换
类型转换指的是将一种数据类型转换为其他类型,如:1 -> “1”, “13” -> 13
2.2.1 字符串
1. toString()
- 调用
toString()
方法将其他类型转换为字符串
null 和 undefined 中没有toString()方法,所以调用时会报错
console.log(null.toString());
//Cannot read properties of null (reading 'toString')
let a = 100
console.log("number转换成字符串",a.toString(),typeof a.toString());
a = 999n
console.log("BigInt转换成字符串",a.toString(),typeof a.toString());
a = true
console.log("Boolean转换成字符串",a.toString(),typeof a.toString());
a = Symbol()
console.log("Symbol转换成字符串",a.toString(),typeof a.toString());
// 执行结果:
// number转换成字符串 “100” string
// BigInt转换成字符串 “999” string
// Boolean转换成字符串 “true” string
// Symbol转换成字符串 “Symbol()” string
100.000 转换成字符串会变成"100"
100.23 转换成字符串还是”100.23“
2. String()
调用String()函数将其他类型转换为字符串
原理:
对于拥有toString() 方法的值调用String()函数时,实际上就是在调用toString()方法
对于null和undefined这两个没有toString()方法的类型,则直接转换成“null”和“undefined”
更加灵活
a = null
console.log("Symbol转换成字符串",String(a),typeof String(a));
a = undefined
console.log("Symbol转换成字符串",String(a),typeof String(a));
// 执行结果
// Symbol转换成字符串 “null” string
// Symbol转换成字符串 “undefined” string
2.2.2 数值
将其他数据类型转换为数值
2.2.2.1 Number() 函数
使用Number()函数来将其他类型转换为数值
字符串转换规则如下:
- 如果字符串是一个
合法
的数字,则会自动转换为对应的数字
a = "100"
console.log(Number(a),typeof Number(a)); // 100 number
- 如果字符串
不是合法
数字,则转换为NaN
a = "100n"
console.log(Number(a),typeof Number(a)); // NaN number
- 如果字符串是
空串
或纯空格
的字符串,则转换成0
a = ""
console.log(Number(a),typeof Number(a)); // 0 number
a = " "
console.log(Number(a),typeof Number(a)); // 0 number
布尔值转换规则如下:
- true转换成1,
let a = true
console.log(Number(a),typeof Number(a)); // 1 number
- false转换成0
a = false
console.log(Number(a),typeof Number(a)); // 0 number
null 转换成0
a = null
console.log(Number(a),typeof Number(a)); // 0 number
undefined 转换成 NaN
a = undefined
console.log(Number(a),typeof Number(a)); // NaN number
2.2.2.2 parseInt()
将一个字符串转换为一个整数
这个有意思了,他解析的时候从左往右进行,直到碰到第一个不合法的数字
(包括空格、字母、刀乐符、小数点… …)停止解析,返回解析结果。如果你的字符串开头第一个字符就不是数字,则直接返回NaN
比如123a456
let a = "123 456" // 空格
console.log(parseInt(a)); // 123
a = "a13"
console.log(parseInt(a)); // NaN
a = "123a456" // 字母
console.log(parseInt(a)); // 123
a = "123&456" // 刀乐符
console.log(parseInt(a)); // 123
a = "123.456" // 小数点
console.log(parseInt(a)); // 123
因为小数点也不会被视为数字,所以可以用来进行取整。
null
、undefined
、NaN
都会被解析成NaN
2.2.2.3 parseFloat()
因为parseInt()
遇到小数点后停止解析,则其无法完整转换小数,parseFloat()
遇到小数点继续解析
123.456.789
会解析成123.456
,第二个小数点不算
null
、undefined
、NaN
都会被解析成NaN
let a = "123.456"
console.log(parseFloat(a),typeof parseFloat(a)); // 123.456 number
a = "123.456.789"
console.log(parseFloat(a),typeof parseFloat(a)); // 123.456 number
2.2.3 布尔值
将其他类型转换成布尔值
数字类型转换情况:0
和NaN
转换成false
,其他是true;
字符串类型转换情况:空串是false,其余是true;
null 和 undefined都转换false
对象类型会转换为true
总结:
null、undefined、NaN、0、空串都是false,其他是true
console.log(Number(undefined)); // false