js中值类型和引用类型的区别介绍

js中值类型和引用类型的区别介绍

在JavaScript中,变量分为值类型和引用类型。值类型主要包括基本类型数据,比如数字、字符串、布尔值等,引用类型主要包括对象、数组、函数等。两者在定义、赋值和传递参数等方面有着不同的表现。

值类型

定义

值类型的变量在定义的时候,会直接将数据储存在栈内存中。

let a = 1

赋值

当把一个值类型的变量复制到另一个变量上时,会直接将变量的值复制一份到新的内存地址中。

let a = 1
let b = a

此时,ab 会各自储存一个值为 1 的数据,两者相互独立,互不影响。

传递参数

当把值类型的变量作为参数传递给函数时,会直接把变量的值传递给函数内部的参数,形参和实参互相独立。

function changeValue(num) {
  num = 2
}

let a = 1
changeValue(a)
console.log(a) // 输出1

引用类型

定义

引用类型的变量在定义的时候,会把数据保存在堆内存中,而变量名只是一个指针,指向保存数据的地址。

let obj = {}

赋值

当将一个引用类型的变量赋值到另一个变量上时,会将变量名的指针复制一份到新的内存地址中。

let obj = {}
let obj2 = obj

此时,objobj2 的指针都指向同一个堆内存中的数据,两者都可以对数据进行修改。

obj.a = 1
console.log(obj2.a) // 输出1

传递参数

当把引用类型的变量作为参数传递给函数时,实际上传递的是指针的副本,也就是说,形参和实参指向同一个堆内存中的数据。这时,修改形参会影响实参的值。

function changeValue(obj) {
  obj.a = 1
}

let obj = {}
changeValue(obj)
console.log(obj.a) // 输出1

总之,对于引用类型的变量,修改一个变量会引起其他指向同一份数据的变量发生改变,而值类型的变量则是独立互不影响的。

示例说明

示例1

let a = {name: 'Tom'}
let b = {name: 'Tom'}

console.log(a == b) // 输出 false
console.log(a === b) // 输出 false

因为ab是两个不同的对象,在堆内存中分别分配了不同的地址,所以相等性比较结果为 false

示例2

let a = [1, 2, 3]
let b = a
a.push(4)

console.log(b) // 输出 [1, 2, 3, 4]

因为ab指向同一个数组对象,在堆内存中只分配了一个地址,所以对a的操作也会影响b

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js中值类型和引用类型的区别介绍 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript 用fetch 实现异步下载文件功能

    下面是实现JavaScript使用fetch实现异步下载文件功能的完整攻略。 1. 前置知识 在开始操作之前,需要对以下概念有一定的了解: JavaScript fetch API Blob URL.createObjectURL() a标签的download属性 2. 原理分析 JavaScript的fetch API可以向服务器请求获取数据或者资源并进行…

    JavaScript 2023年5月27日
    00
  • Js中setTimeout()和setInterval() 何时被调用执行的用法

    当我们写JavaScript代码时,经常需要用到定时器来调用一些方法或者函数。其中,setTimeout()和setInterval()就是两个常用的方法。在此,我将向你详细讲解它们的用法及何时被调用执行。 setTimeout() setTimeout()方法用于在指定的时间后执行给定的代码。它的语法格式如下: setTimeout(function, d…

    JavaScript 2023年6月11日
    00
  • Node工程的依赖包管理方式

    作者:京东零售 陈震 在前端工程化中,JavaScript 依赖包管理是非常重要的一环。依赖包通常是项目所依赖的第三方库、工具和框架等资源,它们能够帮助我们减少重复开发、提高效率并且确保项目可以正确的运行。 目前比较常见的前端包管理器有 npm 和 Yarn,npm 是 Node.js 自带的包管理器,它可以安装、共享和分发 node.js 模块。最近pnp…

    JavaScript 2023年4月24日
    00
  • Window.Open打开窗体和if嵌套代码

    下面我就来详细讲解一下“Window.Open打开窗体和if嵌套代码”的完整攻略。 Window.Open打开窗体 Window.Open 是一种在浏览器中打开新窗口的方法。它有几个参数可以设置:新窗口的 URL 地址、窗口大小和位置、是否允许调整窗口大小、是否允许工具栏和状态栏等。 下面是一个示例,展示如何通过 Window.Open 打开一个新窗口: &…

    JavaScript 2023年6月11日
    00
  • js屏蔽F12审查元素,禁止修改页面代码等实现代码

    实现屏蔽F12审查元素和禁止修改页面代码需要结合JavaScript和HTML的相关特性。以下是一个完整的攻略: 1. 使用JavaScript禁止页面右键功能 在页面中加入以下JavaScript代码,可以禁止页面的右键功能: document.oncontextmenu = function () { return false; } 以上代码中,docu…

    JavaScript 2023年6月10日
    00
  • ahooks封装cookie localStorage sessionStorage方法

    介绍ahooks ahooks是一个封装好的React Hooks库,提供了很多常用的Hooks封装,可以帮助我们快速地开发Web应用。在ahooks中,有一个useCookieHooks可以用来操作cookie。如果要操作localStorage或sessionStorage,可以通过封装实现。 封装localStorage的方法 import { use…

    JavaScript 2023年6月11日
    00
  • JS如何使用剪贴板操作Clipboard API

    关于如何使用JavaScript操作剪贴板Clipboard API,我们可以从以下内容着手: 什么是Clipboard API? Clipboard API 是一种浏览器内置的API,它允许JavaScript从系统剪贴板中复制、获取或粘贴数据。 如何使用Clipboard API? 首先要使用 Clipboard API 需要先访问到 navigator…

    JavaScript 2023年6月11日
    00
  • Vue nextTick延迟回调获取更新后DOM机制详解

    当 Vue.js 更新数据时,除了更新数据对象本身,Vue.js 还需要通过 Virtual DOM 进行一系列操作,最终更新真实的 DOM 构造,以反映数据的变化。这个过程需要一定的时间,而且这个过程还不保证在同步代码中立即执行完成。因此,我们可能会在同步代码中尝试获取更新后的 DOM,但却发现 DOM 还没有更新。 在这种情况下,我们可以使用 Vue.n…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部