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'];