JavaScript được coi là ngôn ngữ truyền theo giá trị, nhưng tại thời điểm một biến tham chiếu đến một đối tượng, giá trị sẽ trở thành tham chiếu của đối tượng đó
Bây giờ, hãy xem những gì được truyền theo giá trị và truyền theo tham chiếu
Khi truyền theo giá trị, một hàm có thể được gọi bằng cách truyền trực tiếp giá trị của biến làm đối số. Nếu bạn thay đổi đối số bên trong hàm thì sẽ không ảnh hưởng đến biến được truyền từ bên ngoài vào hàm
Vì JavaScript luôn truyền theo giá trị, nên việc thay đổi giá trị của biến sẽ không thay đổi nguyên hàm cơ bản [số hoặc chuỗi]
Hãy chứng minh điều đó trong ví dụ dưới đây
hàm callByValue[var1, var2] { bảng điều khiển. log["Cuộc gọi nội bộ"]; . nhật ký ["var1 = " + var1 + " var2 = " + var2]; . log["Trước khi gọi"]; . nhật ký ["var1 = " + var1 + " var2 = " + var2]; . log["Sau Cuộc Gọi"]; . nhật ký ["var1 = " + var1 + " var2 = " + var2];
Đầu ra sẽ như sau
Before Call by Value Method var1 =100 var2 =200 Inside Call by Value Method var1 =10 var2 =20 After Call by Value Method var1 =100 var2 =200
Nhưng trong trường hợp một biến tham chiếu đến một đối tượng bao gồm một mảng, thì giá trị là tham chiếu đến đối tượng
Truyền theo giá trị là cách lập trình an toàn hơn, ngăn người lập trình ghi đè các biến bên trong hàm. JavaScript và các ngôn ngữ lập trình hiện đại khác sử dụng nó khi nói đến nguyên thủy
Khi truyền tham chiếu, một hàm có thể được gọi bằng cách truyền trực tiếp tham chiếu/địa chỉ của biến làm đối số. Nếu bạn thay đổi đối số bên trong hàm sẽ ảnh hưởng đến biến được truyền từ bên ngoài vào hàm
Trong JavaScript, các đối tượng và mảng được truyền theo tham chiếu
Đây là một ví dụ
hàm callByReference[obj] { bảng điều khiển. log["Gọi bên trong theo tham chiếu"]; . a = 100; . nhật ký [đối tượng]; . 1}; . log["Trước khi gọi theo tham chiếu"]; . nhật ký [đối tượng]; . log["Sau khi gọi theo tham chiếu"]; . nhật ký [đối tượng];
Đầu ra sẽ là
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}
Các yếu tố đơn giản nhất của ngôn ngữ lập trình được gọi là nguyên thủy. Chúng khác nhau từ ngôn ngữ này sang ngôn ngữ khác nhưng nói chung là giá trị bất biến cơ bản nhất
Các kiểu dữ liệu nguyên thủy JavaScript sau đây được truyền theo giá trị. chuỗi, boolean, số, null, không xác định
Các nguyên hàm được sao chép theo giá trị của chúng có nghĩa là biến được truyền truy cập theo giá trị của nó
Nguyên thủy là bất biến, có nghĩa là giá trị của chúng không thể thay đổi nhưng có thể được gán lại
Các đối tượng trong JavaScript thuộc loại tham chiếu
Không giống như giá trị nguyên thủy, kích thước của giá trị tham chiếu là động;
Đối tượng là một tập hợp các thuộc tính có thể tham chiếu bất kỳ kiểu dữ liệu nào, bao gồm các đối tượng và giá trị nguyên thủy. Bạn có thể tạo các đối tượng có dấu ngoặc nhọn {…} với danh sách các thuộc tính
Nói chung, các đối tượng đi qua hầu hết mọi khía cạnh của JavaScript. Do đó nó là một trong những điều đầu tiên để học
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3 là một đối tượng giống như function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
4 có thể truy cập bên trong các hàm chứa các giá trị của các đối số được truyền cho hàm đóGhi chú. Trong mã hiện đại, các tham số còn lại nên được ưu tiên
Đối tượng
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3 là một biến cục bộ có sẵn trong tất cả các hàm không phải mũi tên. Bạn có thể tham khảo đối số của hàm bên trong hàm đó bằng cách sử dụng đối tượng function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3 của nó. Nó có các mục cho mỗi đối số mà hàm được gọi, với chỉ mục của mục đầu tiên là function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
7Ví dụ, nếu một hàm được truyền 3 đối số, bạn có thể truy cập chúng như sau
arguments[0] // first argument
arguments[1] // second argument
arguments[2] // third argument
Đối tượng
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3 hữu ích cho các hàm được gọi với nhiều đối số hơn chúng được khai báo chính thức để chấp nhận, được gọi là các hàm biến thiên, chẳng hạn như function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
9. Hàm ví dụ này chấp nhận bất kỳ số lượng đối số chuỗi nào và trả về đối số dài nhấtfunction longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
Bạn có thể sử dụng
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}10 để đếm có bao nhiêu đối số mà hàm được gọi với. Thay vào đó, nếu bạn muốn đếm có bao nhiêu tham số mà một hàm được khai báo để chấp nhận, hãy kiểm tra thuộc tính
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}11 của hàm đó
Mỗi chỉ mục đối số cũng có thể được đặt hoặc gán lại
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}1
Các hàm không nghiêm ngặt chỉ có các tham số đơn giản [nghĩa là không có tham số nghỉ, mặc định hoặc hủy cấu trúc] sẽ đồng bộ hóa giá trị mới của tham số với đối tượng
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3 và ngược lạiBefore Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}5
Các hàm không nghiêm ngặt được truyền các tham số còn lại, mặc định hoặc bị hủy cấu trúc sẽ không đồng bộ hóa các giá trị mới được gán cho các tham số trong thân hàm với đối tượng
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3. Thay vào đó, đối tượng function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3 trong các hàm không nghiêm ngặt với các tham số phức tạp sẽ luôn phản ánh các giá trị được truyền cho hàm khi hàm được gọiBefore Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}8
Đây là hành vi tương tự được thể hiện bởi all , bất kể loại tham số mà chúng được truyền. Nghĩa là, việc gán giá trị mới cho tham số trong phần thân của hàm không bao giờ ảnh hưởng đến đối tượng
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3, cũng như việc gán giá trị mới cho chỉ mục function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3 sẽ không ảnh hưởng đến giá trị của tham số, ngay cả khi hàm chỉ có các tham số đơn giảnGhi chú. Bạn không thể viết một lệnh
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}17 trong phần thân của một định nghĩa hàm chấp nhận các tham số còn lại, mặc định hoặc bị hủy cấu trúc. Làm như vậy sẽ gây ra lỗi cú pháp
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3 là một đối tượng dạng mảng, có nghĩa là function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3 có thuộc tính Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}11 và các thuộc tính được lập chỉ mục từ 0, nhưng nó không có các phương thức tích hợp sẵn của
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
4 như Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}52 hoặc
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}53. Tuy nhiên, nó có thể được chuyển đổi thành một
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
4 thực, sử dụng một trong các cú pháp Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}55,
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}56 hoặc trải rộng
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
1Đối với các trường hợp sử dụng phổ biến, sử dụng nó như một đối tượng giống như mảng là đủ, vì cả hai đều có thể lặp lại và có chỉ số
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}11 và số. Ví dụ,
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}58 chấp nhận các đối tượng dạng mảng
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
4Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}59 Không dùng nữa
Tham chiếu đến hàm hiện đang thực thi mà các đối số thuộc về. Bị cấm ở chế độ nghiêm ngặt
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}10
Số lượng đối số được truyền cho hàm
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}81
Trả về một đối tượng Array iterator mới chứa các giá trị cho mỗi chỉ mục trong
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3Ví dụ này định nghĩa một hàm nối nhiều chuỗi. Đối số chính thức duy nhất của hàm là một chuỗi chứa các ký tự phân tách các mục để nối
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
9Bạn có thể chuyển bao nhiêu đối số tùy thích cho hàm này. Nó trả về một danh sách chuỗi bằng cách sử dụng từng đối số trong danh sách
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
0Ví dụ này định nghĩa một hàm tạo chuỗi chứa HTML cho danh sách. Đối số chính thức duy nhất cho hàm là một chuỗi có giá trị là
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}83 nếu danh sách không có thứ tự [gạch đầu dòng] hoặc
Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}84 nếu danh sách có thứ tự [được đánh số]. Hàm được định nghĩa như sau
function longestString[] {
let longest = '';
for [let i = 0; i longest.length] {
longest = arguments[i];
}
}
return longest;
}
3Bạn có thể chuyển bất kỳ số lượng đối số nào cho hàm này và nó thêm từng đối số dưới dạng một mục danh sách vào danh sách loại được chỉ định. Ví dụ