首页 > 试题广场 >

执行以下程序,输出结果为() function fn(o,v

[单选题]

执行以下程序,输出结果为()

function fn(o,val){

           o.b = 1;

           val = 1;

}

var obj = {b:0};

var num = 0;

fn(obj,num);

console.log(obj,num);


  • {b:0} 0

  • {b:1} 0

  • {b:0} 1

  • {b:1} 1

此题主要考察的是从一个变量向另一个变量复制基本类型的值和引用类型的值时的不同:
function fn(o,val){
  o.b = 1; //修改o指向的对象{b:0}中的属性b的值,对象变为{b:1}
  val = 1; //修改局部变量val的值为1,不会影响全局变量num的值
}
var obj = {b:0}; //引用类型的变量obj指向对象{b:0}
var num = 0; 
fn(obj,num); //将obj的引用地址复制给fn函数的形参o,此时obj和o指向同一个对象{b:0};将num的值复制一份赋值给val
console.log(obj,num); //打印全局变量obj指向的对象,此时被修改为{b:1};打印全局变量num值,还是0

发表于 2021-12-10 15:51:20 回复(4)
基本数据类型:存储在栈中的简单数据段;
 引用数据类型:存储在堆中的对象,存储在栈中的值是一个指针,指向 存储对象的内存地址。

function fn(o,val){ //函数传参   形参o为引用数据类型   val为基本数据类型

           o.b = 1; // 此处的o和函数外的obj共用一个内存地址(相互影响),修改o(指针改变,但内存地址没变),函数外面的 obj也会改变

           val = 1; // val为基本数据类型  在函数内修改值不会影响函数外面的基本数据类型(互不影响)

}

var obj = {b:0};

var num = 0;

fn(obj,num);

console.log(obj,num);  //传实参

发表于 2022-01-21 22:16:31 回复(0)
对象传址,基本类型数据传值(副本)
发表于 2022-07-27 09:00:38 回复(1)
浅拷贝的时候,如果是基本数据类型就拷贝基本数据类型的值,改变一个另一个不受到影响;如果是引用数据类型的值,拷贝的是地址,改变一个,另一个随之改变
发表于 2023-04-08 21:57:02 回复(0)
就近原则找变量,所以就用这个作用域中的变量,但是这个作用域中的变量是if之后赋值的,所以是undefined
发表于 2022-04-12 11:41:16 回复(0)