Hướng dẫn mutable and immutable in javascript - có thể thay đổi và bất biến trong javascript

  • Tổng quan / Công nghệ web

    Tài liệu tham khảo công nghệ web cho các nhà phát triển

  • HTML

    Cấu trúc nội dung trên web

  • CSS

    Mã được sử dụng để mô tả kiểu tài liệu

  • JavaScript

    Ngôn ngữ kịch bản đa năng

  • HTTP

    Giao thức truyền tài nguyên web

  • API web

    Giao diện để xây dựng các ứng dụng web

  • Tiện ích mở rộng web

    Phát triển tiện ích mở rộng cho trình duyệt web

  • Công nghệ web

    Tài liệu tham khảo công nghệ web cho các nhà phát triển

  • Đi làm mọi thứ

    Tôi đã viết một chút trước đây về tính bất biến và cách tạo ra các mảng và đối tượng bất biến với vani JS.

    Một trong những điều mà học sinh của tôi thường thấy khó hiểu về tính bất biến là những gì thực sự có nghĩa là bất biến.

    Hãy để khám phá điều đó một chút.

    Tạo một bản sao của một biến

    Hãy nói rằng bạn có một số thứ được lưu vào các biến và bạn muốn tạo các bản sao.

    var num1 = 42;
    var str1 = 'Hello';
    var arr1 = [1, 2, 3];
    var obj1 = {greeting: 'hello', name: 'world'};
    

    Với các số và chuỗi, việc gán biến ban đầu cho một biến mới tạo ra một mục mới.

    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    

    Đối tượng và mảng hoạt động rất lớn. Việc gán biến ban đầu cho một biến mới tạo ra một tham chiếu đến bản gốc chứ không phải là một mục mới.

    // Copy items
    var arr2 = arr1;
    var obj2 = obj1;
    
    // Update the copies
    arr2.push(4, 5, 6);
    obj2.name = 'universe';
    
    // Logs [1, 2, 3, 4, 5, 6]
    console.log(arr1);
    
    // Logs {greeting: 'hello', name: 'universe'}
    console.log(obj1);
    

    Mặc dù các bản sao là những bản được sửa đổi, các mảng và đối tượng ban đầu cũng được cập nhật. Các biến mới chỉ trở lại bản gốc.

    Ở đây, một bản demo với tất cả các ví dụ này.

    Vì vậy, có nghĩa là gì có nghĩa là bất biến?

    Nếu một mục có thể thay đổi, việc sửa đổi bản sao cũng sửa đổi bản gốc. Nếu nó bất biến, việc sửa đổi bản sao không ảnh hưởng đến bản gốc.

    Nó khó hiểu vì âm thanh bất biến như vật phẩm có thể thay đổi. Mặc dù vậy, điều thực sự có nghĩa là bản gốc không thay đổi khi bản sao.

    Hy vọng điều đó sẽ xóa một số điều lên!


    Xuất bản ngày 23 tháng 3 năm 2021last cập nhật ngày 18 tháng 9 năm 2021

    Bạn thường nghe các nhà phát triển phản ứng dày dạn nhất đề nghị sử dụng toán tử lây lan để sao chép một mảng thay vì chỉ đơn giản là gán nó cho một biến mới. Điều này có liên quan đến các loại dữ liệu cụ thể là một loại tham chiếu trong JavaScript, do đó có thể thay đổi. Khái niệm về tính đột biến và tính bất biến trong JavaScript là điều cần thiết để hiểu để tránh các lỗi. Hãy cùng đi sâu hơn vào ý tưởng về tính đột biến so với tính bất biến trong JavaScript.

    Các loại nguyên thủy so với các loại tham chiếu trong JavaScript

    Dữ liệu được gán cho biến JavaScript có thể thuộc hai loại, loại nguyên thủy và loại tham chiếu. Có một sự khác biệt trong cách JavaScript đối xử với hai loại dữ liệu này. Để biết chúng được đối xử khác nhau như thế nào, trước tiên, hãy để hiểu về sự khác biệt giữa các loại nguyên thủy và tham chiếu.

    Các loại nguyên thủy

    Các loại nguyên thủy là các phần dữ liệu nguyên tử đơn giản trong JavaScript. Các loại nguyên thủy luôn được lưu và truy cập bởi giá trị của biến chứ không phải là tham chiếu đến một đối tượng khác. Có sáu loại nguyên thủy trong JavaScript:

    • chưa xác định
    • null
    • boolean
    • con số
    • sợi dây
    • Biểu tượng

    Các loại tham chiếu

    Các loại tham chiếu không phải là giá trị nguyên tử đơn giản nhưng là các đối tượng được tạo thành từ nhiều thuộc tính được gán cho chúng. Chúng được lưu trữ dưới dạng tham chiếu trong bộ nhớ và không phải là giá trị độc lập được gán cho các biến. Có ba loại tham chiếu trong JavaScript:

    • các đối tượng
    • Mảng
    • chức năng

    Cách các loại nguyên thủy và loại tham chiếu được lưu trữ trong bộ nhớ

    Làm thế nào các loại nguyên thủy và các loại tham chiếu được lưu trữ trong bộ nhớ là cơ sở của cách chúng khác nhau. Hãy cùng nhìn vào một vài ví dụ và cố gắng hiểu cách họ sử dụng bộ nhớ khác nhau.

    Sử dụng bộ nhớ theo các loại nguyên thủy

    Như đã nhấn mạnh trước đó, các loại nguyên thủy được lưu trữ dưới dạng một giá trị nguyên tử duy nhất được gán cho một biến trong bộ nhớ. Hãy để xem ví dụ này:

    let name = 'john';
    let name2 = name;
    

    Hướng dẫn mutable and immutable in javascript - có thể thay đổi và bất biến trong javascript

    Nhìn vào ví dụ trên, tôi đã tạo một tên biến và gán cho nó một giá trị john. Bây giờ JavaScript sẽ lưu điều này dưới dạng một giá trị nguyên tử duy nhất trong bộ nhớ. Bây giờ, nếu tôi tạo một biến mới

    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    0 và gán cho nó một giá trị của tên biến JavaScript sẽ đi trước và tạo một không gian mới trong bộ nhớ và phân bổ cùng một giá trị của tên biến và gán nó cho biến
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    0. Giá trị mới được gán cho biến
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    0, hoàn toàn tách biệt với biến
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    3 và không có bất kỳ tham chiếu nào đến nó.

    Sử dụng bộ nhớ bởi các loại tham chiếu

    Các giá trị tham chiếu là các đối tượng được lưu trữ trong bộ nhớ và tham chiếu đến các đối tượng thay vì các vị trí chuyên dụng trong bộ nhớ, không giống như các loại nguyên thủy. Hãy cùng xem xét ví dụ sau để hiểu rõ hơn cách các loại tham chiếu được lưu trong bộ nhớ bởi JavaScript.

    let person = {
        name: 'john',
        age: 22,
    };
    
    let person2 = person;
    

    Hãy để Lừa chỉ tuyên bố một biến được gọi là người sẽ chứa một đối tượng chứa

    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    3 và tuổi của đối tượng người. Bây giờ tôi sẽ tiếp tục và tạo một biến khác có tên
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5 và gán nó cùng một đối tượng
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    6. Đây là nơi mọi thứ bắt đầu trở nên khác biệt so với các loại nguyên thủy. Trong trường hợp này, JavaScript sẽ lưu đối tượng
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5 chỉ đơn giản là tham chiếu đến đối tượng
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    6.

    Hướng dẫn mutable and immutable in javascript - có thể thay đổi và bất biến trong javascript

    Nếu bạn nhìn vào hình ảnh này, bạn sẽ nhận ra rằng JavaScript ở đây thực sự chỉ vào cùng một đối tượng trong bộ nhớ. Mặc dù nó đã tạo ra một biến mới, như một giá trị, biến đó chỉ đề cập đến cùng một đối tượng

    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    6 mà chúng ta đã tạo trước đây.

    Hiểu về tính bất biến và tính đột biến của các loại nguyên thủy và tham chiếu trong JavaScript

    Vì chúng ta hiện đang rõ ràng với các loại nguyên thủy và tham chiếu trong JavaScript, chúng ta có thể dễ dàng hiểu được khái niệm về tính đột biến và tính bất biến trong JavaScript. Có thể thay đổi hoặc thay đổi vào nơi bất biến có nghĩa là một cái gì đó không thể thay đổi hoặc thêm vào. Các giá trị nguyên thủy trong JavaScript không thể có bất cứ điều gì được thêm vào chúng, chúng chỉ có thể được gán lại và do đó tất cả các giá trị nguyên thủy trong JavaScript là bất biến. Hãy xem điều này với một ví dụ.

    let name = 'john';
    let name2 = name;
    
    console.log(name);
    console.log(name2);
    
    /*
     * john
     * john 
     */
    
    let name2 = 'doe';
    
    console.log(name);
    console.log(name2);
    
    /*
     * john
     * doe 
     */
    

    Mở rộng ví dụ trước đây của chúng tôi về các loại nguyên thủy, hãy để in các giá trị của cả hai biến của chúng tôi, tức là

    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    3 và
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    0 vào bảng điều khiển và xem những gì chúng tôi nhận được. Như mong đợi, cả biến trả lại giá trị john. Bây giờ, hãy để chỉ định lại ____10 thành
    // Copy items
    var arr2 = arr1;
    var obj2 = obj1;
    
    // Update the copies
    arr2.push(4, 5, 6);
    obj2.name = 'universe';
    
    // Logs [1, 2, 3, 4, 5, 6]
    console.log(arr1);
    
    // Logs {greeting: 'hello', name: 'universe'}
    console.log(obj1);
    
    4 và sau đó một lần nữa in các giá trị của cả hai biến vào bảng điều khiển. Bây giờ bạn thấy rằng giá trị của chỉ
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    0 được JavaScript gán lại thành
    // Copy items
    var arr2 = arr1;
    var obj2 = obj1;
    
    // Update the copies
    arr2.push(4, 5, 6);
    obj2.name = 'universe';
    
    // Logs [1, 2, 3, 4, 5, 6]
    console.log(arr1);
    
    // Logs {greeting: 'hello', name: 'universe'}
    console.log(obj1);
    
    4, nhưng biến
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    3 không thay đổi. Chương trình này cho thấy JavaScript xử lý riêng 2 biến này, mặc dù
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    0 ban đầu được sao chép từ biến
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    3. Điều này chứng minh rằng các giá trị nguyên thủy trong JavaScript, trong trường hợp này, chuỗi, là bất biến.

    Hãy cùng cố gắng sao chép cùng một ví dụ cho các loại tham chiếu. Chọn từ ví dụ trước của chúng tôi, hãy để in các giá trị của cả hai đối tượng

    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    6 và
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5 vào bảng điều khiển và xem những gì chúng tôi nhận được.

    let person = {
        name: 'john',
        age: 22,
    };
    
    let person2 = person; 
    
    console.log(person);
    console.log(person2);
    
    /*
    * {
    * name: 'john',
    * age: 22,
    * }
    *
    * {
    * name: 'john',
    * age: 22,
    * }
    */
    

    Chúng tôi thấy hai đối tượng được in trên bảng điều khiển có cùng thuộc tính. Bây giờ tôi sẽ thay đổi một trong các thuộc tính của đối tượng

    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5 và in lại vào bảng điều khiển.

    let person2.name = 'doe'; 
    
    console.log(person);
    console.log(person2);
    
    /*
    * {
    * name: 'doe',
    * age: 22,
    * }
    *
    * {
    * name: 'doe',
    * age: 22,
    * }
    */
    

    Bạn thấy rằng JavaScript đã thay đổi người cũng như

    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5. Điều này là do đối tượng
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5 được tạo bằng cách tham chiếu đối tượng
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    6. Với các loại tham chiếu, JavaScript tạo một tham chiếu đến cùng một đối tượng và đối tượng vẫn có thể thay đổi. Vì đối tượng có thể thay đổi, nó có thể được thay đổi hoặc một thuộc tính mới có thể được thêm vào.

    Toán tử lây lan, toán tử lây lan được giới thiệu trong ES6 (thêm thông tin về ES6 và cho phép bạn sao chép các đối tượng của mình một cách an toàn và tạo một thể hiện mới của đối tượng thay vì chỉ tham chiếu đối tượng trước đó. Chúng ta hãy xem ví dụ tương tự và xem cách chúng ta có thể sao chép một đối tượng và lưu một thể hiện mới của đối tượng của biến.
    The spread operator was introduced in ES6 ( more information on ES6 and lets you copy your objects safely and create a new instance of the object instead of merely referencing the previous object. Let’s look at the same example and see how we can copy an object and save a new instance of the variable's object.

    let person = {
        name: 'john',
        age: 22,
    };
    
    let person2 = {...person};
    let person2.name = 'doe';
    
    console.log(person);
    console.log(person2);
    
    /*
    * {
    * name: 'john',
    * age: 22,
    * }
    *
    * {
    * name: 'doe',
    * age: 22,
    * }
    */
    

    Hãy để Lừa lấy cùng một đối tượng

    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    6 và thay vì gán trực tiếp cho một biến lần này, hãy để sử dụng toán tử lây lan để sao chép nó. Toán tử lây lan có thể được sử dụng bằng tiền tố ba chấm
    let name = 'john';
    let name2 = name;
    
    7 trước đối tượng mà bạn muốn sao chép và gói gọn nó bằng cú pháp đối tượng theo nghĩa đen. Bằng cách này, JavaScript tạo ra một đối tượng mới và lưu trữ nó trong biến
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5. Hãy để cố gắng thay đổi một trong các thuộc tính của
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5. Tôi sẽ thay đổi tên thành
    // Copy items
    var arr2 = arr1;
    var obj2 = obj1;
    
    // Update the copies
    arr2.push(4, 5, 6);
    obj2.name = 'universe';
    
    // Logs [1, 2, 3, 4, 5, 6]
    console.log(arr1);
    
    // Logs {greeting: 'hello', name: 'universe'}
    console.log(obj1);
    
    4. Bây giờ, hãy để Lôi in cả đối tượng vào bảng điều khiển và xem những gì chúng ta nhận được. Bạn thấy, lần này, chúng tôi chỉ thay đổi thuộc tính tên của đối tượng
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5 chứ không phải đối tượng
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    6. Điều này là do
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    5 đã được tạo và lưu dưới dạng đối tượng mới bằng cách sử dụng toán tử lây lan chứ không phải là tham chiếu đến đối tượng
    // Copy items
    var num2 = num1;
    var str2 = str1;
    
    // Update the copies
    num2 = num2 - 10;
    str2 += ' world';
    
    // Logs 42
    console.log(num1);
    
    // Logos "Hello"
    console.log(str1);
    
    6.

    Nhận quyền truy cập vào nhiều câu chuyện như vậy trên Cloudaff, cảm ơn vì đã đọc, và hy vọng, điều này là hữu ích! Tôi đã tạo ra một trò lừa đảo JavaScript rộng rãi. Nó đã được thiết kế theo cách mà bạn dễ dàng tham khảo từng thuộc tính và phương thức cho các đối tượng JavaScript khác nhau. Nó hoàn toàn miễn phí để tải xuống từ liên kết trên.
    Thanks for reading, and hopefully, this was helpful!
    I have created an extensive JavaScript cheatsheet. It has been designed in a manner where it becomes easy for you to refer to each property and method for various JavaScript objects. It’s absolutely free to download from the above link ☺.

    Ví dụ với JavaScript với ví dụ là gì?

    Dữ liệu bất biến không thể thay đổi cấu trúc của nó hoặc dữ liệu trong đó. Nó đặt một giá trị trên một biến không thể thay đổi, làm cho giá trị đó trở thành một sự thật, hoặc giống như một nguồn sự thật - giống như cách một công chúa hôn một con ếch với hy vọng nó sẽ biến thành một hoàng tử đẹp trai. Bất biến nói rằng ếch sẽ luôn là một con ếch.cannot change its structure or the data in it. It's setting a value on a variable that cannot change, making that value a fact, or sort of like a source of truth — the same way a princess kisses a frog hoping it will turn into a handsome prince. Immutability says that frog will always be a frog.

    Định nghĩa là gì so với bất biến là gì?

    Một đối tượng có thể thay đổi có thể được thay đổi sau khi nó được tạo và một đối tượng bất biến không thể.Điều đó nói rằng, nếu bạn xác định lớp của riêng mình, bạn có thể làm cho các đối tượng của nó trở nên bất biến bằng cách làm cho tất cả các trường cuối cùng và riêng tư.. That said, if you're defining your own class, you can make its objects immutable by making all fields final and private.

    Điều gì là thay đổi và không thể thay đổi trong JavaScript?

    Một giá trị có thể thay đổi là một giá trị có thể được thay đổi mà không tạo ra một giá trị hoàn toàn mới.Trong JavaScript, các đối tượng và mảng có thể thay đổi theo mặc định, nhưng các giá trị nguyên thủy thì không - một khi giá trị nguyên thủy được tạo ra, nó không thể thay đổi, mặc dù biến giữ nó có thể được chỉ định lại.. In JavaScript, objects and arrays are mutable by default, but primitive values are not — once a primitive value is created, it cannot be changed, although the variable that holds it may be reassigned.

    Điều gì có thể thay đổi và bất biến với một ví dụ?

    Các đối tượng trong đó bạn có thể thay đổi các trường và trạng thái sau khi đối tượng được tạo được gọi là các đối tượng có thể thay đổi.Ví dụ: Java.... Sự khác biệt giữa có thể thay đổi và bất biến trong Java là gì ?.