关于面试遇到一些问题没答对的整理

js中值传递与引用传递

做一些基础题还是会有很多问题,只能说基础不扎实呀。回想做前端的2年时间里,业务做得不少,熟练度直线提升,然而归纳总结寥寥无几。这让我又想起了,之前看到关于为什么写技术博客的原因。突然深深地体会到,不去花时间总结,平时业务上用到的零散知识点就很难形成体系,另外,仅仅只是在业务上碰到问题,查找解决方案,然后把问题解决了就带过,这样的学习方式是非常危险的。面试中频频碰壁,基础是关键。按照我现在的认识,现阶段做业务是必须的,遇到问题,查找解决方案,确定知识点,业余时间深入去学习该知识点,形成自己的理解。另外时不时去回顾下基础的书籍,从而形成自己的知识体系。所以,这周开始重新翻一遍js高程的基础。
面试问到这么一道题:

 		let a=1;
        function changeValue(value){
           value++;
        }
        changeValue(a);
        console.log("value--",a);
        ```
 a 的值变不变?
  一脸懵逼,平时总是搬砖了,就怕碰到这样的题
  回来之后试了一下
  结果是1不变,说明是引用传递
  

let a={};
a[“name”]=“a”;
function changeValue(value){
value.name=b;
}
changeValue(a);
console.log(“a-value–”,a);

结果是“b”;
这是不是涉及到数据类型方面的知识了呢;
当时做游戏项目时克隆一个数组,直接赋值一个数组,原数组值也跟着改变;
在JS中,每一个数据都需要一个内存空间。内存空间又被分为两种:
***栈内存(stock)
堆内存(heap)***

 

 - 基础数据类型和栈内存

 		JS中的基础数据类型,我们也称之为原始数据类型,这些值都有固定的大小,往往都保存在栈内存中,由系统自动分配存储空间。我们可以直接操作保存在栈内存空间的值,因此基础数据类型都是按值访问。也就是说,它们的值直接存储在变量访问的位置。
数据在栈内存中的存储与使用方式类似于数据结构中的堆栈数据结构,遵循后进先出的原则

 - 引用数据类型与堆内存
			与java等其他语言不同,JS的引用数据类型,比如数组Array,它们值的大小是不固定的,可以再不声明长度的情况下,动态填充。引用数据类型的值是保存在堆内存中的对象。
			JavaScript不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。
在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。
这里的引用,我们可以粗浅地理解为保存在栈内存中的一个地址,该地址与堆内存的实际值相关联。
	

let a={};
a[“name”]=“aaa”;
function changeValue(value){
value.name=“bbbb”;
var value=new Object();
value.name=“ccc”;
}
changeValue(a);
console.log(“a-value–”,a);

结果是b;
这说明函数内部只是对他进行浅克隆了一下,然后对其进行操作,
在网上还看到一种叫 按共享传递 的说法,而且特别好理解。
大致概念是这样的:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。 它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。

可以回过头去看之前的例子,每个都符合用共享传递的概念去进行参数传递。关键是特别好理解,说的通俗点就是 先复制参数,然后把复制的这个放函数里面去折腾。
  参考自:
 	 [js克隆](https://www.jianshu.com/p/2a3728cded4c?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin)
[js函数传参是按值传递还是按引用传递?](https://www.cnblogs.com/zareb/p/5699571.html)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值