1] Khi một mảng được truyền dưới dạng đối số cho một phương thức hoặc hàm, thì nó được truyền theo tham chiếu hay theo giá trị?
2] Khi gán một mảng cho một biến, biến mới có tham chiếu đến mảng ban đầu hay là một bản sao mới?
làm cái này thì sao
$a = array[1,2,3];
$b = $a;
Có phải
4 là tham chiếu đến
5 không?Giải pháp tốt nhất
Đối với phần thứ hai của câu hỏi của bạn, hãy xem trang mảng của sách hướng dẫn, trong đó nêu rõ [trích dẫn]
Việc gán mảng luôn liên quan đến việc sao chép giá trị. Sử dụng toán tử tham chiếu để sao chép một mảng theo tham chiếu
Và ví dụ đã cho
Đối với phần đầu tiên, cách tốt nhất để chắc chắn là thử ;-]
Hãy xem xét ví dụ về mã này
function my_func[$a] {
$a[] = 30;
}
$arr = array[10, 20];
my_func[$arr];
var_dump[$arr];
Nó sẽ cho đầu ra này
array
0 => int 10
1 => int 20
Điều này cho biết hàm chưa sửa đổi mảng "bên ngoài" được truyền dưới dạng tham số. nó được chuyển dưới dạng bản sao và không phải là tài liệu tham khảo
Nếu bạn muốn nó được chuyển qua tham chiếu, bạn sẽ phải sửa đổi chức năng theo cách này
function my_func[& $a] {
$a[] = 30;
}
Và đầu ra sẽ trở thành
array
0 => int 10
1 => int 20
2 => int 30
Vì, lần này, mảng đã được chuyển "theo tham chiếu"
Đừng ngần ngại đọc phần Giải thích tài liệu tham khảo của sách hướng dẫn. nó sẽ trả lời một số câu hỏi của bạn ;-]
Giải pháp liên quan
C++ – Sự khác nhau giữa biến con trỏ và biến tham chiếu trong C++
Một con trỏ có thể được gán lại
Một tham chiếu không thể bị ràng buộc lại và phải được ràng buộc khi khởi tạo
int x = 5; int y = 6; int &q; // error int &r = x;
Một biến con trỏ có bản sắc riêng của nó. một địa chỉ bộ nhớ riêng biệt, có thể nhìn thấy có thể được lấy bằng toán tử một ngôi
6 và một lượng không gian nhất định có thể được đo bằng toán tử
7. Sử dụng các toán tử đó trên một tham chiếu sẽ trả về một giá trị tương ứng với bất kỳ tham chiếu nào được liên kết với; . Vì tham chiếu giả định danh tính của biến ban đầu theo cách này, nên sẽ thuận tiện khi coi tham chiếu như một tên khác cho cùng một biếnint x = 0; int &r = x; int *p = &x; int *p2 = &r; assert[p == p2]; // &x == &r assert[&p != &p2];
Bạn có thể có các con trỏ lồng vào nhau tùy ý tới các con trỏ cung cấp thêm các cấp độ định hướng. Tài liệu tham khảo chỉ cung cấp một mức độ gián tiếp
int x = 0; int y = 0; int *p = &x; int *q = &y; int **pp = &p; **pp = 2; pp = &q; // *pp is now q **pp = 4; assert[y == 4]; assert[x == 2];
Một con trỏ có thể được gán
8, trong khi một tham chiếu phải được liên kết với một đối tượng hiện có. Nếu bạn đủ cố gắng, bạn có thể liên kết một tham chiếu tới
8, nhưng điều này không được xác định và sẽ không hoạt động nhất quán
0Tuy nhiên, bạn có thể có một tham chiếu đến một con trỏ có giá trị là
8Con trỏ có thể lặp qua một mảng; . Đây là bất kể kích thước của đối tượng mà con trỏ trỏ tới
Một con trỏ cần được hủy đăng ký bằng
3 để truy cập vị trí bộ nhớ mà nó trỏ tới, trong khi một tham chiếu có thể được sử dụng trực tiếp. Một con trỏ tới một lớp/cấu trúc sử dụngfunction my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
4 để truy cập các thành viên của nó trong khi một tham chiếu sử dụng mộtfunction my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
5function my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
Các tham chiếu không thể được đưa vào một mảng, trong khi các con trỏ có thể được [Được đề cập bởi người dùng @litb]
Const tài liệu tham khảo có thể được ràng buộc tạm thời. Con trỏ không thể [không phải không có một số gián tiếp]
1Điều này làm cho
6 thuận tiện hơn để sử dụng trong danh sách đối số, v.v.function my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
Javascript – Cách kiểm tra xem một mảng có chứa giá trị hay không trong JavaScript
Các trình duyệt hiện đại có , cái này thực hiện chính xác điều đó và bởi tất cả mọi người ngoại trừ IE
2Bạn cũng có thể sử dụng
function my_func[$a] {
$a[] = 30;
}
$arr = array[10, 20];
my_func[$arr];
var_dump[$arr];
8, cách này ít trực tiếp hơn nhưng không yêu cầu polyfill cho các trình duyệt lỗi thời
3Nhiều khung cũng cung cấp các phương pháp tương tự
- jQuery.
9function my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
- dấu gạch dưới. js. [cũng có bí danh là
1 vàarray 0 => int 10 1 => int 20
2]array 0 => int 10 1 => int 20
- Bộ công cụ Dojo.
3array 0 => int 10 1 => int 20
- Nguyên mẫu.
4array 0 => int 10 1 => int 20
- MooTools.
- MochiKit.
- MS Ajax.
4array 0 => int 10 1 => int 20
- mở rộng.
- Lodash. [là
0 trước 4. 0. 0]function my_func[& $a] { $a[] = 30; }
- Ramda.
Lưu ý rằng một số khung triển khai chức năng này dưới dạng hàm, trong khi các khung khác thêm chức năng vào nguyên mẫu mảng