javaScript:带你深入了解基本数据类型和引用类型

目录

一.前言

二.Ecmascript 规定的变量有两种

补充 

1.基本数据类型(重点掌握)

基本数据类型的特点

2.引用数据类型 (重点掌握)

引用数据类型的特点

三.什么是栈?堆?

下面代码帮助了解 

解释 

官方解释

总结 

四.小练习 (烧脑面试题)

解释

完整代码


一.前言

       在计算机编程中,数据是关键的组成部分。了解数据的类型和特性对于编写高效和可靠的代码至关重要。在许多编程语言中,包括JavaScript,数据可以分为两大类别:基本数据类型和引用类型。

        基本数据类型是指存储简单数据值的类型,它们被视为不可改变的。在JavaScript中,基本数据类型包括数字(Number)、字符串(String)、布尔值(Boolean)、空值(Null)、未定义(Undefined)和符号(Symbol)。这些类型的变量在内存中直接存储它们的值,且每个变量都相互独立,互不影响。

       引用类型是指存储对象和复杂数据结构的类型,它们可以包含多个值并具有其自己的方法和属性。在JavaScript中,引用类型包括对象(Object)、数组(Array)、函数(Function)等。与基本数据类型不同,引用类型的变量实际上存储的是对象在内存中的引用地址,而不是对象本身。这意味着多个变量可以引用同一个对象,对其中一个引用进行修改会影响到其他引用。

        深入了解基本数据类型和引用类型的区别和特性对于开发者来说是至关重要的。这种了解有助于理解变量的行为、内存管理、函数传参、数据操作等方面的工作原理。它们的使用和处理方式可能不同,因此我们需要掌握如何正确地操作和使用不同的数据类型,以避免潜在的错误和性能问题。

        在接下来的内容中,我们将深入研究基本数据类型和引用类型的各项特性和用法,让你更加熟悉它们之间的区别,为编写高质量的代码打下坚实的基础。

二.Ecmascript 规定的变量有两种

Ecmascript  规定变量有两种不同的数据类型:基本类型 和 引用类型

基本类型 包括:number boolean string undefined

引用类型 包括:数组和对象

补充 

也有其他的不同分类  原始类型 和 对象类型

或者 拥有方法的类型 和没有方法的类型

可变类型 和 不可变类型

以上的这些叫法都是依据两种类型特点来命名的,他们只是叫法不同其本质上都是数据类型。

1.基本数据类型(重点掌握)

基本数据类型的特点

基本类型的特点

            基本类型的比较是 值的比较

            基本类型的值是不能变的

            基本类型的值 存在于 栈区中

2.引用数据类型 (重点掌握)

引用数据类型的特点

引用类型的特点

           引用类型的值 是 可变的

           引用类型的比较是 引用的比较

           引用类型的值 存在于 栈内存和堆内存中

三.什么是栈?堆?

    栈:指的是栈内存,存放的数据是先进后出,栈自动分配内存空间,也会自动释放内存空间

    堆:指的是堆内存,动态分配内存空间,大小不确定,也不会自动释放内存空间先进先出。

下面代码帮助了解 

let arr = [1,2,3,4];let arr1 = arr; //此时arr1指向 堆内存中的 数组空间arr[1]='分手快乐';arr[2]='说散就散';console.log(arr);  //说明arr1 和arr同时指向一个地方

 

解释 

将数组 arr 赋值给 arr1 时,实际上是将堆内存中数组的引用复制给了 arr1。这意味着 arr 和 arr1 都指向相同的数组空间。

所以,当你修改 arr 中的元素时,例如 arr[1] = '分手快乐' 和 arr[2] = '说散就散',这些修改会反映在原始的数组上。由于 arr1 指向同一个数组,因此也会反映在 arr1 上。

这是因为数组是引用类型,在 JavaScript 中,对象(包括数组)的赋值是传递引用的。所以,arr 和 arr1 引用了相同的数组对象,它们指向相同的内存空间。任何针对该数组的更改都会被反映在两个变量上。

官方解释

       在计算机科学中,栈(Stack)和堆(Heap)是两种常见的数据结构,用于管理程序在内存中的分配和存储。

       栈(Stack)是一种后进先出(Last-In-First-Out,LIFO)的数据结构。它类似于现实生活中的堆叠物品,只能从最顶端插入和删除数据。当一个函数被调用时,函数的局部变量和参数被存储在栈内存中。每当一个新的函数调用发生时,该函数的数据被压入栈的顶部,形成一个称为栈帧(Stack Frame)的数据块。当函数执行完成后,栈帧被移出栈,控制权返回给调用函数。栈的大小通常是有限的,并受限于操作系统或编程语言的设定。

        堆(Heap)是一种用于动态分配内存的区域。与栈不同,堆的内存分配和释放没有特定的顺序,它是一种自由存储区域。在堆上分配的内存可以通过指针进行访问,并且在不同的部分之间共享。在编程中,动态创建的对象、数组和其他复杂数据结构通常存储在堆内存中。在堆上分配的内存需要手动进行释放,否则可能会导致内存泄漏。

       栈和堆在内存管理方面具有不同的特点和使用场景。栈的存储和释放速度较快,但容量有限,适合存储简单的局部变量和函数调用的上下文信息。堆则可以动态分配大量的内存空间,但需要程序员负责手动分配和释放内存,并且会存在一定的分配和释放开销。

总结 

       总的来说,栈和堆是计算机内存管理中的两个重要概念。栈用于存储函数调用和局部变量,具有快速的分配和释放特性;而堆用于动态分配内存,适合存储较大的对象和复杂的数据结构,但需要手动管理内存的分配和释放。

四.小练习 (烧脑面试题)

 let num = num1 =10let a = {m:1}let b = a;a.x = a = {n:1} console.log(a.x);console.log(b.x);

解释

    由于 . 操作高于 联= ,因此先算a.x = {n:1},此时a 和b指向的是内存中

    的同一个空间,因此b = {m:1,x:{n:1} }

    然后再计算 a = {n:1},这样之前声明的a 会被直接释放,只留下一个新的a={n:1}

    综上,计算结果是

    a= {n:1}

    b={

        m:1

        x:{n:1}

    }

所以输出的应是 undefined  {n:1}

完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>引用类型</title>
</head>
<body></body>
</html>
<script>/*基本数据类型number boolean string undefined null objectEcmascript  规定变量有两种不同的数据类型:基本类型 和 引用类型基本类型 包括:number boolean string undefined 引用类型 包括:数组和对象也有其他的不同分类  原始类型 和 对象类型或者 拥有方法的类型 和没有方法的类型可变类型 和 不可变类型以上的这些叫法都是依据两种类型特点来命名的1.基本类型基本类型的特点基本类型的比较是 值的比较基本类型的值是不能变的基本类型的值 存在于 栈区中2.引用类型引用类型的特点引用类型的值 是 可变的引用类型的比较是 引用的比较引用类型的值 存在于 栈内存和堆内存中栈:指的是栈内存,存放的数据是先进后出,栈自动分配内存空间,也会自动释放内存空间堆:指的是堆内存,动态分配内存空间,大小不确定,也不会自动释放内存空间先进先出*/let arr = [1,2,3,4];let arr1 = arr; //此时arr1指向 堆内存中的 数组空间arr[1]='分手快乐';arr[2]='说散就散';console.log(arr);  //说明arr1 和arr同时指向一个地方let arr2 = arr.concat()  //拷贝arr2[2]='体面';console.log(arr);let arr3 = arr.slice() //拷贝arr3[2] = '移情别恋'console.log(arr3);let num = num1 =10let a = {m:1}let b = a;a.x = a = {n:1} /*由于 . 操作高于 联= ,因此先算a.x = {n:1},此时a 和b指向的是内存中的同一个空间,因此b = {m:1,x:{n:1} } 然后再计算 a = {n:1},这样之前声明的a 会被直接释放,只留下一个新的a={n:1}综上,计算结果是a= {n:1}b={m:1x:{n:1}}*/console.log(a.x);console.log(b.x);//声明一个空对象let obj1 ={}//给对象添加属性obj1.name = '牛郎'obj1.act = function(){console.log('偷织女的衣服')}obj1.box = {abc:'老黄牛'}console.log(obj1);console.log(obj1.box.abc)</script>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot分装通用的查询+分页接口

背景 在用spring bootmybatis plus实现增删改查的时候&#xff0c;总是免不了各种模糊查询和分页的查询。每个数据表设计一个模糊分页&#xff0c;这样代码就造成了冗余&#xff0c;且对自身的技能提升没有帮助。那么有没有办法实现一个通用的增删改查的方法呢&#xff1f;今天…

爬虫工具的选择与使用:阐述Python爬虫优劣势

作为专业爬虫ip方案解决服务商&#xff0c;我们每天都面对着大量的数据采集任务需求。在众多的爬虫工具中&#xff0c;Python爬虫凭借其灵活性和功能强大而备受青睐。本文将为大家分享Python爬虫在市场上的优势与劣势&#xff0c;帮助你在爬虫业务中脱颖而出。 一、优势篇 灵活…

MySQL的基础操作

前言 对MySQL的一些基础操作做一下学习性的总结&#xff0c;基本上是照着视频写的。 MySQL的安装 MySQL的下载 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 配置环境变量 下载之后直接解压&#xff0c…

c++ 虚函数类对象模型

一、复杂的菱形继承及菱形虚拟继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承。 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承。 菱形继承&#xff1a;菱形继承是多继承的一种特殊情况。 菱形继承的问题&#xff1a;从…

2023年京东儿童智能手表行业数据分析(京东销售数据分析)

儿童消费市场向来火爆&#xff0c;儿童智能手表作为能够实现定位导航&#xff0c;信息通讯&#xff0c;SOS求救&#xff0c;远程监听&#xff0c;智能防丢等多功能的智能可穿戴设备&#xff0c;能够通过较为精准的定位功能和安全防护能力保障儿童的安全&#xff0c;因而广受消费…

C#详解-Contains、StartsWith、EndsWith、Indexof、lastdexof

目录 简介: 过程: 举例1.1 举例1.2 ​ 总结: 简介: 在C#中Contains、StarsWith和EndWith、IndexOf都是字符串函数。 1.Contains函数用于判断一个字符串是否包含指定的子字符串&#xff0c;返回一个布尔值&#xff08;True或False&#xff09;。 2.StartsWith函数用于判断一…

数据结构-二叉树

在学习二叉树之前.必须先要掌握一些树的重要概念: 结点的度:一个结点含有的子树个数称为该结点的度.树的度:一棵树中,所有节点度的最大值称为树的度.叶子结点:度为0的结点称为叶子节点.(也叫终端结点)双亲结点:若一个结点含有子结点,则这个结点称为其子结点的双亲结点(也叫父节…

USB隔离器电路分析,SA8338矽塔sytatek电机驱动,源特科技VPS8701,开关电源,电源 大师

一、 USB隔离器电路分析 进行usb隔离可以使用USB隔离模块 ADUM3160 ADUM4160 注意&#xff1a;B0505S 最大带载0.16A&#xff0c;副边需要带载能力需要改变方案 比如移动硬盘至少需要0.5A 用充电宝、18650、设计5V1A输出电源 二、 1A隔离电压方案

redis乐观锁+启用事务解决超卖

乐观锁用于监视库存&#xff08;watch&#xff09;&#xff0c;然后接下来就启用事务。 启用事务&#xff0c;将减库存、下单这两个步骤&#xff0c;放到一个事务当中即可解决秒杀问题、防止超卖。 但是&#xff01;&#xff01;&#xff01;乐观锁&#xff0c;会带来" …

Leetcode67 二进制求和

给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 代码 class Solution {public String addBinary(String a, String b) {StringBuilder res new StringBuilder();int carry 0;int i a.length() - 1, j b.length() - 1;while(i > 0 || j &…

keepalived+lvs+nginx高并发集群

keepalivedlvsnginx高并发集群 简介&#xff1a; keepalivedlvsnginx高并发集群&#xff0c;是通过LVS将请求流量均匀分发给nginx集群&#xff0c;而当单机nginx出现状态异常或宕机时&#xff0c;keepalived会主动切换并将不健康nginx下线&#xff0c;维持集群稳定高可用 1.L…

Linux系统之安装OneNav个人书签管理器

Linux系统之安装OneNav个人书签管理器 一、OneNav介绍1.OneNav简介2.OneNav特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查本地yum仓库状态 四、安装httpd服务4.1 安装httpd4.2 启动httpd服务4…

低代码开发ERP:精打细算,聚焦核心投入

企业数字化转型已经成为现代商业环境中的一项关键任务。如今&#xff0c;企业面临着日益激烈的竞争和不断变化的市场需求。在这样的背景下&#xff0c;数字化转型不仅是企业生存的必然选择&#xff0c;也是取得竞争优势和实现可持续发展的关键因素。 在数字化转型的过程中&…

神经网络入门

前言 本文主要介绍最基础的神经网络&#xff0c;包括其结构&#xff0c;学习方法&#xff0c; C \texttt{C} C 的实现代码。 Python \texttt{Python} Python 的代码可以搜索互联网得到。 前排提示&#xff1a;本人涉及一丁点数学知识。 神经网络的结构 神经网络包括多个层…

[Linux]进程概念

[Linux]进程概念 文章目录 [Linux]进程概念进程的定义进程和程序的关系Linux下查看进程Linux下通过系统调用获取进程标示符Linux下通过系统调用创建进程-fork函数使用 进程的定义 进程是程序的一个执行实例&#xff0c;是担当分配系统资源&#xff08;CPU时间&#xff0c;内存…

二、数学建模之整数规划篇

1.定义 2.例题 3.使用软件及解题 一、定义 1.整数规划&#xff08;Integer Programming&#xff0c;简称IP&#xff09;&#xff1a;是一种数学优化问题&#xff0c;它是线性规划&#xff08;Linear Programming&#xff0c;简称LP&#xff09;的一个扩展形式。在线性规划中&…

构造不包含字母和数字的webshell

文章目录 利用不含字母与数字进行绕过知识介绍题目方法一&#xff1a;异或操作绕过方法二&#xff1a;取反进行绕过 过滤不是很严格的情况进阶绕过利用php7特性直接绕过 利用不含字母与数字进行绕过 知识介绍 <?phpecho "A"^"";?>从运行结果为! …

深度学习|CNN卷积神经网络

CNN卷积神经网络 解决的问题人类的视觉原理原理卷积层——提取特征池化层——数据降维全连接层——输出结果 应用图像处理自然语言处理 解决的问题 在CNN没有出现前&#xff0c;图像对人工智能来说非常难处理。 主要原因&#xff1a; 图像要处理的数据量太大了。图像由像素组…

使用IDEA把Java程序打包成jar

点击左上角File,选择Project Structure 左侧选中Artifacts,点击右侧的号 选择JAR->From modules with dependencies 选择你要运行的main方法所在的类,选好了点击OK Artifacts添加完成后点击右下角OK 在工具栏中找到Build,选择Build Artifacts 刚才创建好的Artifacts,选择Bui…

【附安装包】Midas Civil2019安装教程

软件下载 软件&#xff1a;Midas Civil版本&#xff1a;2019语言&#xff1a;简体中文大小&#xff1a;868.36M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.…