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

原文地址:https://www.cnblogs.com/echo-hui/p/9217207.html

时间: 2024-11-09 00:36:32

JavaScript是按值传递还是按引用传递?的相关文章

JavaScript 是按值传递还是按引用传递的

今天又回顾了一下js基础,发现自己很渣,后来看了一下js函数啊的传递,那么js到底是按值传递还是按引用传递呢?(本人新手一枚,如果有什么不正确的地方,还请各位大神指点博正) 答案是肯定的,按值传递. JS所有的函数参数的传递都是按值传递的,而引用类型传递的也是一个值(指向堆内存中的对象的指针副本),这里只说引用类型的传递. 先给大家看一个比较常见的,让人误解为引用传递的. function changeObj(o){ o.name = "changeobj"; } var p = {}

JavaScript中函数参数的按值传递与按引用传递(即按地址传递)

首先声明一句:JavaScript中所有函数的参数都是按值传递的!不存在按引用传递! 在讲传递参数之前我们先来讲一下指针. 学过C指针的应该都知道,指针变量中保存的是一个地址,程序可以根据所保存的地址访问内存中对应的值并进行操作,如下图: 其中地址为0x00000016保存的是一个地址,指向地址0x00000036,即0x00000016被开辟为一个指针变量,可以引用0x00000036地址的值,这是按引用方式访问变量:另外一种访问变量的方式是按值访问,即图中0x00000008地址. 在Jav

按值传递和按引用传递

ECMAScipt中所有函数的参数都是按值传递的.也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样. 在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(形参,arguments对象中的一个元素).而传递引用类型的值,会把这个值在内存的地址复制给一个局部变量,因此当局部变量的变化会反映在函数的外部. Javascript代码 : function addTen(num){  num+=10; return num; } var count=10; v

js按值传递和按引用传递

摘要:js的数据类型有种划分方式为 原始数据类型和 引用数据类型. 原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置.栈区包括了 变量的标识符和变量的值. 引用数据类型 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处.放在栈空间中的值是该对象存储在堆中的地址. 按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本.修改形参的值

关于php按值传递和按引用传递问题

首先让我们来看一段代码: 01 <!--?php 02 $a = 111; 03 $b = 222; 04 function cz(& $a,$b){ 05         $a += $b; 06         $b += 4; 07     } 08 cz($a,$b); 09 echo '$a='.$a.'</br---->'; 10 echo '$b='.$b; 11 ?> 这段代码,首先在函数cz外定义了两个变量$a和$b,然后在函数cz内,对两个变量进行了相应

C# 按值传递与按引用传递的区别

一.引言 C#中参数的传递方式可以分为两类,按值传递和按引用传递.如果再根据参数的类型进行细分,大致可以分为如下四种: 值类型的按值传递 引用类型的按值传递 值类型的按引用传递 引用类型的按引用传递 string类型作为一种特殊的引用类型,部分人认为在作为参数进行传递的时候,它的表现与其他的引用类型是不一致的.但是透过现象看本质,我们深入分析一下,就会发现,在作为参数进行传递方面,string类型与其他的引用类型是没有区别的. 二.四种传递方式解析 1. 值类型的按值传递 按值传递时,传递过去的

java中按值传递和按引用传递问题

相信对很多初学java的人来说这个问题还是很重要,因为不同于C,C++,java明确说明取消了指针,因为指针往往是再带来方便的同时也是导致代码不安全的根源,而且还会使得程序变得非常复杂和难以理解.java放弃指针只是在java语言中没有明确的指针定义,实质上,每一个new语句返回的都是一个指针的引用.只不过在大多数时候java不用关心如何操作这个"指针",更不像在操作C++的指针那样胆战心惊,唯一要多注意的是在给函数传递对象的时候.所以,初学java的人不必花费太多精力去了解,但是对于

java中的按值传递和按引用传递

先使用int实验: public class TTEST { private static List<UserEntity> mList = new LinkedList<UserEntity>(); public static void main(String[] args) { int a = 0; changeA(a); System.out.println("a = "+a); } public static void changeA(int a){ a

javascript传递参数如果是object的话,是按值传递还是按引用传递?

作者:苏墨橘链接:https://www.zhihu.com/question/27114726/answer/35481766来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 之前第一次看到这部分的时候也有点云里雾里,今天看到题主问这个问题又仔细地看了一遍,查阅了相关资料,现在算是比较清楚了. 结合自己的理解整理了一下. 因为要彻底说清楚这个问题就涉及一些更深入的知识点,所以篇幅较长,望耐心看完. 其实你只要弄清楚一点就可以了:保存对象的变量,它里面装的值是这个对