JavaScript数据类型和存储区别

目录

一、原始数据类型

二、引用数据类型

三、存储区别

四、常见错误


JavaScript是一种动态类型语言,这意味着变量可以在程序执行过程中改变其数据类型。了解JavaScript中的数据类型和它们的存储方式对于编写高效和可维护的代码至关重要。

在JavaScript中,数据类型可以分为原始数据类型(Primitive types)和引用数据类型(Reference types)。

一、原始数据类型

1. 字符串(String)

用于表示文本数据。

let str = "Hello, world!";

JavaScript中的字符串是不可变的。这意味着一旦创建了一个字符串,就不能修改它。在内部,字符串被表示为UTF-16字符的序列。每个字符都由2个16位数字表示,也就是一个“码点”。这些码点对应于Unicode字符集中的某个字符。

字符串的常见操作包括连接、查找子串、替换、分割等。

2. 数字(Number)

用于表示数值数据。

let num = 10;

JavaScript中的数字可以是整数或浮点数。在内部,数字被存储为IEEE 754双精度浮点数,可以表示很大的数值(例如1.7976931348623157e+308)和极小的数值(例如5e-324)。但是,由于JavaScript的数字是双精度浮点数,因此可能会遇到精度问题,例如无法准确表示0.1 + 0.2的值。

数字的常见操作包括算术运算(加、减、乘、除、取余等)、比较运算、数学函数等。

3. 布尔值(Boolean)

用于表示真或假的值。

let nullValue = null;

布尔值主要用于逻辑运算和条件判断。在JavaScript中,true和false是关键字,不能作为变量名使用。

布尔值的常见操作包括逻辑运算(与、或、非)、条件判断等。

4. 空值(Null)

表示一个空的或不存在的值。

let nullValue = null;

null是一个特殊的值,表示没有值或没有对象。它通常用于表示缺少数据或没有期望的值。在JavaScript中,null是一个关键字,不能作为变量名使用。

空值的常见使用场景包括表示一个未初始化的变量、表示一个不存在的对象等。

5. 未定义(Undefined)

表示未赋值或声明的变量。

let undefinedValue;

undefined是一个特殊的值,表示变量未被定义或未赋值。在JavaScript中,undefined是一个关键字,不能作为变量名使用。

未定义的常见使用场景包括声明未初始化的变量、访问未声明的变量等。

6. 符号(Symbol)

let name = Symbol("fx");  
typeof name; // 'symbol'  
console.log(name); // Symbol(fx)

Symbol值是通过Symbol函数创建的,每个Symbol值都是独一无二的,它们之间不会相等,即使它们的描述符相同。Symbol值可以作为对象的属性名使用,通过对象的Symbol属性访问。

二、引用数据类型

1. 对象(Object)

用于表示复杂的数据结构。

let obj = { name: "John", age: 25 };
  • 对象是用于表示复杂数据结构的数据类型。在JavaScript中,对象是一种无序的键值对的集合。
  • 对象在内存中以引用的形式存储,实际数据存储在堆内存中。当创建一个对象时,实际上是在堆内存中创建了一个新的对象实例。
  • 对象的属性可以包含基本数据类型、引用数据类型或其他对象。当访问对象的属性时,JavaScript会在堆内存中查找该属性,并返回其值。
  • 对象的使用非常广泛,可以用于表示各种复杂的数据结构,如用户信息、图形、文档等。

2. 数组(Array)

用于表示有序的数据集合。

let arr = [1, 2, 3, 4, 5];
  • 数组是一种特殊类型的对象,用于表示有序的数据集合。
  • 数组在内存中以引用的形式存储,实际数据存储在堆内存中。
  • 数组的元素可以通过索引访问,这些索引可以是数字或其他数据类型。
  • 数组常用于存储和处理数据集合,如排序、搜索等操作。

3. 函数(Function)

用于封装可重复使用的代码块。

function greet(name) {  
  console.log("Hello, " + name + "!");  
}
  • 函数是用于封装可重复使用的代码块的数据类型。
  • 函数在内存中以引用的形式存储,实际代码存储在堆内存中。
  • 当创建一个函数时,实际上是在堆内存中创建了一个新的函数实例。
  • 函数可以接受参数,并返回一个值。这个值可以是任何数据类型,包括基本数据类型和引用数据类型。
  • 函数可以访问和修改全局变量和其他函数的作用域。

4. 日期(Date)

用于表示日期和时间。

let currentDate = new Date();
  • 日期是一种引用数据类型,用于表示日期和时间。
  • 日期在内存中以引用的形式存储,实际数据存储在堆内存中。
  • JavaScript日期对象提供了许多操作日期和时间的属性和方法。

5. 正则表达式(Regular Expression)

用于匹配和处理文本。

let regex = /pattern/;
  • 正则表达式是一种引用数据类型,用于匹配和处理文本。
  • 正则表达式在内存中以引用的形式存储,实际表达式存储在堆内存中。
  • 正则表达式常用于字符串的搜索、替换、验证等操作。

三、存储区别

1. 原始数据类型

这些数据类型的值直接存储在内存中,因为它们的大小是固定的,不会改变。当这些值被引用时,它们会被复制到栈内存中,而不是直接引用原始数据。这种存储方式可以节省内存空间,因为不需要为每个引用创建新的内存空间。

2. 引用数据类型

这些数据类型的值在内存中以引用的形式存储,实际数据存储在堆内存中。当这些值被引用时,实际上是在栈内存中创建了一个指针或引用,指向堆内存中的对象。这种存储方式可以节省内存空间,因为多个引用可以共享同一个对象,避免了重复存储数据的浪费。

四、常见错误

1. 尝试修改不可变的数据类型。

例如,尝试修改字符串或数字的值会导致错误。

let str = "Hello, world!";  
str[0] = 'h'; // 错误,试图修改字符串的字符  
let num = 10;  
num = 15; // 错误,试图修改数字的值

2. 忽略undefined和null的区别。

undefined表示未定义的值,而null表示一个空值。在实际编程中,这两者经常被混淆。

let undefinedValue;  
console.log(undefinedValue); // 输出undefined  
let nullValue = null;  
console.log(nullValue); // 输出null

3. 对函数和对象的操作不匹配。

函数是一种特殊的数据类型,不能直接对函数进行一些对对象操作的操作,否则会抛出错误。

let func = function greet(name) { }; // 函数  
console.log(func.length); // 可以输出函数的参数个数,因为函数有length属性  
let obj = {}; // 对象  
console.log(obj.length); // 错误,对象没有length属性

4. 对引用类型的不当操作。

由于引用类型的值实际上是引用或指针,因此对它们的一些操作可能会导致意外结果或错误。例如,误用delete操作符会导致错误。

let obj = { name: "John", age: 25 }; // 对象  
delete obj.age; // 错误,delete操作符不能用于删除对象的属性  
console.log(obj.age); // 输出undefined,因为属性仍然存在,只是被删除了而已

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/143440.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苹果手机通话记录怎么恢复?这3个方法就足够!

通话记录是手机中的重要数据之一,它记录了用户与联系人的通话信息,包括通话时间、通话时长、通话号码等等。 有时候,我们可能不小心删除了通话记录,或者想找回之前的通话记录以此来回忆起一些事情。那么,苹果手机通话…

基于安卓android微信小程序的快递取件及上门服务系统

项目介绍 本文从管理员、用户的功能要求出发,快递取件及上门服务中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、快递下单管理、预约管理、管理员管理、系统管理、订单管理,用户客户端;首页、快递下单、预约管理…

电压放大器适合什么应用

电压放大器是电子电路中常见的一种放大器,广泛应用于各个领域。本文将详细介绍电压放大器的特点和适用的主要应用。 电压放大器具有放大信号的功能,可以将输入信号的幅度放大数倍或数十倍。这使得电压放大器在各种需要信号增强的应用中非常重要。以下是电…

一寸证件照排版工具,在线将证件照排版在相纸上

证件照是我们经常使用到的一种办事资料,考试报名和办理个人证件都是需要的,很多时候需要纸质照片,如果我们手头有打印机的话就很方便了,但相纸都是固定尺寸的例如5寸、6寸相纸,而数码证件照的尺寸则不固定,…

isomorphic-fetch库代码示例

isomorphic-fetch库的爬虫程序。 typescript // 引入isomorphic-fetch库 import fetch from isomorphic-fetch; // 设置 const proxy ; // 定义视频URL const url ; // 使用fetch获取视频数据 fetch(url, { method: GET, headers: { Accept: application/json, …

手写模拟SpringBoot核心流程

文章目录 1、创建工程1.1、pom依赖 1、创建工程 创建一个工程,包含springboot和user两个module springboot模块,表示springboot框架的源码实现user包,表示用户业务系统,用来写业务代码来测试我们所模拟出来的SpringBoot 1.1、…

2023超级详细微信小程序纯前台获取当前具体位置,地图上选点进行位置签到 计算签到距离

前言: 为了解决不同板块获取位置以及取代三级联动的问题,当前进行研究微信小程序获取当前具体位置。 思路: 调用微信小程序中获取当前地理位置的方法,与设置地理位置的方法,通过、、、实现当前距离设置打卡地点的距离&…

python数据结构与算法-02_数组和列表

线性结构 本节我们从最简单和常用的线性结构开始,并结合 Python 语言本身内置的数据结构和其底层实现方式来讲解。 虽然本质上数据结构的思想是语言无关的,但是了解 Python 的实现方式有助于你避免一些坑。 我们会在代码中注释出操作的时间复杂度。 数…

【Python基础】文件传输协议

🌈欢迎来到Python专栏 🙋🏾‍♀️作者介绍:前PLA队员 目前是一名普通本科大三的软件工程专业学生 🌏IP坐标:湖北武汉 🍉 目前技术栈:C/C、Linux系统编程、计算机网络、数据结构、Mys…

PyCharm鼠标控制字体缩放

File->Settings->Keymap 右边搜索栏输入increase(放大),可以看到下面出现increase Font Size(放大字体尺寸),双击。 双击后出现几个选项,选择Add Mouse Shortcut,会出现一个页面给录入动作。 按住Ctrl同时鼠标向上滚动,该动…

时间序列预测实战(十六)PyTorch实现GRU-FCN模型长期预测并可视化结果

往期回顾:时间序列预测专栏——包含上百种时间序列模型带你从入门到精通时间序列预测 一、本文介绍 本文讲解的实战内容是GRU-FCN(门控循环单元-全卷积网络),这是一种结合了GRU(用于处理时间序列数据)和FCN(全卷积网络…

Java项目开发:基于Springboot+vue口腔牙科诊所管理系统

项目介绍 本选题则旨在通过标签分类管理等方式,实现管理员:首页、个人中心、会员管理、病例就诊信息管理、牙齿保健产品管理、复查提醒管理、预约挂号管理、药品信息管理、留言板管理、系统管理、订单管理,会员;首页、个人中心、…

Git企业开发级讲解(二)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、添加⽂件--场景⼀1、操作2、演示 二、查看 .git ⽂件1、tree .git命令2、内容讲解3、总结…

nginx 无法 停止

一、nginx正常停止命令 进入到nginx目录,然后执行 # 立即停止 nginx -s stop # 平滑停止 nginx -s quit 二、 如果你不小心启动了多次nginx.exe 那么通过任务管理器可以停止 三、如果 任务管理器无法停止 那么就在cmd命令中执行 netstat -ano //查看所以端口…

立体库堆垛机控制程序手动功能实现

手动操作功能模块 手动前后保护锁 *************提升手动程序段 手动上升,下降保护锁 **********货叉手动程序段

Vue 小黑记事本组件版

渲染功能: 1.提供数据: 提供在公共的父组件 App.vue 2.通过父传子,将数据传递给TodoMain 3.利用 v-for渲染 添加功能: 1.收集表单数据 v-model 2.监听事件(回车点击都要添加) 3.子传父,讲…

Shopee买家通系统之注册虾皮买家号大概需要多少成本

想要注册大量的虾皮买家号,可以使用shopee买家通系统进行注册,这款软件可以全自动化的注册虾皮买家号,不过想要自动化更方便,对于账号资料有一定的要求。 1、现在注册虾皮买家号基本上都是需要用手机号注册了的,而虾皮…

escape, encodeURI, encodeURIComponent 有什么区别以及作用?

目录 前言 全部内容 1. 注释 2. 写法 3. 代码 4. 事件 5. 总结 6. 理论 7. 用法 8. 结论 9. API 10. 优缺点 escape: encodeURI: encodeURIComponent: 11. 方法 总结 🙂博主:冰海恋雨. 🙂文章核心:escape, encod…

千兆路由只有200M,原来是模式选择不对,也找到了内网不能通过动态域名访问内部服务的原因

本来1000M的宽带接入的,但是一测试发现只有200M,把电信叼了过来, 一测试发现宽带没问题,网线正常,网卡正常,只有可能是路由器的问题了,尴尬了,赶紧给满意好评放他走。回头好好研究一…

nvm工具解决nodejs版本切换问题

常见版本问题 npm启动vite项目报错,信息如下 npm run dev> my-vue-app0.0.0 dev D:\data\code\document-assistant-web > vitefile:///D:/data/code/document-assistant-web/node_modules/vite/bin/vite.js:7await import(source-map-support).then((r) >…