JavaScript是按值传递还是按引用传递?
JavaScript是按值传递的,但是要分情况才知道传递之后原来的值会不会变,不然会出现你想都想不出来的bug
一、按值传递--元类型输入
tip:元类型( number, string, boolean, null, undefined ) 传入的参数,无论函数内部怎样对其操作,调用传入的变量都不会受影响。
例如:
var arr = [1, 2, 3, 4]
var str = '1234' function guangboticao7 (input) {
input = input + '5678'
console.log('时代在召(zhaò)唤', input)
return input;
} console.log('第七套广播体操', guangboticao7(str), str);
输出值为 时代在召(zhaò)唤 12345678
二、按值传递--引用类型输入
又要分两种情况
1.当函数内部对其property(属性)做修改时,调用传入的变量会受影响,被改变!!!如下面代码的第八套广播体操,push(在末尾添加数组,返回索引号)传入的arr数组,arr会被改变。
2.当函数内部对arr为其重新赋值,即newValue!==oldValue(完全不相等),传入外部变量不会受影响,即不会被改变!!!如下面代码的第九套广播体操,arr为[1, 2, 3, 4, [5, 6, 7, 8]]时,函数内部重新赋值了,arr不会被改变,仍然输出[1, 2, 3, 4, [5, 6, 7, 8]]。且concat拼接数组,返回一个新数组。
例子代码:
var arr = [1, 2, 3, 4] function guangboticao8 (input) {
return input.push([5, 6, 7, 8])
} function guangboticao9 (input) {
input = '2234'
return [input].concat([5, 6, 7, 8])
} console.log('第八套广播体操', guangboticao8(arr), arr)
//输出 "第八套广播体操" 5 [1, 2, 3, 4, [5, 6, 7, 8]] console.log('第九套广播体操', guangboticao9(arr), arr)
// "第九套广播体操" ["2234", 5, 6, 7, 8] [1, 2, 3, 4, [5, 6, 7, 8]]
总结:js是按值传递,但是以防混淆,通常分为三种情况
1.元数据类型为传递值时,当当内部函数对传递值做了任何的修改,都不会改变其外部的传递值。
2.引用数据类型为传递值时,当内部函数对传递值做了属性修改,即push(),unshift(),concat(),pop(),shift(),splice(),slice(),reverse(),sort()就会使得传递值改变。
3.引用数据类型为传递值时,当内部函数对传递值重新赋值,即使得newValue!==oldValue(完全不相等),传递值不会被改变。
练习题:
var liLei = { name: 'Li Lei'}
var hanMeimei = { name: 'Han Meimei'}
var jim = {name: 'Jim' }
var students = [ liLei, hanMeimei ]
function change (s) {
s[0] = jim;
s[1].name = 'Lucy'
}
change(students);
console.log(students)
console.log(liLei)
console.log(hanMeimei)
console.log(jim)
结果是??!!!!
参照知乎:https://zhuanlan.zhihu.com/p/24080761
JavaScript是按值传递还是按引用传递?的更多相关文章
- JavaScript中函数参数的按值传递与按引用传递(即按地址传递)
首先声明一句:JavaScript中所有函数的参数都是按值传递的!不存在按引用传递! 在讲传递参数之前我们先来讲一下指针. 学过C指针的应该都知道,指针变量中保存的是一个地址,程序可以根据所保存的地址 ...
- JavaScript并非“按值传递”
置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<拥Bootstrap入怀--模态框(modal)篇> 作者主页:myvin 博主QQ:85139910 ...
- js按值传递和按引用传递
摘要:js的数据类型有种划分方式为 原始数据类型和 引用数据类型. 原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置.栈区包括了 变量的标识符和变量的值. ...
- PHP中对象是按值传递还是按引用传递?
1.首先,什么是按值传递和按引用传递? 按值传递就是仅仅把值传递过去,相当于传递的是值的拷贝,而按引用传递传递的是内存的地址. 在 PHP5 中,如果按引用传递,就是将 zval 的地址赋给另一个变量 ...
- Java参数按值传递?按引用传递
有时候在想,java在调用方法时候究竟是按值传递还是按引用传递,之前有人说是基本数据类型按值传递,引用类型按引用传递.一时间,似乎都有道理. 笔者在此不追究字眼上的辨别识字能力,把自己对这个问题的理解 ...
- JS是按值传递还是按引用传递?【转载】
最近遇到个有趣的问题:“JS中的值是按值传递,还是按引用传递呢?” 在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference). ...
- Java的按值传递和按引用传递解说
在网上看到的一个帖子解释Java的按值传递和按引用传递,感觉挺全面,就转过来,以供以后学习参考: 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- JavaScript对象按值传递
1.示例 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF- ...
- 编程细节 —— 按值传递、按引用传递(final、const)
System.out,out 是 System 类内定义的静态 final PrinterStream 变量: public final class System { ... public final ...
随机推荐
- 汇编:MSR/MRS/BIC指令
1.MRS指令MRS指令的格式为:MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)MRS指令用于将程序状态寄存器的内容传送到通用寄存器中.该指令一般用在以下两种情冴: Ⅰ.当需要改 ...
- 27.8 执行定时计算限制操作(Timer)
private static System.Threading.Timer s_Timer; static void Main() { Console.WriteLine("checking ...
- 1.Linux入门介绍
1.1 Linux概述 1.1.1 Linux简要介绍 Linux的由来: Linux的内核最初是由芬兰人李纳斯·托瓦茨在上大学的时候编写的一个内核,它是基于Unix操作系统编写的 大多服务器使用的是 ...
- 洛谷——P1063 能量项链
P1063 能量项链 题目描述 在MarsMars星球上,每个MarsMars人都随身佩带着一串能量项链.在项链上有NN颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对 ...
- linux获得网卡信息
#define MAX_INTERFACE 64 int showifs() { int i; int rc; int sock; int ifnum; struct ifreq ifr[MAX_IN ...
- 8.2.3 操作MySQL数据库
Python访问MySQL数据库可以使用MySQLDb模块,该模块主要方法如下: (1)commit():提交事务. (2)rollback():回滚事务. (3)callproc(self,proc ...
- 6.3.4 使用marshal 模块操作二进制文件
Python 标准库 marshal 也可以进行对象的序列化和反序列化,下面的代码进行了简单演示. import marshal x1 = 30 x2 = 5.0 x3 = [1,2,3] x4 = ...
- 平衡树前置——BST
上一节:平衡树——序 BST(Binary Search Tree)二叉排序树,其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值 ...
- vue+better-scroll 下拉刷新,上拉加载更多
better-scroll 来做下拉刷新和 上拉加载 特别方便. 安装好vue脚手架和better-scroll 之后 直接复制粘贴就可以看到效果了 <template> <div ...
- 2.1.4、SparkEnv中创建BroadcastManager
Broadcast是分布式的数据共享,由BroadcastManager负责管理其创建或销毁.Broadcast一般用于处理共享的配置文件.通用Dataset.常用数据结构 通过SparkContex ...