关于js的一道面试题

负心杏 发布于 2015/10/09 10:36
阅读 824
收藏 3

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

假设有两个数组:

var a = ['a1', 'a2', 'a3'];
var b = ['b1', 'b2', 'b3', 'b4'];
要求在 不新定义上下文变量的情况下,交换两个数组的值,并且数组内元素顺序不变。

----------------------

我也搞过不短时间的js了,见过这题,立即想到apply,call一类的方法或者涉及到prototype(当时以为要考察这些),换this指向一类的,因为好像记得有类似的一个帖子用一句代码实现的类似功能,但记不起来了。

各位有什么好办法?


===========下面是我做的,为了不影响大家思路,请先跳过=========

但是这些方法不熟,于是换了一种方法,用js数组也是对象的特性,重新加一个属性做缓存交换:

a.b = b;
	b.a = a;
	a = a.b;
	b = b.a;
回来已测试,发现是实现了,但是属性缓存没有删除,于是后面又加了:delete a.a;delete b.b;

6句代码实现。


加载中
0
Arrowing
Arrowing

var a = ['a1', 'a2', 'a3'];
var b = ['b1', 'b2', 'b3', 'b4'];

a = [ b, b = a][0];

console.log(a, b);

Arrowing
Arrowing
回复 @负心杏 : 没,这个方法是交换2个变量的简单使用。之前想到了,但是没用于数组,想太多了,最后就把其他的方法删了。
负心杏
我说怎么只有一条回复了...您删了一条,又改了一条。虽然之前两个方法不如您现在的好,但是还是很有启发作用的。
0
彩虹糖tang
彩虹糖tang
你这还是新定义了变量啊
负心杏
回复 @彩虹糖tang : 这个牵扯到了【变量】的定义之争了吧。虽然var声明变量实际就是window的属性,但我还真没有将对象添加属性看做声明变量。看w3c网站的变量介绍,没有类似说明。反正知道是怎么回事就行。话说回来我也不反对你的说法,个人感觉争论这种事情没啥意义,就跟出题人一样,这种应用场景有多大可能存在?设置不能声明变量这个限制,只是为了考察的目的。
彩虹糖tang
彩虹糖tang
回复 @负心杏 : 我说你的。好吧,我小白了,对象增加属性不算新定义变量么。。。
负心杏
您这说的是我的,还是楼上?我的是加了对象的属性,不算新定义变量。楼上的 a = [b, b=a][0];虽然[b, b=a]算是一个没有显式声明的新变量,但思路很好啊。我觉得应该没人在面试中抠这个的吧,这题应该是考察思路,和基础知识的运用的吧。
0
川泽人
川泽人

难道非要这样写?

var a = ['a1', 'a2', 'a3'];

var b = ['b1', 'b2', 'b3', 'b4'];

a = [ b, b=a];

a=a[0];

console.log(a, b);


负心杏
a = [b, b=a][0];
负心杏
和1楼的一样啊。是不是这个是js中交换变量的常用方法啊。 还真没用过。
0
纠结名字
var a = ['a1', 'a2', 'a3'];
var b = ['b1', 'b2', 'b3', 'b4'];

a.push(b);
b = a.slice(0, a.length - 1);
a = a.pop();

var a = ['a1', 'a2', 'a3'];
var b = ['b1', 'b2', 'b3', 'b4'];

a = a.concat(b);
b = a.slice(0, a.length - b.length);
a = a.slice(b.length);




0
bhpx
bhpx

引用来自“纠结名字”的评论

var a = ['a1', 'a2', 'a3'];
var b = ['b1', 'b2', 'b3', 'b4'];

a.push(b);
b = a.slice(0, a.length - 1);
a = a.pop();



和一楼思路一致
0
e
eclothy
合并两个数组再分别截取
0
您的好友
您的好友

来~ 楼主 教你一招高级的

[a,b] = [b,a]



es6的解构赋值

您的好友
您的好友
回复 @负心杏 : chrome暂时还没支持 firefox和safari支持了
负心杏
a = [b, b=a][0]; 这个也差不多酷,而且应该没有兼容问题。
负心杏
...这大概是最酷的做法了。但是我试了一下chrome浏览器报:Uncaught ReferenceError: Invalid left-hand side in assignment
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部