Giter VIP home page Giter VIP logo

Comments (11)

pingfengafei avatar pingfengafei commented on July 21, 2024 23

掉坑里了。
输出结果依次是:
1 2 {name: 'jirengu'} {age: 2}

答案在pdf版红宝书的第66页:
ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。

以下是我的理解:
对于基本数据类型(Number,Bool,String,null,undefined,Symbol)直接复制参数的值。函数内部对参数的修改都不会影响到实参的值。
例如:

function test(a,b){
  a = 1;
  b = 2;
}
var a = 111;
var b = 222;
test(a,b);
console.log(a,b);  //111  222

var s1 = Symbol('111');
var s2 = Symbol('222');
test(s1, s2);
console.log(s1, s2);  /// Symbol(111)  Symbol(222)

有趣的是第二种情况,参数是非基本数据类型:对象
此时,传递的是实参的地址。
在test()里,x,y完成了地址的交换,此时x = {age: 2}, y = {name: 'jirengu'} (x指向的是{age:2}的内存地址),obj1,obj2指向的还是原先的内存地址,所以结果没变。

function swap(x, y){
  var temp = x;
  x = y;
  y = temp;  
  console.log(x,y);
}

var obj1 = {name: 'jirengu'}
var obj2 = {age: 2}
swap(obj1, obj2)  

此时,如果在swap内部改变xy的值,将会直接改变obj1,obj2的值。这是因为obj1和x指向{name:'jirengu'}的内存地址,x或obj1任意一个改变,都会导致指向的内存地址的内容发生变化。
例如:

function swap(x, y){
  x.name = '111';
  y.age = 3;
}


var obj1 = {name: 'jirengu'}
var obj2 = {age: 2}
swap(obj1, obj2)
console.log(obj1)  //输出什么
console.log(obj2)  //输出什么

from frontend-interview.

Cedric-song avatar Cedric-song commented on July 21, 2024 9

JavaScript按值传递。over

from frontend-interview.

giscafer avatar giscafer commented on July 21, 2024 6

考点在第二个

//函数的参数x, y是定义好的,此时函数的局部变量var x=undefined,var y=undefined,传参obj1,obj2后,就是x=obj1,y=obj2引用赋值
function swap(x, y){
  var temp = x;//temp引用赋值,引用指向obj1的值
  x = y; //x引用改为y的引用
  y = temp;  //y的引用改为temp的引用。
//所以:
//这里内部变量x和变量y只是互换了引用,和函数外部变量obj1与obj2没有关系。
//如果这里输出console.log(x,y),结果是x = {age: 2}, y = {name: 'jirengu'} 

}
var obj1 = {name: 'jirengu'}
var obj2 = {age: 2}
swap(obj1, obj2)//外部输出 {name: 'jirengu'} {age: 2}

from frontend-interview.

zhangolve avatar zhangolve commented on July 21, 2024 6

同意二楼说的,毕竟在函数内部连return 都没有,如果我想到如果加上return 呢?顺便再引申一下。

function swap(x, y){
var temp = x;
x = y;
y = temp;
return {x,y}
}
var a = 1
var b = 2
a=swap(a, b).x;
b=swap(a,b).y
console.log(a) //输出什么
console.log(b) //输出什么

from frontend-interview.

xiaochen9506 avatar xiaochen9506 commented on July 21, 2024 1

当function变量对于基本类型只会复制其值所以
var a = 1
var b = 2
swap(a, b)
console.log(a)
console.log(b)
依旧输出1,2
但遇到非基本类型时,变量会复制其内存地址,所以obj1 和 x 是指向对象{name: 'jirengu'},obj2 和 y 指向对象{age: 2}。但由于题目中x,y只是更变其指向地址,没有对属性值改变,所以obj1,obj2还是分别指向{name: 'jirengu'},{age: 2},改变的仅仅是变量x,y的指向。

from frontend-interview.

giscafer avatar giscafer commented on July 21, 2024

@Cedric-song
少年,这么说不对。
你怎么解释

function swap(x, y){
x.name = '111';
y.age = 3;
}

var obj1 = {name: 'jirengu'}
var obj2 = {age: 2}
swap(obj1, obj2)
console.log(obj1) //输出什么
console.log(obj2) //输出什么

from frontend-interview.

FrankFang avatar FrankFang commented on July 21, 2024

@Cedric-song 这样解释,是过不面试的……

from frontend-interview.

Cedric-song avatar Cedric-song commented on July 21, 2024

@giscafer {name: '111'} , {age: 3}
obj的内存地址存在栈内存,引用存在堆内存。引用变了而已。

from frontend-interview.

Cedric-song avatar Cedric-song commented on July 21, 2024

@FrankFang it's ok

from frontend-interview.

CEO16888 avatar CEO16888 commented on July 21, 2024

看半天没看明白

from frontend-interview.

lxx0904 avatar lxx0904 commented on July 21, 2024

简单问题,有时候就是会想复杂了

from frontend-interview.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.