如何在JavaScript中交换两个变量

21 浏览
0 Comments

如何在JavaScript中交换两个变量

我有这两个变量:\n

var a = 1,
    b = 2;

\n我的问题是如何交换它们?只交换这两个变量,不涉及任何对象。

0
0 Comments

在JavaScript中,要交换两个变量的值,有几种解决方法。首先,可以使用一个临时变量来完成交换,代码如下:

var a = 1,
    b = 2,
    tmp;
tmp = a;
a = b;
b = tmp;

这种方法在可读性和可维护性方面表现出色,任何维护代码的人(包括你自己半年后)都能清楚地知道发生了什么。

另外,由于这些是整数,还可以使用一些巧妙的技巧来完成交换,而不使用第三个变量。例如,可以使用位异或运算符:

let a = 1, b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log('a is now:', a);
console.log('b is now:', b);

这被称为异或交换算法。它的原理在维基百科的一篇文章中有详细描述。

异或运算可以用于任何数据类型。而只有数字类型适用于减法交换技巧。

JavaScript中的异或运算符将其操作数转换为32位整数(使用ToInt32内部方法-请参见ECMAScript标准的第11.10节)。对于非整数的数值类型,它不会产生正确的结果。它还将非数字值转换为32位整数。如果你将a设为"hi",b设为"there",则最终a等于0,b等于0。

这个技巧适用于任何数据类型,只要你不介意得到一个整数结果;值会自动转换为int32。这意味着它可以处理数值字符串、布尔值(0/1)、null(0)和空数组/对象(0)。但原始类型不会保留,所以受影响的布尔值不能使用typeof a == 'boolean'或a === false等等。实数可以工作,只是它们被向零取整,而不是四舍五入为最接近的整数。

换句话说,它适用于任何数据类型,除非它们是整数值(非整数类型的情况除外)。在我看来,“交换”意味着“最终每个变量都有另一个变量的值”,而不是“转换为int32,然后交换”。

这种方法在一般情况下并不是很有用。但它可以处理任何数据类型,只是要注意它会将值转换为int32。最后,引用一句Dijkstra的名言:“优秀的程序员充分意识到自己头脑的有限大小。因此,他以充分的谦卑态度对待任务,并避免像瘟疫一样使用巧妙的技巧。”

0
0 Comments

在JavaScript中如何交换两个变量的值?

ES6 (Firefox和Chrome已经支持它(解构赋值数组匹配)):

let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);

有人知道ES6中这种交换的名字吗?

- 我认为它被称为数组匹配,是解构赋值的一种形式。

这种方法在Node.js 7.4.0/win7 64上大约比第三个变量的方法慢35倍,但确实很简洁。

感谢提供名字的人。

自从V8版本6.8以来,使用数组解构赋值交换变量的效率应该与使用临时变量的方法一样快。

如果在`[a, b] = [b, a]`的前一行省略了分号,会有一个问题:JavaScript会执行奇怪的事情,这可能是因为它将其与前一行合并为一个数组/对象索引或其他类似的操作。

你能找出为什么会发生这种奇怪的事情吗?

这是因为如果没有分号,JavaScript会将代码解释为`let a=5, b=6[a,b] = [b,a]`。所以错误消息将是`b is not define`。你可以在这篇文章中找到更多解释:freecodecamp.org/news/...

0
0 Comments

在JavaScript中,交换两个变量的值是一个常见的需求。下面给出了一种使用一行代码实现的方法。

给定变量a和b:

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

下面是一个示例:

var a=1,
    b=2,
    output=document.getElementById('output');
output.innerHTML="<p>Original: "+a+", "+b+"</p>";
// 交换变量"a"和"b"的值
b = [a, a = b][0];
output.innerHTML+="<p>Swapped: "+a+", "+b+"</p>";

这种方法的缺点是,使用数组作为中间变量而不是第三个变量,可能会导致性能下降。根据jsperf.com的测试结果,在Chrome浏览器中使用数组的方法比使用第三个变量的方法要慢得多。不过,这个测试只在Chrome浏览器中进行了,还没有测试ECMAScript 6版本,因为它目前会报错“Invalid left-hand side in assignment”。

根据测试结果,我们可以得出结论,使用中间数组进行变量交换的方法不是最优解。根据不同的需求,我们可以选择使用临时变量、代码量少、速度快等不同的方法来实现变量交换。

交换两个变量的值是一个常见的需求,在不同的场景下可以选择不同的实现方法。使用数组作为中间变量的方法虽然简洁,但可能会导致性能下降,因此在实际应用中需要根据具体情况进行选择。

0