我的编程空间,编程开发者的网络收藏夹
学习永远不晚

js中值类型和引用类型的区别是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

js中值类型和引用类型的区别是什么

这篇文章主要介绍“js中值类型和引用类型的区别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js中值类型和引用类型的区别是什么”文章能帮助大家解决问题。

1.JavaScript中的变量类型有哪些?

(1)值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null  、symbol 

(2)引用类型:对象(Object)、数组(Array)、函数(Function) 

2.值类型和引用类型的区别

(1)值类型:

占用空间固定,保存在栈中(当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;栈中存储的是基础变量以及一些对象的引用变量,基础变量的值是存储在栈中,而引用变量存储在栈中的是指向堆中的数组或者对象的地址,这就是为何修改引用类型总会影响到其他指向这个地址的引用变量。)

保存与复制的是值本身

使用typeof检测数据的类型

基本类型数据是值类型

(2)引用类型:

占用空间不固定,保存在堆中(当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。)

保存与复制的是指向对象的一个指针

使用instanceof检测数据类型

使用new()方法构造出的对象是引用型

实例:

// 值类型:Number、string、bollean、undefinedvar a = 100var b = aa = 200console.log(b) // 100 保存与复制的是值本身    // 引用类型:对象、数组、函数、null(空指针)// 可以扩展属性var a = {age:20}var b = ab.age = 21console.log(a.age) // 21 // 利用typeof来区分typeof undefined // undefinedtypeof 'abc' // stringtypeof 123 // numbertypeof true // boolean// typeof 区分不出来引用类型(除了函数)typeof {} // objecttypeof [] // objecttypeof null // objecttypeof console.log //function // 用instanceof来区分引用类型 // 如果变量是给定引用类型(根据它的原型链来识别)的实例,那么instanceof 操作符就会返回 true。

console.log(person instanceof Object); // 变量 person 是 Object 吗?

console.log(colors instanceof Array); // 变量 colors 是 Array 吗?

console.log(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?

3. 几方面的区别举例:

(1)动态的属性: 定义基本类型值和引用类型值的方式是类似的。但是,当这个值保存到变量中以后,对不同类型值可以执行的操作则大相径庭。对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法,但是,我们不能给基本类型的值添加属性,只能给引用类型值动态地添加属性,以便将来使用。例如

var person = new Object();person.name = "Nicholas";alert(person.name); //"Nicholas"

(2)复制变量值: 如果从一个变量向另一个变量复制基本类型值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。

上述例子中,num1保存的值是5,当使用 num1 的值来初始化 num2 时,num2 中也保存了值 5。但 num2中的 5 与 num1 中的 5 是完全独立的,该值只是 num1 中 5 的一个副本。此后,这两个变量可以参与任何操作而不会相互影响。

var num1 = 5;var num2 = num1

复制基本类型的过程:

js中值类型和引用类型的区别是什么

当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上引用同一个对象。因此,改变其中一个变量,就会影响另外一个变量:例

var obj1 = new Object();var obj2 = obj1;obj1.name = "Nicholas";alert(obj2.name); //"Nicholas"

首先,变量 obj1 保存了一个对象的新实例。然后,这个值被复制到了 obj2 中;换句话说,obj1和 obj2 都指向同一个对象。这样,当为 obj1 添加 name 属性后,可以通过 obj2 来访问这个属性,因为这两个变量引用的都是同一个对象。
复制值类型的过程如下图:

js中值类型和引用类型的区别是什么

(3)传递参数:在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript 的概念来说,就是 arguments 对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

function addTen(num) {num += 10;return num;}var count = 20;var result = addTen(count);alert(count); //20,没有变化alert(result); //30

在函数内部,参数 num 的值被加上了 10,但这一变化不会影响函数外部的 count 变量。参数num 与变量 count 互不相识,它们仅仅是具有相同的值。

function setName(obj) {obj.name = "Nicholas";}var person = new Object();setName(person);alert(person.name); //"Nicholas"

为了证明对象是按值传递的,我们再看一看下面这个经过修改的例子:

function setName(obj) {obj.name = "Nicholas";obj = new Object();obj.name = "Greg";}var person = new Object();setName(person);alert(person.name); //"Nicholas"

如果 person 是按引用传递的,那么 person 就会自动被修改为指向其 name 属性值为"Greg"的新对象。但是,当接下来再访问 person.name 时,显示的值仍然是"Nicholas"。

这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写 obj 时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。

4. 变量计算--强制类型转换

// 字符串拼接var a = 100 + 10 //110var b = 100 + '10' //10010// == 运算符100 == '100' //true0 == '' //truenull == undefined //true// 语句var a = trueif(a){}var b = 100if(b){} // 把数字转换为truevar c = ''if(c){} // 把空字符串转换为false// 逻辑运算console.log(10&&0); // 0 把10转换成trueconsole.log('' || 'abc'); // 'abc' 把空字符串转换为falseconsole.log(!window.abc); // window.abc是undefined 把非undefined转换成true  //判断一个变量会被当做true还是falsevar a = 100console.log(!!a); // true

关于“js中值类型和引用类型的区别是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

js中值类型和引用类型的区别是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

js中值类型和引用类型的区别是什么

这篇文章主要介绍“js中值类型和引用类型的区别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js中值类型和引用类型的区别是什么”文章能帮助大家解决问题。1.JavaScript中的变量类型有哪
2023-07-02

C#中引用类型和值类型有什么区别

在C#中,引用类型和值类型是两种不同的数据类型。值类型是直接存储在堆栈中的数据,它们保存的是实际的数据值。当值类型的变量被赋值给另一个变量时,会复制该变量的值。常见的值类型包括整数(int)、浮点数(float)、布尔值(bool)等。
C#中引用类型和值类型有什么区别
2024-03-07

c#引用类型与值类型的区别是什么

这篇文章主要讲解了“c#引用类型与值类型的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c#引用类型与值类型的区别是什么”吧!解析:CLR支持两种类型:值类型和引用类型。用Jeff
2023-06-17

C#中的值类型与引用类型有什么区别

在C#中,值类型和引用类型是两种不同的数据类型,它们有以下区别:存储位置:值类型的变量直接存储在堆栈中,而引用类型的变量存储在堆中,堆中存储的是对象的实际数据,而堆栈中存储的是对象的引用。内存管理:值类型的内存分配和释放是由编译器自动处理的
C#中的值类型与引用类型有什么区别
2024-04-03

Java中引用类型和原始类型有什么区别

本篇文章给大家分享的是有关Java中引用类型和原始类型有什么区别,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。另
2023-06-17

javascript中原始类型和引用类型有什么区别

小编给大家分享一下javascript中原始类型和引用类型有什么区别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、区别(1)原始类型存储的是值,引用类型存储的
2023-06-15

C#基元类型、值类型、引用类型是什么

这篇文章主要讲解了“C#基元类型、值类型、引用类型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#基元类型、值类型、引用类型是什么”吧!首先了解下什么是基元类型,基元类型是编译器直接
2023-06-17

C#中如何使用值类型和引用类型

C#中如何使用值类型和引用类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1。变量:变量是指在程序的运行过程中随时可以发生变化的量。语法:数据类型 变量名2。常量:也称常数,
2023-06-17

Java中引用类型和值类型的示例分析

这篇文章给大家分享的是有关Java中引用类型和值类型的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.值类型传值,引用类型传引用Demo:public class ReferDemo { //pu
2023-06-03

mysql中bit和boolean类型的区别是什么

在MySQL中,BIT和BOOLEAN类型都用于存储逻辑值,但它们有一些区别。BIT类型:BIT类型用于存储比特位,可以存储多个比特位。BIT类型的存储空间取决于指定的长度,可以是1位到64位。BIT类型可以存储0或1,或者使用b’0’
mysql中bit和boolean类型的区别是什么
2024-04-09

Golang有类型常量和无类型常量的区别是什么

本篇内容主要讲解“Golang有类型常量和无类型常量的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang有类型常量和无类型常量的区别是什么”吧!场景在 Go 语言中,常量分为有
2023-07-05

C#中的预定义类型与引用类型是什么

今天小编给大家分享一下C#中的预定义类型与引用类型是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、预定义的值类型一个
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录