Các đối tượng trong PHP được gán theo tham chiếu, vì vậy việc sao chép một đối tượng bằng toán tử = sẽ dẫn đến một biến thứ hai tham chiếu đến cùng một đối tượng chứ không phải là một bản sao thực sự. Nhập chức năng sao chép của PHP để tạo một bản sao nông của đối tượng
Sử dụng = để sao chép một đối tượng chỉ sao chép tham chiếu
Để minh họa cách PHP chỉ tạo tham chiếu đến đối tượng ban đầu bằng toán tử =, hãy xem ví dụ sau. [Lưu ý rằng tôi đã gán = màu đỏ trong ví dụ]
class foo {
public $bar;
}
$foo = new foo[];
$foo->bar = 'baz';
$foo2 = $foo;
$foo2->bar = 'bat';
echo $foo->bar;
echo $foo2->bar;
Cả hai dòng echo ở cuối ví dụ sẽ lặp lại "bat" chứ không phải "baz" và "bat", bởi vì $foo2 là tham chiếu đến $foo và việc truy cập các thuộc tính cũng như gọi phương thức cho $foo2 thực sự là tham chiếu đến các thuộc tính và phương thức đó
Sử dụng bản sao để sao chép và đối tượng sao chép đối tượng
Sử dụng cùng một ví dụ, nhưng sử dụng bản sao thay vì sao chép đối tượng sẽ dẫn đến một bản sao của đối tượng ban đầu. Việc thay đổi thuộc tính và phương thức gọi sẽ làm như vậy đối với đối tượng được sao chép chứ không phải đối tượng gốc
Sự khác biệt duy nhất giữa ví dụ trên và ví dụ này là "=" trở thành "bản sao" được đánh dấu màu đỏ trong cả hai ví dụ
class foo {
public $bar;
}
$foo = new foo[];
$foo->bar = 'baz';
$foo2 = clone $foo;
$foo2->bar = 'bat';
echo $foo->bar . "n";
echo $foo2->bar . "n";
Ví dụ thứ hai xuất ra "baz" và sau đó là "bat"
Bản sao nông
Nhân bản một đối tượng tạo ra một bản sao "nông" của đối tượng ban đầu. Điều này có nghĩa là bất kỳ thuộc tính nào là tham chiếu đến các biến khác sẽ vẫn là tham chiếu đến các biến đó và không sao chép chính chúng
Phương thức __clone
Nếu đối tượng chứa phương thức __clone thì nó sẽ được gọi khi đối tượng được sao chép. Nó phải là một chức năng có thể truy cập công khai và không thể được gọi trực tiếp nếu không PHP sẽ kết thúc với một lỗi nghiêm trọng. Bạn sẽ không thực sự lặp lại đầu ra khi sao chép, nhưng nếu đối tượng được sao chép trong ví dụ bên dưới, nó sẽ lặp lại "tôi đã được sao chép"
Sự khác biệt chính giữa bản sao và chế độ xem của một mảng là bản sao là một mảng mới và chế độ xem chỉ là chế độ xem của mảng ban đầu
Bản sao sở hữu dữ liệu và mọi thay đổi đối với bản sao sẽ không ảnh hưởng đến mảng ban đầu và mọi thay đổi đối với mảng ban đầu sẽ không ảnh hưởng đến bản sao
Chế độ xem không sở hữu dữ liệu và mọi thay đổi được thực hiện đối với chế độ xem sẽ ảnh hưởng đến mảng ban đầu và mọi thay đổi được thực hiện đối với mảng ban đầu sẽ ảnh hưởng đến chế độ xem
SAO CHÉP
Ví dụ
Tạo một bản sao, thay đổi mảng ban đầu và hiển thị cả hai mảng
nhập numpy dưới dạng np
arr = np. mảng[[1, 2, 3, 4, 5]]
x = mảng. copy[]
arr[0] = 42
in[mảng]
in[x]
Bản sao KHÔNG NÊN bị ảnh hưởng bởi những thay đổi được thực hiện đối với mảng ban đầu
LƯỢT XEM
Ví dụ
Tạo dạng xem, thay đổi mảng ban đầu và hiển thị cả hai mảng
nhập numpy dưới dạng np
arr = np. mảng[[1, 2, 3, 4, 5]]
x = mảng. view[]
arr[0] = 42
in[mảng]
in[x]
Chế độ xem NÊN bị ảnh hưởng bởi những thay đổi được thực hiện đối với mảng ban đầu
Thực hiện thay đổi trong VIEW
Ví dụ
Tạo chế độ xem, thay đổi chế độ xem và hiển thị cả hai mảng
nhập numpy dưới dạng np
arr = np. mảng[[1, 2, 3, 4, 5]]
x = mảng. lượt xem[]
x[0] = 31
in[mảng]
in[x]
Mảng ban đầu NÊN bị ảnh hưởng bởi những thay đổi được thực hiện đối với dạng xem
Kiểm tra xem Array có sở hữu dữ liệu của nó không
Như đã đề cập ở trên, bản sao sở hữu dữ liệu và chế độ xem không sở hữu dữ liệu, nhưng làm cách nào để kiểm tra điều này?
Bạn có thể sử dụng toán tử trải rộng [". "] để sao chép một mảng trong JavaScript. Toán tử trải rộng [". "] có sẵn trong JavaScript ES6 trở lên và có thể được sử dụng để sao chép một mảng bằng cách "mở rộng" các phần tử của nó
Mảng sao chép JavaScript với ví dụ về toán tử trải rộng
let array = ['JavaScript', 'Clone', 'Array', 'Example'];
console.log[newArray = [...array]];
// output: ['JavaScript', 'Clone', 'Array', 'Example']
Làm cách nào để sao chép mảng JavaScript bằng phương thức slice[]?
mảng. phương thức slice[] trong JavaScript được sử dụng để lấy một phần của mảng từ chỉ mục bắt đầu đến chỉ mục kết thúc. Phương thức slice[] không sửa đổi mảng ban đầu. Nếu mảng ban đầu chứa các đối tượng tham chiếu đến các đối tượng khác, thì chỉ các tham chiếu của chúng sẽ được sao chép sang mảng mới [sao chép nông]
Mảng sao chép JavaScript với phương thức slice[] Ví dụ
let array = ['JavaScript', 'Copy', 'Array', 'Example'];
console.log[array.slice[]];
// output: ['JavaScript', 'Copy', 'Array', 'Example']
Làm cách nào để sao chép mảng JavaScript bằng phương thức concat[]?
mảng. phương thức concat[] trong JavaScript được sử dụng để nối hai hoặc nhiều mảng thành một. Bạn cũng có thể sử dụng phương thức concat[] để sao chép một mảng. Phương thức concat[] trả về một mảng mới mà không thay đổi mảng ban đầu
JavaScript Clone Array với phương thức concat[] Ví dụ
let array = ['JavaScript', 'Clone', 'Array', 'Example'];
let newArray = [].concat[array];
console.log[newArray];
// output: ['JavaScript', 'Clone', 'Array', 'Example']
Làm cách nào để sao chép mảng JavaScript bằng phương thức from[]?
mảng. Phương thức from[] trong JavaScript tạo một mảng mới từ mảng ban đầu. Phương pháp này đã được giới thiệu trong ES6 và chỉ hoạt động trong các trình duyệt hiện đại, nhưng bạn có thể sử dụng thư viện polyfill để có chức năng hiện đại trong các trình duyệt cũ hơn
JavaScript Clone Array với phương thức from[] Ví dụ
let array = ['JavaScript', 'Clone', 'Array', 'Example'];
let newArray = Array.from[array];
console.log[newArray];
// output: ['JavaScript', 'Clone', 'Array', 'Example']
Xem thêm
- Làm cách nào để kiểm tra xem một mảng có chứa giá trị trong JavaScript không?
- Làm cách nào để cắt một mảng trong JavaScript?
- Làm cách nào để đảo ngược một mảng trong JavaScript?
- Làm cách nào để lấy tổng của một mảng trong JavaScript?
- Làm cách nào để nối một mảng thành một chuỗi trong JavaScript?
Javascript Copy Array Các ví dụ và bài viết liên quan đến API
Làm cách nào để gửi yêu cầu POST bằng JavaScript?