【Day19】传值和传址(传参考)

传值(Call by value)

在 JavaScript 中,只有原始型别为传值(Call by value)

范例:

var a = 100;
var b = a;  // 复制 a 的值,并赋予给 b

b -= 10;  // 修改 b 的值

console.log(a, b);  // 100 90

从范例中 a 为原始型别,

var b = a 会复制 a 的值来建立新增记忆体位址,

并且让 b 指向新增记忆体位址当中,

也就是说 ab 都有各自的记忆体位址,

因此修改 b 的值时,a 不会一并修改,

这称之为传值(Call by value)

图解:

传址(Call by reference)

也称为传参考,在 JavaScript 中,

只有物件型别为传址(Call by reference)

范例:

var a = {
    name: '小明',
};

var b = a;

b.name = 'weiwei';

console.log(a);  // {name: 'weiwei'}
console.log(b);  // {name: 'weiwei'}

该范例中 a 为物件型别,

var b = a 会让 b 指向 a 的记忆体位址,

因为指向的记忆体位址相同,

因此当 ab 的内容被修改时,

这两个变数的值都一起会被修改,

这称之为传址(Call by reference)

图解:

再看一个范例:

var family = {
    name: '小明',
    members: {
        dad: 'dad',
        mom: 'mom',
    }
};

var member = family.member;

member = {
    name: 'weiwei',
};

console.log(member);  // {name: 'weiwei'}
console.log(family.members);  // {dad: 'dad', mom: 'mom'}

该范例结果能看到 memberfamily.members 的值不一样

那是因为我们在 member = {name: 'weiwei'} 时,

已经将记忆体位址已经指向 {name: 'weiwei'} 了,

因此结果会不一样

图解:

以上就是传值和传址的内容,感谢观看!!


<<:  【第十九天 - Binary Tree题目分析】

>>:  1.3 Design System - 包含哪些项目要做?

Laravel:Route Wildcards 2

前言 Laravel:Route Wildcards - iT 邦帮忙::一起帮忙解决难题,拯救 I...

[Day 03] if条件、缩排规则、函式写法,以及一些字串技巧

[ 30 Days of ML Challenge | D03] 今天提供一个文件以及一个练习教材,...

[Day05] CH03:各式运算子(下)

接续昨天的运算子(Operator): 等值运算子 Java操作 运算子 等於 == 不等於 != ...

Day-15 Excel图表介绍

结束了为期三天的枢纽分析表,接着进到另一大主题,图表 (>ε<) 相信大家都知道图表可以让冗长的资数...

[想试试看JavaScript ] 阵列一些操作阵列好用的方法

阵列一些操作阵列好用的方法 这篇整理一些常用的阵列方法 push() push 可以新增元素在阵列的...