Tôi đang tìm một số tài liệu đọc toàn diện tốt khi Javascript truyền một cái gì đó theo giá trị và khi tham chiếu và khi sửa đổi mục đã qua ảnh hưởng đến giá trị bên ngoài một hàm và khi nào thì không. Tôi cũng quan tâm đến khi gán cho một biến khác là tham chiếu so với giá trị và liệu nó có tuân theo bất kỳ quy tắc nào khác hơn là truyền tham số hàm hay không.Javascript bằng tham chiếu và theo giá trị
Tôi đã thực hiện rất nhiều tìm kiếm và tìm thấy nhiều ví dụ cụ thể (nhiều người trong số họ ở đây trên SO) mà từ đó tôi có thể bắt đầu ghép các phần của các quy tắc thực sự, nhưng tôi chưa tìm thấy cũng bằng văn bản tài liệu mô tả tất cả.
Ngoài ra, có những cách nào trong ngôn ngữ để kiểm soát liệu nội dung nào đó có được chuyển qua tham chiếu hoặc theo giá trị không?
Dưới đây là một số loại câu hỏi tôi muốn hiểu. Đây chỉ là những ví dụ - Tôi thực sự tìm hiểu các quy tắc ngôn ngữ đi qua, không chỉ là câu trả lời cho các ví dụ cụ thể. Nhưng, dưới đây là một số ví dụ:
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);
Khi nào nội dung của x, y và z thay đổi ngoài phạm vi f cho tất cả các loại khác nhau?
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?
}
Nếu tôi muốn tạo bản sao hoàn toàn độc lập của đối tượng (không có tham chiếu), cách tốt nhất để làm điều đó là gì?
Đây là một đọc đáng giá: [Wiki: Chiến lược Đánh giá] (http://en.wikipedia.org/wiki/Evaluation_strategy). Tôi thích Gọi By Chia sẻ đối tượng để tránh nhầm lẫn như vậy và để lại Call By Reference để thực sự có nghĩa là cái gì khác, nơi nó được áp dụng. Để làm cho một "bản sao" xem xét 'jQuery.extend' (chỉ bản sao nông!) Hoặc tương tự được cung cấp bởi sự lựa chọn khung công tác của bạn. (Tôi nghĩ ECMA ed. 5 giới thiệu 'Object.clone' ...?). Một "bản sao sâu" có thể đạt được với serializing để JSON và trở lại, nơi mà một hoạt động được bảo tồn (nó có thể không phải lúc nào cũng được). Tôi chắc rằng cũng có những chức năng khác được thiết kế cho điều này :) –
Tôi tin rằng jQuery.extend bây giờ (1.8.x +) hỗ trợ nhân bản sâu (sử dụng tham số boolean tùy chọn) –
Trong những năm kể từ câu hỏi này, tôi đã tìm thấy nó dễ nhất để giải thích vấn đề này cho người mới dùng Javascript (đặc biệt là những người biết C/C++) bằng cách chỉ nói điều này: "Trong Javascript, các đối tượng được truyền qua con trỏ và mọi thứ khác được truyền theo giá trị." – jfriend00