网站建设好后打开是目录文件河北省建筑信息平台
Javascript的数据类型
- 1.基本数据类型
- 1.1七种基本数据类型
- 1.2单独说说BigInt
- 1.3其它注意点
- 2.引用数据类型
- 3.基本数据类型和引用数据类型的区别
- 4.双等于号和三等于号的区别
- 5.Javascript的类型转换机制
- 5.1显示转换(强制转换)
- 5.2隐式转换
- (1)减、乘、除
- (2)加(加法要区别算,因为+不仅仅是加法,还可以拼接)
- (3)单个变量
- (4)ToPrimitive原则
JavaScript主要有两种类型:基本数据类型和复杂数据类型(引用数据类型)。
1.基本数据类型
1.1七种基本数据类型
- Boolean:表示逻辑值,只有两个值:true 和 false。
- Number:表示数值,可以是整数或浮点数。
- String:表示文本数据,用引号括起来。
- Undefined:表示未定义的值。
- Null:表示空值,通常用于表示对象不存在或没有初始化。
- Symbol(ES6 引入):一种唯一的、不可变的数据类型,通常用于作为对象属性的标识符。
- BigInt(ES6 引入):表示大整数,用于处理超出普通数字范围的值。
1.2单独说说BigInt
在 JavaScript 中,最大的安全整数是 2 的 53 次方减 1,即 Number.MAX_SAFE_INTEGER,其值为 9007199254740991。这是因为 JavaScript 中使用双精度浮点数表示数字,双精度浮点数的符号位占 1 位,指数位占 11 位,尾数位占 52 位,因此能够准确表示的整数范围是有限的。超过这个范围的整数可能会失去精度。
//超过了2**53-1后精度会缺失
console.log(2 ** 53 - 1); //9007199254740991
console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(2 ** 53); //9007199254740992
console.log(2 ** 53 + 1); //9007199254740992
console.log(2 ** 53 + 2); //9007199254740994
console.log(2 ** 53 + 3); //9007199254740996
console.log(2 ** 53 + 4); //9007199254740996

BigInt 是 JavaScript 中引入的一种新的数据类型,用于表示任意精度的整数。与普通的数字类型不同,BigInt 可以表示超出 Number.MAX_SAFE_INTEGER 的整数值,因此它可以用于处理非常大的整数,而不会丢失精度。
要创建 BigInt,可以在整数值后面添加 n 或调用 BigInt() 函数并将整数作为参数传递。
console.log(5648941287894651132156549781132n);
console.log(BigInt("5648941287894651132156549781132"));

Biglnt不能和普通的数字进行混合运算,只能使用Biglnt类型进行运算。
console.log(10000n + 10000n); //20000n
console.log(45612316546871512315645487n * 312121100n); //14236566414157737982622816612475700n
console.log(45612316546871512315645487 * 312121100n);//报错
比较运算符:
console.log(20n > 15); //true
console.log(20n === 20); //===不会做强制类型转换,false
console.log(typeof 20n); //类型为bigint
console.log(20n == "20"); //==不会严格比较,true
1.3其它注意点
console.log(typeof NaN); //number
console.log(typeof null); //object
console.log(undefined == null); //true
console.log(undefined === null); //false
2.引用数据类型
- Object
- Array
- Function
- RegExp
- Date
- Map
- Set
3.基本数据类型和引用数据类型的区别
基本数据类型和引用数据类型本质的不同是存储上的区别。
基本数据类型的值直接存储在栈内存中,值与值之间独立存在,修改一个变量不会影响到其他变量。对象(引用数据类型)是保存在堆内存中的,每创建一个新对象,就会在堆内存中开辟出一个新空间,变量保存的是对象的内存地址(对象的引用)。如果两个变量保存的是同一个对象引用,当其中一个通过变量修改属性时,另一个也会受到影响。(很多地方都碰到过这种情况)
4.双等于号和三等于号的区别
=== 判断两边数据是否全等,即数据类型与值均相等。而 == 只判断值是否相等。
5.Javascript的类型转换机制
5.1显示转换(强制转换)
- Number()
- parseInt()
- Boolean()
- String()
5.2隐式转换
当运算符两端的数据类型不一致,会触发隐式转换。
(1)减、乘、除
在对非Number 类型运用数学运算符(-、* 或 /)时,会先将非 Number 类型转换为 Number 类型再进行计算。示例如下:
console.log('a'-'b')//NaN
console.log(3-true)//2
console.log(3-null)//3
console.log(3-undefined)//NaN
console.log(false-null)//0
console.log(function (){}-0)//NaN
注意:在算术运算中,如果操作数中有 undefined,其运算结果是就是 NaN;null 在算术运算中则是隐式转换为数值 0 来参与运算。
(2)加(加法要区别算,因为+不仅仅是加法,还可以拼接)
加法运算遵守以下 3 条规则,优先级从高到低
- 当一侧为
String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。 - 当一侧为
Number类型,另一侧为原始类型,则将原始类型转换为Number类型。 - 当一侧为
Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接。
(3)单个变量
如果只有单个变量,会先将变量转换为 Boolean 值。只有 null、undefined、''、NaN、0、 false 这几个会被转换为 false,其他的情况都是 true,比如 {} , [] 等。
(4)ToPrimitive原则
ToPrimitive 规则会尝试调用对象的 valueOf 和 toString 方法,将参数转换为原始类型。
当对象类型需要转为原始类型时,它会先查找对象的 valueOf 方法,如果 valueOf 方法返回原始类型的值,则 ToPrimitive 的结果就是这个值,如果 valueOf 不存在或者 valueOf 方法返回的不是原始类型的值,就会尝试调用对象的 toString 方法,也就是会遵循对象的 ToString 规则,然后使用toString 的返回值作为 ToPrimitive 的结果。
let str = new String(1) // 通过 new String 创建了一个对象console.log(typeof str) // objectconsole.log(str.valueOf()) // "1"console.log(typeof str.valueOf()) // stringconst obj = {valueOf() {return 1},toString() {return 2}}console.log(Number(obj)) // 1
注意:如果 valueOf 和 toString 都没有返回原始类型的值,则会抛出异常。
const obj = {valueOf() {return []},toString() {return {}}
}
console.log(Number(obj)) // TypeError: Cannot convert object to primitive value
特殊:
String({}) // [object Object]
Number([]) // 0
String({}) 空对象会先调用 valueOf,但返回的是对象本身 {},不是原始类型,所以会继续调用toString,得到 [object Object],String([object Object]),所以转换后的结果为 [object Object]。
Number([]) 空数组会先调用 valueOf,但返回的是数组本身 [],不是原始类型,所以会继续调用toString,得到 '',相当于 Number(''),所以转换后的结果为 0。
