Author: bugall
Wechat: bugallF
Email: 769088641@qq.com
Github: https://github.com/bugall

一: 函数中的引用传递

我们看下下面的代码的正确输出是什么

function changeStuff(a, b, c)
{a = a * 10;b.item = "changed";c = {item: "changed"};
}var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};changeStuff(num, obj1, obj2);console.log(num); // 10
console.log(obj1.item); // changed
console.log(obj2.item); // unchanged

在javascript中除了基础类型采用的是值(值类型有哪些)传递,而对象采用是引用传递。这就好理解为什么a的值没有被修改。

那为什么obj1的值修改了,但是obj2的值却没有被覆盖?当我们调用changeStuff函数的时候,参数b,c的值分别是obj1,obj2的引用。

当我们去修改的b的值的时候,因为b->obj1的引用关系没有变,所以实际修改的是obj1的值。但是参数c的情况就不同了,因为我们在函数中对c进行了引用的重新绑定,c = {item: "changed"} 这时候的c中的对象引用已经改变,这里要清楚引用和指针的关系。

二: 逻辑判断中的引用

通常我们会把==理解为值相同,把===理解为值相同且类型相同。

但是这种理解不是完全准确的。0=='' //true,直观理解上0怎么会等于''空字符串呢?因为在做==逻辑判断的时候js会把==两边的值做类型转换,然后再比较。

另外在javascript中比较奇葩的就是关于null,我很难理解为什么null支持比较呢?比如在SQL中我们是不能对null值直接比较的,通常都会使用is null or is not null来做判断。

如果我们把===理解为值相同,且类型相同那么就无法理解[1] === [1] // false的情况,因为[1]值相同,类型也相同。

我们应该怎么理解===

===不会判断值是否相同,只会判断===左右两边的变量保存的引用地址是否相同,我们一起看下例子

var a = [1,2,3];
var b = [1,2,3];
var c = a;var ab_eq = (a === b); // false 因为a,b的引用不同,
// 或者理解为a,b引用的对象在堆上不是同一个对象。var ac_eq = (a === c); // true 因为a保存了一份对象的引用,
// `c=a` c会把a的值copy一份,这是a,c的值(保存对象的引用)相同。 其实对于一个变量来说,包含了`左值`和`右值` 后面我会整理文章

类似的例子

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;var ab_eq = (a === b); // false type)
var ac_eq = (a === c); // true
var a = { };
var b = { };
var c = a;var ab_eq = (a === b); // false
var ac_eq = (a === c); // true

总结===的三种情况

对于整型 (numbers):
a === b // 如果值相同返回true对于引用类型来说:
a === b // 如果a,b保存的是同一个对象的引用返回true对字符串来说:
a === b // 左右两边的字符相同返回true

var1 == var2 结果图

三: const中的引用

我们首先看下官方的定义:

constant cannot change through re-assignment
constant cannot be re-declared

简单翻译就是:const定义的变量不能被重新定义,不能被重新赋值。
const 只能确保定义的变量的引用地址不会被改变。但是如果引用指向的
是一个对象的话,你是可以对对象里的值进行修改的,因为没有改变对象
自身的地址。

const x = {};
x = {foo: 'bar'}; // error - re-assigningconst y = ['foo'];
const y = ['bar']; // error - re-declaringconst foo = 'bar';
foo = 'bar2';       // error - can not re-assign
var foo = 'bar3';   // error - already declared
function foo() {};  // error - already declared

但是对于值的修改是允许的

const x = {};x.foo = 'bar';console.log(x); // {foo : 'bar'}const y = [];y.push('foo');console.log(y); // ['foo'];

理解Javascritp中的引用相关推荐

  1. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  2. java byreference_深入理解Java中的引用(一)——Reference

    深入理解Java中的引用(一)--Reference 本系列文章首先会介绍Reference类,为之后介绍的强引用.软引用.弱引用和虚引用打下基础. 最后会介绍虚引用在DirectBuffer回收中的 ...

  3. java引用传递_理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...

  4. 用“法外狂徒”理解C++中的引用

    目录 1.引用的概念 2.引用的特点 3.引用的使用 3.1 常引用 3.2 引用的使用场景 3.2.1 做参数 3.2.2 做返回值​       猜测一下代码的输出结果是什么? 3.2.3引用修改 ...

  5. 简单直白教你理解Java中四大引用强引用,软引用,弱引用,虚引用

    我属于自学型的,所以知识不够系统,只能是一边儿工作一边查漏补缺,在此要对那些写技术文章的人由衷的说句谢谢,谢谢各位大神们的分享 ONE,强引用(StrongReference) 概念介绍: 在此说明一 ...

  6. 理解Java中的弱引用(Weak Reference)

    理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...

  7. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

    十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...

  8. java的弱引用_理解Java中的弱引用(Weak Reference)

    本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出, ...

  9. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

最新文章

  1. 数字采购:企业互联网新引擎
  2. android布局之LinearLayout 转
  3. 线性筛选素数法(O(n)复杂度)
  4. VMware拍摄快照(系统备份)
  5. 【机器视觉】 measure_pos算子
  6. vscode kite插件_微软发布 VS Code Python 插件 7 月更新
  7. 李洪超 硬件工程师_西安职位|各类工程师,软件开发等多岗位招募,轻松月入过万,全程视频面试...
  8. Android RIL源码研究笔记 の ril (一)
  9. flex producer java_在 Logic Pro 中选取 Flex 与跟随设置
  10. python中yaml模块的使用_详解Python yaml模块
  11. Kubernetes初识
  12. Bearcat pomelo game 实战 -- treasures
  13. 地理加权回归GWR4.0软件下载与使用
  14. 机器学习算法——神经网络4(RBF神经网络)
  15. Oracle ORA-03113错误解决办法
  16. 交互设计[1]--设计心理学
  17. 服务器远程连接端口号修改
  18. 无线服务器功能,无线自组织互联网的用户管理——Radius服务器的功能设计与实现...
  19. 项目需求的重要性和开发步骤
  20. 城市大脑与超级智能城市建设规范研究

热门文章

  1. 服务器是什么系统_服务器自愈路由系统、单线以及BGP多线的区别是什么?
  2. HDU 6631 line symmetric(枚举)
  3. bzoj4919 大根堆
  4. 采用HttpModules来重写URLs(原理篇)转
  5. Tapable.plugin is deprecated. Use new API on `.hooks` instead
  6. jQuery—tab栏切换
  7. js(Dom+Bom)第八天
  8. Java爬取并下载酷狗音乐
  9. h5-plus.webview
  10. js 对已知数组数据的导出EXCEL