javascript原始值和引用值类型及区别
原始值和引用值类型及区别
首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变。
原始值(简单数据类型)
存储在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。包含五种:undefined,null,boolean,number和string,可以通过typeof来判断某数据是何简单数据类型。
引用值(复杂数据类型)
存储在堆中的对象,放在变量的栈空间中的值是该对象存储在堆中的地址,也就是说,存储在变量处的值是一个指针(内存地址),指向存储对象的堆内存中,包含Object,array,function等
区别:1.简单数据类型的值是储存在栈中,当把一个变量传递给另一个变量时,是把一个栈中的东西复制到另一个栈中,并且这两个变量互不影响,修改其中的变量值时不会改变另一个变量的结果。
var a=10
var b=a
a=1
console.log(b)//10
2.引用值是把引用变量的名称存储在栈中,但是把实际对象存储在堆中,栈中的内存地址指向堆中的实际对象,当把引用对象传递给另一个变量时,复制的其实是指向实际对象的指针(内存地址),此时两者指向的是同一个数据,若通过方法改变其中一个变量的值,则另一个变量的值也会改变,因此,js中对象的复制是默认引用赋值的。
const obj1={
name:'xiaoming'
}
const obj2=obj1
obj2.name='xiaohong'
console.log(obj1)//xiaohong
也是因为上述特点,es6中,const是声明常量的,赋值后,该值不可改变。
const PI=3.14 PI=2.14//报错 console.log(PI) //但是
const obj1={
name:'xiaoMing'
} obj1.name='xiaoHong'
console.log(obj1.name)//xiaoHong
这也是因为,const声明的obj1指向的是栈中的内存地址,此地址不可被修改,但是堆中存储的数据它是管不着的。
小明的妈妈让小明看门,家里的东西被偷光了,门还在。
如果你想复制赋值,另外一个值不会随它改变而改变,则必须重新分配对象,此时,该值的原指针(内存地址)改变,则另外一个值不会随它的改变而改变。
var obj1={
name:'xiaoMing'
}
var obj2=Object.assign({},obj1) obj2.name='xiaoHong'
console.log(obj1)
console.log(obj2)
javascript原始值和引用值类型及区别的更多相关文章
- JavaScript数据操作--原始值和引用值的操作本质
我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值. 首先明确,值和类型是两 ...
- JS中原始值和引用值的储存方式
在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfine ...
- Js 中的原始值和引用值
最近遇写 node.js 时到一个问题,把对象当赋值给数组成员时总是出错,比如下面的代码, var Arr = new Array(); var Obj = new Object(); for(var ...
- ECMAScript 原始值和引用值
原始值和引用值 在ECMAScript中,变量可以存在两种类型的值,即原始值和引用值 原始值 存储
- JS中原始值和引用值分析
JS中变量中两种类型的值:原始值,引用值 原始值是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. var x = 1; //1就是一个原始值,变量x中存放的就是原始 ...
- ES6 学习笔记(三)原始值与引用值
总结: 1.原始值,表示单一的数据,如10,"abc",true等. 1.1. ES的6种原始值: Undefined.Null.Boolean.Number.String.Sym ...
- JavaScript-原始值和引用值
一.原始值和引用值的概念 在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 1.1 原始值 (1)原始值指的是 原始类型 的值,也叫 基本类型,例如 Number.Stirn ...
- JavaScript检测原始值、引用值、属性
上周写过一篇读书笔记<编写可维护的JavaScript>之编程实践,其中 第8章 避免『空比较』是博主在工作中遇坑较多的雷区,所以特此把该章节重新整理分享,希望大家不再坑队友(>﹏& ...
- JS浅谈原始值与引用值操作
值的操作分为三大类:复制,传递,比较 一:复制 原始值 let a = 10; let b = a; 注释:2018-7-30 17:33:49 1 原始类型的值都是存放在栈内存当中,所以他们的赋值操 ...
随机推荐
- Selenium-IDE在火狐上的扩展
昨天突然想学学 Selenium,就上网查了一些介绍,发现一些教程基本都是比较老版本的了,使用起来略有不便,所以今天试着写一些最新版本的.请参考Selenium官网.文章以下内容都是在 Mac 机器上 ...
- adjust, administer
adjust to just, exact. In measurement technology and metrology [度量衡学], calibration [校准] is the compa ...
- Java读文件写入kafka
目录 Java读文件写入kafka 文件格式 pom依赖 java代码 Java读文件写入kafka 文件格式 840271 103208 0 0.0 insert 84e66588-8875-441 ...
- Ecshop 后台导出订单Excel时, 内存溢出的解决方法
今天继续跟大家分享一下,在我配置Ecshop时的问题. 今天的问题是在后台想要导出订单列表Excel时出现的内存溢出.错误提示如下 问题: Fatal error: Allowed memory s ...
- centos7 自动同步时间
rm -rf /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime vim /etc/sysconfig/cloc ...
- zabbix之二进制安装
#:参考官方网站 https://www.zabbix.com/documentation/4.0/manual/installation/install_from_packages/debian_u ...
- JavaBean的命名规则
JavaBean的命名规则Sun 推荐的命名规范1 ,类名要首字母大写,后面的单词首字母大写2 ,方法名的第一个单词小写,后面的单词首字母大写3 ,变量名的第一个单词小写,后面的单词首字母大写为了使 ...
- redis入门到精通系列(八):redis的高可用--主从复制详解
(一)主从复制介绍 前面所讲的关于redis的操作都属于单机操作,单机操作虽然操作简单,但是处理能力有限,无法高可用.所谓高可用性,就是指当一台服务器宕机的时候,有备用的服务器能顶替上,在单机操作上这 ...
- Linux单机安装Zookeeper
一.官网 https://zookeeper.apache.org/ 二.简介 Apache ZooKeeper致力于开发和维护开源服务器,实现高度可靠的分布式协调. ZooKeeper是一种集中式服 ...
- SpringBoot中使用JUnit4(入门篇)
添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...