Javascript 数组反向函数意外行为
Javascript array reverse function unexpected behavior
我想了解为什么情况 1 和情况 2 不返回相同的结果。
情况 1 :
var array1 = ["1", "2", "3"];
var array2 = array1.reverse();
console.log(array1); // ["3", "2", "1"]
console.log(array2); // ["3", "2", "1"] Why this doesn't work ?
情况 2 :
var array1 = ["1", "2", "3"];
var array2 = array1;
console.log(array1); // ["1", "2", "3"]
console.log(array2.reverse()); // ["3", "2", "1"] Why this works ?
In Situation 1
反向方法将调用数组对象的元素就地转置,改变数组,并返回对数组的引用。
在Situation 2
中,您具有相同的参考。您正在打印array1
阵列,然后再反转它。
var array1 = ["1", "2", "3"];
var array2 = array1;
console.log(array1); // [ '1', '2', '3' ]
console.log(array2.reverse()); // [ '3', '2', '1' ]
console.log(array1); // [ '3', '2', '1' ]
当你调用.reverse
时,你正在反转值,然后返回数组。
var array1 = ["1", "2", "3"]; //Create a new array
var array2 = array1.reverse();//Reverse array1 and assign it to array2
对array1
所做的任何更改也会反映在array2
在这种情况下,混淆是由于您在修改值之前打印值的事实引起的。
reverse()
修改并返回原始数组。参见 MDN Array.prototype.reverse()
var array1 = ["1", "2", "3"];
var array2 = array1; // point to the same object
console.log(array1); // original array1 (["1", "2", "3"])
console.log(array2.reverse()); // reverses array2 and array1 since they
// point to the same object and returns
// array2 (["3", "2", "1"])
console.log(array1); // check that array1 was reversed (["3", "2", "1"])
console.log(array1.reverse() === array1); // returns true
反向方法将调用数组对象的元素转置到位,改变数组,并返回对数组的引用。因此,它不会返回反向数组。
检查曼努埃尔。https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse
重要的是要注意Array.reverse()
做两件事:
- 它
- 通过反转来改变它给出的数组
- 它返回对刚刚反转的数组的引用
让我们来看看你的例子和发生了什么/
情况一
var array1 = ["1", "2", "3"]; // Creates new array
var array2 = array1.reverse(); // Reverse array1 and stores reference to array1 in array2
// Since array1 and array2 point to the same object, they will have
// the same values since they are pointing to the same object
console.log(array1); // ["3", "2", "1"]
console.log(array2); // ["3", "2", "1"]
情况二
var array1 = ["1", "2", "3"]; // Creates new array
var array2 = array1; // array2 now holds a reference to array1
// Same as the previous example, array1 and array2 both have the
// same values since they are pointing to the same object
console.log(array1); // ["1", "2", "3"]
// Now we reverse array2, which reverses array1 AND array2
console.log(array2.reverse()); // ["3", "2", "1"]
// array1 is now also reversed
console.log(array1); // ["3", "2", "1"]
在第二种情况下,在调用 array2.reverse()
之后,array1
和 array2
都相反,因为它们指向同一个对象引用。
问题是reverse()
更改数组本身。这意味着,如果你写var array2 = array1.reverse()
那么 array1 就会被颠倒。Array1 现在包含反向的条目,而在另一端,array2 使用此反向数组进行初始化。因此,您具有相同的输出。
在第二个带有var array2 = array1
的示例中,您有两个变量引用同一数组。首先,打印出 array1,结果为正常顺序。作为第二步,您反转 array2 并将其打印出来。顺序现在已更改。但是,如果现在再次打印出 array1,结果将是顺序相反的数组,因为 array1 和 array2 引用同一个数组。
试试这个(演示)
var array1 = ["1", "2", "3"];
var array2 = array1.slice(0).reverse();
console.log(array1, array2);
使用 slice(0)
创建一个新数组。
数组是 javascript 中的对象,因此将数组分配给另一个数组只是分配其引用,因此它们都将指向同一对象。而在这种情况下,最好使用数组的切片函数将数组的数据复制到另一个类似
var array1 = ["1", "2", "3"];
var array2 = array1.slice().reverse();
console.log(array1); // ["1", "2", "3"]
console.log(array2); // ["3", "2", "1"]
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- 在一个函数中,我有一个未捕获的语法错误:意外的标记else
- Javascript:函数返回意外结果
- Javascript 数组反向函数意外行为
- HTML 无法识别我要求它运行的 javascript 文件,语法错误:意外的令牌“<”(匿名函数)script.js:
- QML:Lambda 函数意外工作
- 意外的“else”和函数未运行
- 一个javascript函数导致“;意外标识符”;来自不同函数的错误
- Underscore.js:具有_.object函数的意外行为
- JavaScript自定义函数返回意外值
- 调用加载的顺序函数会意外中断代码
- 使用'时出现意外的T_FUNCTION;回调'=>函数($resp)
- JavaScript - 意外/奇怪的构造函数
- 未捕获的语法错误:意外的标记^(匿名函数)
- jQuery模块函数意外返回'未捕获的类型错误'
- PHP调用脚本函数,返回值为Uncaught SyntaxError:意外的令牌ILLEGAL
- 尝试用 JSON 编写函数,在函数调用中获取“意外令牌”
- 使用参数成功调用简单函数后出现意外警报,消息为“未定义”
- php/js 工具或函数,以防止从 php 打印到 javascript 时出现“意外非法”
- 具有意外结果的 Javascript 函数参数