Là tham chiếu chuỗi trong javascript?

Chủ đề tiếp theo chúng ta cần xem xét là nội dung của các biến. Chúng ta thường nói rằng các biến có hoặc chứa các giá trị. Nhưng chúng chứa đựng những gì? . Các loại có thể được chia thành hai nhóm. kiểu nguyên thủy và kiểu tham chiếu. Các số, giá trị boolean và các loại null và không xác định là nguyên thủy. Các đối tượng, mảng và hàm là các kiểu tham chiếu

Kiểu nguyên thủy có kích thước cố định trong bộ nhớ. Ví dụ: một số chiếm tám byte bộ nhớ và giá trị boolean có thể được biểu thị chỉ bằng một bit. Loại số là lớn nhất trong các loại nguyên thủy. Nếu mỗi biến JavaScript dự trữ tám byte bộ nhớ, thì biến đó có thể trực tiếp giữ bất kỳ giá trị nguyên thủy nào. []

Tuy nhiên, các loại tham chiếu là một vấn đề khác. Ví dụ, các đối tượng có thể có độ dài bất kỳ -- chúng không có kích thước cố định. Điều này cũng đúng với mảng. một mảng có thể có bất kỳ số phần tử nào. Tương tự, một hàm có thể chứa bất kỳ số lượng mã JavaScript nào. Vì các loại này không có kích thước cố định nên giá trị của chúng không thể được lưu trữ trực tiếp trong tám byte bộ nhớ được liên kết với mỗi biến. Thay vào đó, biến lưu trữ một tham chiếu đến giá trị. Thông thường, tham chiếu này là một số dạng con trỏ hoặc địa chỉ bộ nhớ. Bản thân nó không phải là giá trị dữ liệu, nhưng nó báo cho biến biết nơi cần tìm để tìm giá trị

Sự khác biệt giữa các kiểu nguyên thủy và tham chiếu là một điều quan trọng, vì chúng hoạt động khác nhau. Xem xét đoạn mã sau sử dụng số (kiểu nguyên thủy)

var a = 3.14;  // Declare and initialize a variable
var b = a;     // Copy the variable's value to a new variable
a = 4;         // Modify the value of the original variable
alert(b)       // Displays 3.14; the copy has not changed

Không có gì đáng ngạc nhiên về mã này. Bây giờ hãy xem điều gì sẽ xảy ra nếu chúng ta thay đổi mã một chút để nó sử dụng mảng (một kiểu tham chiếu) thay vì số

var a = [1,2,3];  // Initialize a variable to refer to an array
var b = a;        // Copy that reference into a new variable
a[0] = 99;        // Modify the array using the original reference
alert(b);         // Display the changed array [99,2,3] using the new reference

Nếu kết quả này không làm bạn ngạc nhiên, thì bạn đã quá quen thuộc với sự khác biệt giữa kiểu nguyên thủy và kiểu tham chiếu. Nếu nó có vẻ đáng ngạc nhiên, hãy xem kỹ dòng thứ hai. Lưu ý rằng đó là tham chiếu đến giá trị mảng, không phải chính mảng đó, được gán trong câu lệnh này. Sau dòng mã thứ hai đó, chúng ta vẫn chỉ có một đối tượng mảng;

Nếu sự phân biệt kiểu nguyên thủy và kiểu tham chiếu là mới đối với bạn, chỉ cần cố gắng ghi nhớ nội dung của biến. Các biến giữ các giá trị thực của các kiểu nguyên thủy, nhưng chúng chỉ chứa các tham chiếu đến các giá trị của các kiểu tham chiếu. Hành vi khác nhau của các kiểu nguyên thủy và kiểu tham chiếu được khám phá chi tiết hơn trong Phần 11. 2

Bạn có thể nhận thấy rằng tôi đã không chỉ định chuỗi là kiểu nguyên thủy hay kiểu tham chiếu trong JavaScript. Chuỗi là một trường hợp bất thường. Chúng có kích thước thay đổi, vì vậy rõ ràng chúng không thể được lưu trữ trực tiếp trong các biến có kích thước cố định. Để đạt hiệu quả, chúng tôi mong muốn JavaScript sao chép các tham chiếu đến chuỗi chứ không phải nội dung thực của chuỗi. Mặt khác, các chuỗi hoạt động giống như một kiểu nguyên thủy theo nhiều cách. Câu hỏi liệu chuỗi là kiểu nguyên thủy hay kiểu tham chiếu thực sự là tranh luận, bởi vì chuỗi là bất biến. không có cách nào để thay đổi nội dung của một giá trị chuỗi. Điều này có nghĩa là chúng ta không thể xây dựng một ví dụ giống như ví dụ trước để chứng minh rằng các mảng được sao chép theo tham chiếu. Cuối cùng, việc bạn coi chuỗi là một kiểu tham chiếu bất biến hoạt động như một kiểu nguyên thủy hay một kiểu nguyên thủy được triển khai với hiệu quả bên trong của một kiểu tham chiếu không quan trọng lắm.

Các chuỗi JavaScript được giữ theo giá trị và hoạt động chính xác như bất kỳ nguyên thủy nào khác. Điều này có nghĩa là mỗi khi chúng ta cắt một chuỗi, chúng ta thực sự chiếm thêm các khe bộ nhớ. Mặc dù sự đánh đổi này làm cho mã hóa thoải mái hơn và dễ dàng hơn rất nhiều, nhưng nó rất kém hiệu quả trong bộ nhớ

biên tập. Sau khi điều tra xung quanh, tôi phát hiện ra rằng một số trình duyệt sử dụng chuỗi thực tập, điều đó có nghĩa là trình duyệt sẽ chứa một nhóm các chuỗi ký tự có tham chiếu đến các chuỗi con của nó, do đó, việc quản lý bộ nhớ có thể dẫn đến điều gì đó khác biệt;

Hơn nữa, một khi bạn tạo một chuỗi, bạn tạo nó mãi mãi. Nếu bạn muốn thay đổi một trong các ký tự của nó, bạn sẽ phải xác định lại từ đầu

Tôi xin giới thiệu với các bạn về lớp ArrayBuffer. ArrayBuffer cung cấp cách cấp phát bộ nhớ và điều khiển trực tiếp. Nó đã xuất hiện từ lâu, khoảng từ năm 2012, nhưng nó rất hay bị bỏ qua. Ban đầu, nó được sinh ra do nhu cầu có một cách hiệu quả để xử lý dữ liệu nhị phân trong WebGL, nhưng nó có thể được sử dụng cho bất kỳ mục đích nào.

Giả sử rằng chúng tôi muốn tạo một chuỗi được tạo từ các đơn vị mã UTF-16, bao gồm các ký tự phổ biến nhất có thể được biểu thị bằng một giá trị 16 bit duy nhất, chúng tôi sẽ phải phân bổ 2 byte cho mỗi ký tự

Tập hợp các lớp khác đi đôi với ArrayBuffer là TypedArrays. Đối tượng TypedArray mô tả dạng xem dạng mảng của bộ đệm dữ liệu nhị phân bên dưới. Trong trường hợp của chúng tôi, vì chúng tôi muốn biểu diễn một chuỗi UTF-16, chúng tôi sẽ sử dụng Uint16Array TypedArray, bao gồm các số nguyên 16 bit không dấu

Vì chúng tôi đang chia sẻ cùng một đối tượng ArrayBuffer, bất kỳ thay đổi nào chúng tôi thực hiện trong một TypedArray sẽ được phản ánh trong đối tượng kia

Để hoàn thiện mọi thứ, chúng ta có thể chuyển đổi mã byte thành một chuỗi bằng cách sử dụng hàm String.fromCharCode()

Tất cả những điều trên có thể được kết hợp thành một vài lớp sẽ bao bọc logic đó và thậm chí thêm một số chức năng tiện ích tiện dụng

Vì vậy, quay trở lại đoạn mã đầu tiên trong bài viết này, đây là cách bộ nhớ sẽ trông như thế nào khi tách một chuỗi "hello world"

Lưu ý rằng ArrayBuffers cũng có thể được sử dụng để tham chiếu các loại giá trị nguyên thủy khác như số hoặc booleans, nó không nhất thiết phải áp dụng cho chuỗi. Miễn là bạn biết một giá trị nguyên thủy nhất định chiếm bao nhiêu bộ nhớ thì bạn có thể sử dụng được

Tài liệu tham khảo trong JavaScript là gì?

Tham khảo JavaScript đóng vai trò như kho lưu trữ dữ kiện về ngôn ngữ JavaScript . Toàn bộ ngôn ngữ được mô tả chi tiết ở đây. Khi bạn viết mã JavaScript, bạn sẽ thường xuyên tham khảo các trang này (do đó, tiêu đề là "Tham khảo JavaScript").

Chuỗi có được truyền theo tham chiếu hoặc giá trị trong JavaScript không?

Các loại dữ liệu nguyên thủy như chuỗi, số, null, không xác định và boolean, được truyền giá trị trong khi các loại dữ liệu không nguyên thủy như vậy .

Chuỗi trong JavaScript là gì?

Chuỗi là chuỗi gồm một hoặc nhiều ký tự có thể bao gồm các chữ cái, số hoặc ký hiệu . Các chuỗi trong JavaScript là các kiểu dữ liệu nguyên thủy và không thay đổi, có nghĩa là chúng không thay đổi.

Tham chiếu chuỗi là gì?

Chuỗi là một loại tham chiếu mặc dù nó có hầu hết các đặc điểm của một loại giá trị, chẳng hạn như không thay đổi và có == quá tải để so sánh văn bản thay vì đảm bảo rằng chúng tham chiếu cùng một đối tượng