我正在寻找一些很好的综合阅读材料,当Javascript按值传递某些内容时,以及何时通过引用和修改传递的项目时会影响函数外部的值,何时不会.我还对通过引用与值分配另一个变量以及是否遵循任何不同的规则而不是作为函数参数传递感兴趣.
我已经做了很多搜索并找到了很多具体的例子(其中很多都是在SO上),我可以从中开始拼凑出真正的规则,但我还没有找到一个单一的,写得很好的文档,描述了这一切.
此外,语言中是否有方法可以控制是通过引用还是通过值传递某些内容?
以下是我想要了解的一些问题类型.这些只是示例 - 我实际上是在了解语言所遵循的规则,而不仅仅是具体示例的答案.但是,这里有一些例子:
function f(a,b,c) {
a = 3;
b.push("foo");
c.first = false;
}
var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);
Run Code Online (Sandbox Code Playgroud)
对于所有不同类型,x,y和z的内容何时在f的范围之外变化?
function f() {
var a = ["1", "2", "3"];
var b = a[1];
a[1] = "4";
// what is the value of b now for all possible data types that the array in "a" might hold?
}
function f() {
var a = [{yellow: "blue"}, {red: …Run Code Online (Sandbox Code Playgroud) 这段代码:
var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
Run Code Online (Sandbox Code Playgroud)
你能解释一下它的意思吗:
foo.x = foo = {n: 2};
Run Code Online (Sandbox Code Playgroud)
我看到{n:2}分配给了foo.为什么undefined分配给foo.x?是否foo = {n: 2};恢复undefined?
在这篇文章中,使用JavaScript进行多项左手赋值 @Crescent Fresh说JavsScript左手赋值是正确的.但是在我看来,以下代码打破了正确的关联性:
var a = {n: 1};
a.x = a = {n: 2};
console.log(a.x);// undefined
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么a.x未定义?
编辑:上面的代码片段是测试"正确的关联性",在现实世界中请不要编写类似的代码.
赋值运算符具有从右到左的关联性.所以
var x,y;
x=y=1;
Run Code Online (Sandbox Code Playgroud)
按预期工作,x等于1.现在考虑代码:
var foo={};
foo.x = foo = {n: 2};
Run Code Online (Sandbox Code Playgroud)
我希望以上工作方式如下:
var foo = {n: 2};
foo.x=foo;
Run Code Online (Sandbox Code Playgroud)
但是,在第一种情况下,foo.x是undefined在第二种情况下foo.x points to foo(循环引用).任何解释?
任何人都可以告诉输出如何变成undefined?
var foo = {n: 2};
foo.x = foo = {n: 2};
console.log(foo.x); // undefined
Run Code Online (Sandbox Code Playgroud)