JavaScript的八种数据类型
这篇文章主要分享的是JavaScript的八种数据类型,ES5的时候,我们大家认知的数据类型是 6种的,但是ES6 中新增了一种 Symbol,谷歌67版本中还出现了一种 bigInt,是指安全存储、操作大整数,像下面文章我可没就来看看这八种数据类型的详细介绍吧
一、前言
在ES5的时候,我们认知的数据类型确实是 6种:Number
、String
、Boolean
、undefined
、object
、Null
ES6 中新增了一种 Symbol
。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。
谷歌67版本中还出现了一种 bigInt
。是指安全存储、操作大整数。
所以:准确来说目前JS数据类型总共有8种!
- Number
- String
- Boolean
- Null
- Undefined
- Object
- Symbol
- BigInt
按照类型来分有基本数据类型和引用数据类型:
基本数据类型:String
、Number
、Boolean
、Null
、Undefined
、Symbol
引用数据类型:Object
【Object是个大类,function函数、array数组、date日期...等都归属于Object】
二、动态数据类型
JavaScript
拥有动态类型。这意味着相同的变量可用作不同的类型
JavaScript
中变量似乎很简单,因为它声明变量只需要一个“var
”就可以,不像其他编程语言严格区分了数据类型(int/double/char/boolean...)。这样做也是有好处的,变量可以被赋予任何类型的值,同样也可以给这个变量重新赋予不同类型的值。并不是“一定终身”
1
2
3
4
5
6
7
8
9
10
11
12
|
var x = 1; //number类型 var x = 0.1; //number类型,JS不区分整数值和浮点数值 //现在x由number变成string var x = "hello world" ; //由双引号内文本构成字符串 var x = 'javascript' ; //单引号内文本同样可以构成字符串 //现在x由string变成boolean var x = true ; //true和false作为布尔值 var x = null ; var x = undefined; //null和undefined很相似,是特殊的类型 |
2.1 字符串string
字符串是存储字符(比如 "Bill Gates
")的变量
字符串可以是引号中的任意文本。可以使用单引号或双引号
- 使用单引号或者双引号,没有区别
- 单引号不要嵌套单引号。双引号同理,非要嵌套需要对引号进行转义 \' \"
1
2
|
var str = '孙悟空' ; //单引号字符串 var str2 = '猪八戒' ; //双引号字符串 |
其他转义字符:
- \n 表示换行符
- \r 表示回车符
- \t 水平制表符 tab
- \' 单引号
- \" 双引号
- \\ 反斜杠
- \uXXXX 四位十六进制表示
unicode
字符串 - \xXX 两位十六进制表示拉丁字符
字符串拼接:
1
2
3
4
|
var str1 = "hello" ; var str2 = "world" ; var str = str1 + str2 console.log(str); //helloworld |
2.2 数值number
JavaScript
只有一种数字类型。数字可以带小数点,也可以不带
1
2
3
4
5
6
|
var num1=5.02; //使用小数点来写 var num2=520; //不使用小数点来写 //极大或极小的数字可以通过科学(指数)计数法来书写 var y=123e5; // 12300000 var z=123e-5; // 0.00123 |
数值范围:
- 5e324 ~ 1.7976931348623157e+308
- 如果超过范围,会表示为
Infinity
或者-Infinity
特殊的数值NaN:
- NaN是
number
类型,是一个数值 - 特点1:NaN与任何数进行任何运算结果都是NaN
- 特点2:NaN与任何数都不相等,包括自己
相关函数:
isNaN()
判断数据是否是NaN
, 是返回true,否则返回falseisFinite()
判断数据是否在范围内,在范围内返回true,否则false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//NaN是一个特殊的number,与其他所有值都不相等,包括它自身 console.log(NaN === NaN ); //false //唯一识别NaN的方法 console.log(isNaN(NaN) ); //true // 范围:5e324 ~ 1.7976931348623157e+308 var min = 5e324; var max = 1.7976931348623157e+308; var a = 1.7976931348623157e+309; console.log(min); //Infinity console.log(max); //1.7976931348623157e+308 console.log(a); //Infinity console.log(isFinite(a)); //false(超出范围,不在数值范围内) |
2.3 布尔boolean
布尔(逻辑)只能有两个值:true
或 false
1
2
|
var x= true ; var y= false ; |
2.4 null和undefined
null
表示没有对象,此处无值
undefined
表示缺少值,本来应该有值但没定义
1
2
|
var x = null ; var y = undefined |
2.5 symbol
Symbol
函数可以接受一个字符串作为参数,为新创建的 Symbol
提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分
1
2
3
4
5
6
|
let name = Symbol(); let name2 = Symbol( "bb" ); console.log(name); // Symbol() console.log( typeof name); // "symbol" console.log(name,name2); //Symbol() Symbol(bb) console.log( name === name2); // false |
2.6 对象object
对象由花括号分隔。在括号内部,对象的属性以键值对的形式 (name : value) 来定义。属性由逗号分隔
1
2
3
4
5
|
//空格和折行无关紧要。声明可横跨多行 var obj = { "name" : "张三" , "age" :18 } |
(这里键名也可以不用加引号)
读取对象中属性:
1
2
3
|
name = obj.name //或 name = obj[ 'name' ] |
三、基本数据类型与引用数据类型区别
3.1 声明变量时不同的内存分配
基本数据类型由于占据的空间大小固定且较小,会被存储在栈当中,也就是变量访问的位置
引用数据类型存储在堆当中,变量访问的其实是一个指针,它指向存储对象的内存地址
3.2 正是因为内存分配不同,在复制变量时结果也不一样
基本数据类型复制后2个变量是独立的,因为是把值拷贝了一份
引用数据类型则是复制了一个指针,2个变量指向的值是该指针所指向的内容,一旦一方修改,另一方也会受到影响🚩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<script type= "text/javascript" > var x = 3; var y = x; console.log(x,y); //3 3 // 基本数据类型复制后2个变量是独立的 x = 5; //修改一方,另一个不受影响 console.log(x,y); //5 3 var a = [0,1,2,3]; var b = a; console.log(a, b); //(4) [0, 1, 2, 3] (4) [0, 1, 2, 3] a[0] = 9 console.log(a, b); //(4) [9, 1, 2, 3] (4) [9, 1, 2, 3] </script> |
结果:
这里明显可以看出b
复制了a
,改变a数组的值,b数组也跟着改变了。这就是因为当引用数据类型复制的是同一个指针而不是同一个值,指针指向的地址都是相同的,一方修改另一方也会受影响!
(这里涉及了JS的深拷贝和浅拷贝,这里就不再详细赘述,后面会有单独文章进行讲解)
3.3 参数传递不同
基本数据类型把变量里的值传递给参数,之后参数和这个变量互不影响
引用数据类型(这里拿函数举例):虽然函数的参数都是按值传递的,但是引用值传递的值是一个内存地址,实参和形参指向的是同一个对象,所以函数内部对这个参数的修改会体现在外部
数据类型的转换以及检测数据类型的方法会在其他文章单独讲解,为了方便阅读这里就不再详细赘述~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?