几个面试题
// 函数传递,值类型
// 示例1:
var name = 'aaa'
function modifyName(name){
name = "bbb"
}
modifyName(name)
console.log(name);
// 示例2:
function addNum(num){
num += 10;
return num
}
var num = 10;
var result = addNum(num)
console.log(num);
console.log(result);
// 函数传递,引用类型
// 示例1:
function setObj(obj){
obj.name = "bbb" // 1
obj = {} // 2
obj.name = "ccc" // 3
}
var obj = {
name: "aaa",
age: 18
}
setObj(obj)
console.log(obj);
清先思考再看答案
"aaa"
10
20
{name: "bbb", age:18}
解析题目
首先看一下函数的值类型和引用类型
基本类型与引用类型
变量的复制:
基本类型:克隆一个,两者完全独立,只是值一样而已
引用类型:克隆指针,两者指向同一个地址,修改的话都会变。
如果想要深克隆,即如果是对象的话,也完全独立,请参照:https://www.jianshu.com/p/1f7444a52ac0
根据以上,我们可以看一下上边的面试题
值类型示例2解释如下:
num是值类型,作为函数参数传递的时候,是将此值复制一份传递给函数,这两个是完全独立互不影响的。所以在执行时,num本身的值没有变,改变的是被复制的。
示例1同理。
引用类型示例1解释如下:
在JavaScript中,当obj作为函数参数传递时,传递的是引用,也就是内存地址。所以在函数中修改的对象实际上是函数外边那个对象。
解释:在函数的内部我们标注了1,2,3,一共三行。
因为函数参数是引用传递时,只传递了指针。
第一行,将指向name的参数改变,即obj.name变了
第二行,整个obj都变了,这时候就会开辟一个新的空间,且有一个新的obj对象,指向另一个空间
第三行,就是对新的obj对象的修改了。
注意:在实际开发中,我们应当避免这种写法。因为会造成全局作用域的污染。









网友评论