Javascript 节点INT中的功能范围与对象?

Javascript 节点INT中的功能范围与对象?,javascript,node.js,ecmascript-6,scope,Javascript,Node.js,Ecmascript 6,Scope,这些天我在node上做一些编程,我对函数中作用域的处理有点惊讶。我被引导相信,现在ES6的范围要严格得多。以下工作如预期: function f(v){ v += 1; return v; } let before = 1; let after = f(before); console.log(after); // This logs 2 (as expected) console.log(before); // This logs 1 (as expected) 但当我使

这些天我在node上做一些编程,我对函数中作用域的处理有点惊讶。我被引导相信,现在ES6的范围要严格得多。以下工作如预期:

function f(v){
    v += 1;
    return v;
}
let before = 1;
let after = f(before);
console.log(after);  // This logs 2 (as expected)
console.log(before);  // This logs 1 (as expected)
但当我使用对象/字典执行相同操作时,变量的范围似乎超出了函数的范围:

function f(v){
    v.a += 1;
    return v;
}
let before = {a: 1};
let after = f(before);
console.log(after.a);  // This logs 2 (as expected)
console.log(before.a);  // This also logs 2 (I was expecting this to still be 1)

究竟为什么会这样?为什么
v
的作用域仅限于
int
时的函数,而不是对象时的函数?

这里的作用域没有问题。 您的代码只是将一个对象分配给另一个变量,因此每当您编辑对象时,所有分配的变量都会受到影响:

设o1={
a:1
};
设o2=o1;
o1.a++;

控制台日志(o2)Javascript有两种数据类型:原语和对象

在第一个示例中,您传递的是一个基本数据类型(布尔、Null、未定义、字符串、符号和数字-您的大小写)。当您将这些类型的变量传递到函数中时,您传递的是一个副本,因此任何修改都不会像第一种情况那样影响初始值/变量

对于对象数据类型,当您将对象传递到函数中时,您传递的是对该对象值的引用,而不是该值的副本,就像原语一样。因此,当您在函数中修改它时,您就是在修改引用。这意味着任何具有此引用的变量也将具有修改后的值,因为它们只是指向最近修改过的值。

JavaScript函数按值

在第一种情况下,您有一个基本值(数字是基本值)。因此,
之前的
指的是一个原语,值为1。你把它传进来——它是按值传递的。返回一个值。将其指定给第二个对象<代码>之后是另一个对象。基本上,两个指针,指向不同的对象。不同的对象。不同的价值观

可以从垃圾收集的角度来考虑。你失去了“以前”在你的范围之外。
1
原语不再可访问。免费打扫

在第二种情况下,传递对象引用的值。然后再次返回对象引用的值。所以
之前
之后
指的是同一个对象。它们是不同的参考文献。因此,在
console.log(before)
console.log(after)
中,您都引用了相同的对象和相同的(现在已修改)值


现在,再来看看垃圾收集器。在
之前删除对
的访问权限。垃圾收集器删除它的值(基本上是指向对象{v:2}的指针)。它可以移除对象本身吗?不,还没有,因为
之后的
值仍然指向此对象。但不管怎样,两个变量都指向同一个对象。

这似乎是原始数据类型与对象的对比。在Java中,ints与StringsInJS会发生类似的情况,只有字符串和数字通过值传递,其他任何内容都通过引用/指针传递。它与ES6无关。@t.niese类似的东西。对象不会被复制。但复制的是对这些对象的引用。因此,
之前的
之后的
是不同的引用,但它们具有相同的值:对象本身的地址。@FisNaN如果使用术语引用和指针,您需要小心。传递引用在js中并不存在,至少在
函数测试(a){a={foo:1}}test(b)的sens中不存在;console.log(b.foo)
可以用。@Zlatko是的,我知道。但是我没有时间(或者说实话,没有动力)用正确的术语写一个答案从那时起,这只是一个评论。但是你的回答很好地解释了这一点。如果没有对参考文献与价值观的解释,这个答案是非常不完整的