Javascript的参考与价值
我正在寻找一些很好的综合阅读材料,当Javascript传递的东西有价值的时候,通过引用,当修改通过的项目影响的价值以外的function,当没有。 我也感兴趣的是,当分配给另一个variables是通过引用与价值,是否遵循任何不同的规则比作为函数parameter passing。
我做了大量的search,并find了很多具体的例子(其中很多都是在这里),从中我可以开始拼凑出真正的规则,但是我还没有find一个写得很好的文档描述这一切。
另外,在语言中是否有方法来控制是通过引用还是通过价值来传递?
以下是我想要了解的一些types的问题。 这些只是一个例子 – 我实际上是希望理解语言所遵循的规则,而不仅仅是具体例子的答案。 但是,这里有一些例子:
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);
什么时候x,y和z的内容在所有不同types的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: "cyan"}, {green: "magenta"}]; var b = a[1]; a[1].red = "tan"; // what is the value of b now and why? b.red = "black"; // did the value of a[1].red change when I assigned to b.red? }
如果我想完全独立地复制一个对象(没有任何参考),那么最好的做法是什么?
我的理解是,这其实很简单:
- JavaScript 总是按值传递,但是当一个variables引用一个对象(包括数组)时,“值”是对该对象的引用。
- 改变一个variables的值永远不会改变底层基元或对象,它只是将variables指向一个新的基元或对象。
- 但是,更改由variables引用的对象的属性确实会更改基础对象。
所以,通过你的一些例子:
function f(a,b,c) { // Argument a is re-assigned to a new value. // The object or primitive referenced by the original a is unchanged. a = 3; // Calling b.push changes its properties - it adds // a new property b[b.length] with the value "foo". // So the object referenced by b has been changed. b.push("foo"); // The "first" property of argument c has been changed. // So the object referenced by c has been changed (unless c is a primitive) c.first = false; } var x = 4; var y = ["eeny", "miny", "mo"]; var z = {first: true}; f(x,y,z); console.log(x, y, z.first); // 4, ["eeny", "miny", "mo", "foo"], false
例2:
var a = ["1", "2", {foo:"bar"}]; var b = a[1]; // b is now "2"; var c = a[2]; // c now references {foo:"bar"} a[1] = "4"; // a is now ["1", "4", {foo:"bar"}]; b still has the value // it had at the time of assignment a[2] = "5"; // a is now ["1", "4", "5"]; c still has the value // it had at the time of assignment, ie a reference to // the object {foo:"bar"} console.log(b, c.foo); // "2" "bar"
JavaScript 总是传递价值。 但是,如果将一个对象传递给一个函数,那么“值”实际上是对该对象的引用,所以该函数可以修改该对象的属性, 但不会使函数外的variables指向其他对象 。
一个例子:
function changeParam(x, y, z) { x = 3; y = "new string"; z["key2"] = "new"; z["key3"] = "newer"; z = {"new" : "object"}; } var a = 1, b = "something", c = {"key1" : "whatever", "key2" : "original value"}; changeParam(a, b, c); // at this point a is still 1 // b is still "something" // c still points to the same object but its properties have been updated // so it is now {"key1" : "whatever", "key2" : "new", "key3" : "newer"} // c definitely doesn't point to the new object created as the last line // of the function with z = ...
是的,Javascript总是按值传递,但是在数组或对象中,值是对它的引用,所以你可以“改变”内容。
但是,我想你已经读过了, 在这里你有你想要的文件:
- 原始typesvariables如string,数字总是按值传递。
-
数组和对象是作为引用传递或基于这两个条件传递值传递的。
-
如果用新的对象或数组更改该对象或数组的值,那么它将通过值传递。
object1 = {item: "car"}; array1=[1,2,3];
在这里你正在分配新的对象或数组到老的。你不改变老对象的属性的值,所以它是通过值。
-
如果您正在更改对象或数组的属性值,那么它将通过引用传递。
object1.item= "car"; array1[0]=9;
在这里你正在改变一个旧物件的属性值。你不是将新物件或数组分配给旧物件,所以它是通过引用传递的。
-
码
function passVar(object1, object2, number1) { object1.key1= "laptop"; object2 = { key2: "computer" }; number1 = number1 + 1; } var object1 = { key1: "car" }; var object2 = { key2: "bike" }; var number1 = 10; passVar(object1, object2, number1); console.log(object1.key1); console.log(object2.key2); console.log(number1); Output: - laptop bike 10