Comments (11)
掉坑里了。
输出结果依次是:
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.
JavaScript按值传递。over
from frontend-interview.
考点在第二个
//函数的参数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.
同意二楼说的,毕竟在函数内部连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.
当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.
@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.
@Cedric-song 这样解释,是过不面试的……
from frontend-interview.
@giscafer {name: '111'} , {age: 3}
obj的内存地址存在栈内存,引用存在堆内存。引用变了而已。
from frontend-interview.
@FrankFang it's ok
from frontend-interview.
看半天没看明白
from frontend-interview.
简单问题,有时候就是会想复杂了
from frontend-interview.
Related Issues (20)
- JS 作用域链相关问题 HOT 5
- JS 作用域、原型链 HOT 3
- 重复声明两个函数会怎样? HOT 4
- ES5中“严格模式”与“非严格模式”的区别? HOT 3
- ajax请求序列化问题 HOT 5
- 循环/闭包/setTimeout/Promise 综合 HOT 1
- 服务端如何区分不同的用户 HOT 4
- 使用ES6实现该方法 HOT 13
- dom操作相关 HOT 7
- 什么是FP?与OOP的关系?
- 为何会出现浏览器兼容性问题?如何解决? HOT 2
- 前端性能优化 HOT 2
- JavaScript 分组 HOT 13
- 自适应和响应式有什么区别和联系
- 如何实现深拷贝? HOT 1
- 两个js数组相关题目 HOT 7
- 面试题汇总
- jrg interview questions HOT 7
- 实现一个深拷贝 HOT 8
- 宏任务微任务题 HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from frontend-interview.