当前位置: 首页 > news >正文

Javascript的数据类型

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,其运算结果是就是 NaNnull 在算术运算中则是隐式转换为数值 0 来参与运算。

(2)加(加法要区别算,因为+不仅仅是加法,还可以拼接)

加法运算遵守以下 3 条规则,优先级从高到低

  • 当一侧为 String 类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。
  • 当一侧为 Number 类型,另一侧为原始类型,则将原始类型转换为 Number 类型。
  • 当一侧为 Number 类型,另一侧为引用类型,将引用类型和 Number 类型转换成字符串后拼接。

(3)单个变量

如果只有单个变量,会先将变量转换为 Boolean 值。只有 nullundefined''NaN0false 这几个会被转换为 false,其他的情况都是 true,比如 {} , [] 等。

(4)ToPrimitive原则

ToPrimitive 规则会尝试调用对象的 valueOftoString 方法,将参数转换为原始类型。

当对象类型需要转为原始类型时,它会先查找对象的 valueOf 方法,如果 valueOf 方法返回原始类型的值,则 ToPrimitive 的结果就是这个值,如果 valueOf 不存在或者 valueOf 方法返回的不是原始类型的值,就会尝试调用对象的 toString 方法,也就是会遵循对象的 ToString 规则,然后使用toString 的返回值作为 ToPrimitive 的结果。

  let str = new String(1)  // 通过 new String 创建了一个对象
  console.log(typeof str)  // object
  console.log(str.valueOf())  // "1"
  console.log(typeof str.valueOf())  // string
  const obj = {
    valueOf() {
      return 1
    },
    toString() {
      return 2
    }
  }
  console.log(Number(obj))  // 1

注意:如果 valueOftoString 都没有返回原始类型的值,则会抛出异常。

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

相关文章:

  • 开始第一个Pod与Deployment
  • Transformer多头注意力并行计算原理与工业级实现:从数学推导到PyTorch工程优化
  • C++上机_日期差值
  • C++17 中 std::size、std::empty 和 std::data 非成员函数介绍
  • VSCode 接入DeepSeek V3大模型,附使用说明
  • 【golang】channel带缓存和不带缓存的区别,应用场景解读
  • Spring MVC多语言支持揭秘:让你的应用走向世界
  • 轻量级分组加密算法RECTANGLE
  • 网络工程师 (41)IP协议、IP地址表示方法
  • 大语言模型中one-hot编码和embedding之间的区别?
  • 使用maven-archetype制作项目脚手架
  • 使用 Go 语言调用 DeepSeek API:完整指南
  • C# 控制台相关 API 与随机数API
  • PyQt学习记录03——批量设置水印
  • 递归的示例
  • 在conda环境下,安装Pytorch和CUDA
  • C++上机_日期问题
  • Python 自然语言处理(NLP)和文本挖掘的常规操作过程
  • 【SpringBoot3】面向切面 AspectJ AOP 使用详解
  • 企业如何搭建高效内容中台?
  • 商务部回应稀土出口管制问题
  • 从能源装备向应急装备蓝海拓展,川润股份发布智能综合防灾应急仓
  • 重庆发布经济犯罪案件接报警电子地图,企业可查询导航属地经侦服务点
  • 习近平同巴西总统卢拉共同出席合作文件签字仪式
  • 习近平同巴西总统卢拉会谈
  • 兰州大学教授安成邦加盟复旦大学中国历史地理研究所