代码
/**
* 基本数据类型:string, number, boolean, null, undefined。
*
* 说明:
* 基本数据类型的变量是保存在栈内存中的,基本数据类型的值
* 直接在栈内存中存储,值与值之间是独立存在的,修改一个变量不
* 会影响其他的变量。
*
* 比较:
* 当比较两个基本数据类型的值时,本质上是比较值
*/
// 创建number型变量a值为1
var a = 1;
// 将变量a赋值给变量b,本质是值的拷贝
var b = a;
console.log(`a = ${a}, b = ${b}`); // a = 1, b = 1
// 将b的值加1,重点查看a的值是否变化
b += 1;
console.log(`a = ${a}, b = ${b}`); // a = 1, b = 2 // 创建number型变量c值为1
var c = 1;
// 本质上是值的比较
if (a == c) {
console.log(`a与c的值相等, a = ${a}, c = ${c}`); // a与c的值相等, a = 1, c = 1
} else {
console.log(`a与c的值不相等, a = ${a}, c = ${c}`);
} /**
* 引用类型:object
*
* 说明:
* 对象是保存在堆内存中的,每创建一个新的对象,就会在堆内存
* 中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用
* ),如果两个变量保存的是同一个对象引用,当修改其中一个变量修改
* 属性时,另一个也会受到影响。
*
* 比较:
* 当比较两个引用数据类型时,本质上是比较的对象的内存地址,如
* 果两个对象的属性是一模一样的,但是地址不同,也会返回false。
*/
// 创建obj1为Object的对象
var obj1 = new Object();
// 新增属性foo,并赋值'bar'
obj1.foo = 'bar';
console.log(obj1); // {foo: "bar"} // 将obj1赋值给obj2,本质是地址的拷贝
var obj2 = obj1;
console.log(obj2); // {foo: "bar"} // 修改obj2,新增属性viva
obj2.viva = 'ovov';
// obj1与obj2同时改变
console.log(obj1); // {foo: "bar", viva: "ovov"}
console.log(obj2); // {foo: "bar", viva: "ovov"} // 修改obj1属性foo的值为'kiki'
// obj1与obj2同时改变
obj1.foo = 'kiki';
console.log(obj1); // {foo: "kiki", viva: "ovov"}
console.log(obj2); // {foo: "kiki", viva: "ovov"} // 删除obj2的属性viva
delete obj2.viva;
// obj1与obj2同时改变
console.log(obj1); // {foo: "kiki"}
console.log(obj2); // {foo: "kiki"} // 将obj2设置为null
obj2 = null;
// 只有obj2被设置为null,obj1没有发生变化
console.log(obj1); // {foo: "kiki"}
console.log(obj2); // null // 创建obj3为Object的对象
var obj3 = new Object();
// 新增属性foo
obj3.foo = 'kiki';
// 两者的对象和属性都一样
console.log(obj3); // {foo: "kiki"}
console.log(obj1); // {foo: "kiki"} // 比较obj1与obj3
// 本质是比较obj1与obj3保存的内存地址是否相同
if (obj1 == obj3) {
console.log('obj1与obj3相等');
} else {
// 可以看出尽管obj1与obj3的属性和值都一样,但是两者还是不等
// 本质上是因为obj1与obj3保存的地址不相同
console.log('obj1与obj3不相等'); // obj1与obj3不相等
}
总结

查看源代码

js中基本数据类型与引用数据类型的本质区别的更多相关文章

  1. js中基本数据类型和引用数据类型的区别

    1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变 ...

  2. js原始数据类型和引用数据类型=>callback数据传输原理

    摘要:js的数据类型有种划分方式为 原始数据类型和 引用数据类型. 原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置.栈区包括了 变量的标识符和变量的值. ...

  3. JS基本数据类型和引用数据类型的区别及深浅拷贝

    前言 首先我们先来了解一下什么叫栈堆,基本数据类型与引用数据类型 1.栈(stack)和堆(heap)stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动 ...

  4. JS基本数据类型和引用数据类型区别

    1.栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动释放 2.数据类型 JS分两种数据类型: 基本数据类型:Numb ...

  5. js的基本数据类型与引用数据类型

    基本数据类型与引用数据类型 基本数据类型有五种 /* 基本数据类型有: - String - Number - Boolean - Null ** typeof null === 'object' 这 ...

  6. JavaScript中基本数据类型和引用数据类型的区别(栈——堆)

    JavaScript中基本数据类型和引用数据类型的区别 1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据 ...

  7. js 原始数据类型、引用数据类型

    js的数据类型划分方式为 原始数据类型和 引用数据类型 栈: 原始数据类型(Undefined,Null,Boolean,Number.String) 堆: 引用数据类型(对象.数组.函数) 两种类型 ...

  8. JAVA中分为基本数据类型及引用数据类型

    一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...

  9. JavaScript中基本数据类型和引用数据类型的区别

    1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变 ...

  10. 【转】HashMap集合中key只能为引用数据类型,不能为基本类型

    在HashMap中,为什么不能使用基本数据类型作为key? 其实和HashMap底层的存储原理有关,HashMap存储数据的特点是:无序.无索引.不能存储重复元素. 存储元素采用的是hash表存储数据 ...

随机推荐

  1. CF1244C

    题目描述 给出n,p,w,d,求(x,y,z)使得 xw+yd=p x+y+z=n 其中d<w<10^5^ 题解 显然扩欧啊( 来自天国的long long y如果大于等于w,则显然可以把 ...

  2. 730KII 打印机 Win7 2017年11月更新系统补丁后无法打印

    卸载11月份编号为KB4048960的系统更新

  3. CF889E Mod Mod Mod

    http://codeforces.com/problemset/problem/889/E 题解 首先我们观察到在每次取模的过程中一定会有一次的结果是\(a_i-1\),因为如果不是,我们可以调整, ...

  4. 使用xshell远程连接Linux

    Linux系统对于程序员来说并不陌生,对IT技术员来说是一个很好的开发平台,因此掌握Linux系统的操作对于一个程序员来说非常有用.而对于习惯使用windows的人来说直接在Linux系统下进行操作感 ...

  5. Python 代码控制Windows定时关机

    为了在规定时间内实现电脑关机,我使用python编写了几行代码,最简单的实现了关机操作,后续再进行其它功能的添加(操作页面,取消等) import os,time #获取命令行输入的关机时间 inpu ...

  6. Node - 模块加载与 lerna 提升

    从node_modules 加载模块的过程 如果要加载的模块非核心模块,并且路径不是'/'. '../'和'./'开头,这个模块就会从当前文件夹递归向上在node_modules文件夹中寻找这个模块. ...

  7. js面向对象程序设计之继承

    在面向对象语言中继承分成两种:接口继承和实现继承.解释一下,接口继承只继承方法的签名,而实现继承则是继承实际的方法.但是ECMAScript中的函数没有签名所以无法进行接口继承,只能是实现实现继承.而 ...

  8. TCP为什么要三次握手和四次挥手

    http://www.jellythink.com/archives/705 简析TCP的三次握手与四次分手 https://zhuanlan.zhihu.com/p/24001696 计算机网络面试 ...

  9. vue-router路由如何实现传参

    tip: 用params传参,F5强制刷新参数会被清空,用query,由于参数适用路径传参的所以F5强制刷新也不会被清空.(传参强烈建议适用string) 也可以选用sessionstorage/lo ...

  10. 006/搭建fabric(二)

    准备vmware虚拟机,并安装完ubuntu系统后.继续搭建fabric运行环境... 0.打开终端,切换root身份.目的:后续操作即可不用sudo... 右键->open Terminal- ...