Javascript 奇怪的 Pass-by-X 事件

标签 javascript arrays

我有两个类似的代码,它们要么通过引用传递,要么根据不同的情况传递值,如下所示:

示例 1

var numbers = [1,2,3];
function popper(){
	var popped = numbers.pop();
	return popped;
}
console.log(numbers,popper());

示例 2

function numbers(){
	var arry = [1,2,3];
	return arry;
}
function popper(){
	var popped = numbers().pop();
	return popped;
}

console.log(numbers(),popper());

我读到只有原语是按值传递的,其他是按引用传递的。但是,在示例 1 中,numbers 数组是按值传递的,而在示例 2 中,包含相同数组的numbers() 函数是按引用传递的。任何对内部发生的事情的描述都会很棒。

额外问题:有什么方法可以查看两个示例中数字的数组原型(prototype)吗?

最佳答案

这其实逻辑上是一致的。 JavaScript 将始终通过引用传递数组。在示例 2 中,当您再次在 console.log(... 内调用 numbers() 时,实际上创建了一个新数组。

此外,您实际上并没有传递变量,而只是使用范围。要实际传递数组,您需要执行以下操作:

var numbers = [1,2,3];
function popper(nums2){
    var popped = nums2.pop();
    return popped;
}
console.log(numbers,popper(numbers));

一步一步:

示例 1

  1. 定义数字
  2. 调用popper(),这将修改数字
  3. 登录控制台

示例 2

  1. 调用popper()
  2. popper() 中调用 numbers(),返回一个数组
  3. popper() 修改上面的数组
  4. 再次调用 console.log(... 行中的 numbers()
  5. numbers() 现在创建一个新数组并将其返回到 console.log(

关于Javascript 奇怪的 Pass-by-X 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41485467/

相关文章:

javascript - 在我的站点中实现了 CSP,但第 3 方库使用内联 javascript。我可以有选择地允许 'unsafe-inline' 吗?

javascript - 每次点击时显示一些额外的 div

javascript - 在另一个 promise 中解决 promise

javascript - 如何使提交按钮仅在电子邮件字段填写时才起作用?

c - %c 与 %s 的实际差异

C++ : Arrays and memory locations

javascript - rails 和 CORS : why am I only seeing the OPTIONS request?

arrays - 点阵算法

java - android/java - 在条件内创建对象时无法提供类

使用 calloc 将十进制数组转换为二进制字符串数组