Hướng dẫn glossary javascript - thuật ngữ javascript

Hướng dẫn JavaScript chỉ cho bạn cách sử dụng JavaScript và đưa ra một cái nhìn tổng quan về ngôn ngữ. Nếu bạn cần thông tin đầy đủ về một tính năng ngôn ngữ, hãy xem tham chiếu JavaScript.

Hướng dẫn này được chia thành các chương sau.

Giới thiệu

Tổng quan: Giới thiệu

  • Về sự hướng dẫn này
  • Về JavaScript
  • JavaScript và Java
  • Ecmascript
  • Công cụ
  • Chào thế giới

Ngữ pháp và các loại

Tổng quan: Ngữ pháp và các loại

  • Cú pháp và bình luận cơ bản
  • Tuyên bố
  • Phạm vi biến đổi
  • Tăng cường biến
  • Cấu trúc và loại dữ liệu
  • Nghĩa đen

Kiểm soát luồng và xử lý lỗi

Tổng quan: Xử lý luồng và xử lý lỗi

  • // Map dictionary -> DOESN'T WORK AS IS!
    const numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * The values() method returns a new iterator object that contains the values
       * for each element in the Map object in insertion order.
       */
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const squared = number * number;
    
        if (!numbers.has(`${squared}`)) {
          // "Iterate-and-Mutate" anti-pattern/problem:
          numbers.set(`${squared}`, squared);
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    2
  • // Map dictionary -> DOESN'T WORK AS IS!
    const numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * The values() method returns a new iterator object that contains the values
       * for each element in the Map object in insertion order.
       */
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const squared = number * number;
    
        if (!numbers.has(`${squared}`)) {
          // "Iterate-and-Mutate" anti-pattern/problem:
          numbers.set(`${squared}`, squared);
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    3
  • // Map dictionary -> DOESN'T WORK AS IS!
    const numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * The values() method returns a new iterator object that contains the values
       * for each element in the Map object in insertion order.
       */
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const squared = number * number;
    
        if (!numbers.has(`${squared}`)) {
          // "Iterate-and-Mutate" anti-pattern/problem:
          numbers.set(`${squared}`, squared);
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    4/
    // Map dictionary -> DOESN'T WORK AS IS!
    const numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * The values() method returns a new iterator object that contains the values
       * for each element in the Map object in insertion order.
       */
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const squared = number * number;
    
        if (!numbers.has(`${squared}`)) {
          // "Iterate-and-Mutate" anti-pattern/problem:
          numbers.set(`${squared}`, squared);
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    5/
    // Map dictionary -> DOESN'T WORK AS IS!
    const numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * The values() method returns a new iterator object that contains the values
       * for each element in the Map object in insertion order.
       */
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const squared = number * number;
    
        if (!numbers.has(`${squared}`)) {
          // "Iterate-and-Mutate" anti-pattern/problem:
          numbers.set(`${squared}`, squared);
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    6
  • Đối tượng lỗi

Vòng lặp và lặp lại

Tổng quan: Vòng lặp và Lặp lại

  • // Map dictionary -> DOESN'T WORK AS IS!
    const numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * The values() method returns a new iterator object that contains the values
       * for each element in the Map object in insertion order.
       */
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const squared = number * number;
    
        if (!numbers.has(`${squared}`)) {
          // "Iterate-and-Mutate" anti-pattern/problem:
          numbers.set(`${squared}`, squared);
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    7
  • // Map dictionary -> DOESN'T WORK AS IS!
    const numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * The values() method returns a new iterator object that contains the values
       * for each element in the Map object in insertion order.
       */
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const squared = number * number;
    
        if (!numbers.has(`${squared}`)) {
          // "Iterate-and-Mutate" anti-pattern/problem:
          numbers.set(`${squared}`, squared);
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    8
  • // Map dictionary -> DOESN'T WORK AS IS!
    const numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * The values() method returns a new iterator object that contains the values
       * for each element in the Map object in insertion order.
       */
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const squared = number * number;
    
        if (!numbers.has(`${squared}`)) {
          // "Iterate-and-Mutate" anti-pattern/problem:
          numbers.set(`${squared}`, squared);
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    9
  • // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    0
  • // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    1
  • // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    2
  • // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    3

Chức năng

Tổng quan: Chức năng

  • Xác định chức năng
  • Gọi chức năng
  • Phạm vi chức năng
  • Đóng cửa
  • Đối số & tham số
  • Hàm mũi tên

Biểu thức và toán tử

Tổng quan: Biểu thức và toán tử

  • Phân công & so sánh
  • Toán tử số học
  • Các nhà khai thác bitwise & logic
  • Nhà điều hành có điều kiện (ternary)

Số và ngày

Tổng quan: Số và ngày

  • Số chữ
  • Đối tượng
    // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    4
  • Đối tượng
    // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    5
  • // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    6 Đối tượng

Định dạng văn bản

Tổng quan: Định dạng văn bản

  • Chuỗi chữ
  • Đối tượng
    // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    7
  • Mẫu chữ
  • Quốc tế hóa
  • Biểu cảm thường xuyên

Bộ sưu tập được lập chỉ mục

Tổng quan: Bộ sưu tập được lập chỉ mục

  • Mảng
  • Gõ mảng

Bộ sưu tập khóa

Tổng quan: Bộ sưu tập khóa

  • // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    8
  • // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    9
  • // Object dictionary -> WORKS!
    const numbers = {
      '0': 0,
      '1': 1,
      '2': 2,
      '3': 3,
      '4': 4,
      '5': 5,
    };
    
    function compute(numbers) {
      /*
       * The Object.values() method returns an array of a given object's own
       * enumerable property values, in the same order as that provided by a
       * for...in loop.
       */
      for (number of Object.values(numbers)) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!numbers[`${square}`]) {
          numbers[`${square}`] = square;
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    0
  • // Object dictionary -> WORKS!
    const numbers = {
      '0': 0,
      '1': 1,
      '2': 2,
      '3': 3,
      '4': 4,
      '5': 5,
    };
    
    function compute(numbers) {
      /*
       * The Object.values() method returns an array of a given object's own
       * enumerable property values, in the same order as that provided by a
       * for...in loop.
       */
      for (number of Object.values(numbers)) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!numbers[`${square}`]) {
          numbers[`${square}`] = square;
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    1

Làm việc với các đối tượng

Tổng quan: Làm việc với các đối tượng

  • Đối tượng và thuộc tính
  • Tạo đối tượng
  • Xác định phương pháp
  • Getter và setter

Sử dụng các lớp học

Tổng quan: Sử dụng các lớp

  • Tuyên bố một lớp học
  • Các tính năng lớp khác nhau
  • Mở rộng và thừa kế
  • Tại sao các lớp học?

Hứa hẹn

Tổng quan: Lời hứa

  • Đảm bảo
  • Chuỗi
  • Sự truyền lỗi
  • Thành phần
  • Thời gian

Tererators và máy phát điện

Tổng quan: Trình lặp và máy phát điện

  • Trình lặp
  • Vòng lặp
  • Máy phát điện

Lập trình meta

Tổng quan: Lập trình meta

  • // Object dictionary -> WORKS!
    const numbers = {
      '0': 0,
      '1': 1,
      '2': 2,
      '3': 3,
      '4': 4,
      '5': 5,
    };
    
    function compute(numbers) {
      /*
       * The Object.values() method returns an array of a given object's own
       * enumerable property values, in the same order as that provided by a
       * for...in loop.
       */
      for (number of Object.values(numbers)) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!numbers[`${square}`]) {
          numbers[`${square}`] = square;
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    2
  • Người xử lý và bẫy
  • Proxy có thể hủy bỏ
  • // Object dictionary -> WORKS!
    const numbers = {
      '0': 0,
      '1': 1,
      '2': 2,
      '3': 3,
      '4': 4,
      '5': 5,
    };
    
    function compute(numbers) {
      /*
       * The Object.values() method returns an array of a given object's own
       * enumerable property values, in the same order as that provided by a
       * for...in loop.
       */
      for (number of Object.values(numbers)) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!numbers[`${square}`]) {
          numbers[`${square}`] = square;
        }
      }
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    3

Mô -đun JavaScript

Tổng quan: Mô -đun JavaScript

  • Xuất khẩu
  • Nhập khẩu
  • Xuất khẩu mặc định
  • Đổi tên các tính năng
  • Các mô -đun tổng hợp
  • Tải mô -đun động
  • Tiếp theo "

Trong JavaScript, cả

// Object dictionary -> WORKS!
const numbers = {
  '0': 0,
  '1': 1,
  '2': 2,
  '3': 3,
  '4': 4,
  '5': 5,
};

function compute(numbers) {
  /*
   * The Object.values() method returns an array of a given object's own
   * enumerable property values, in the same order as that provided by a
   * for...in loop.
   */
  for (number of Object.values(numbers)) {
    console.log('number:', number);

    const square = number * number;

    if (!numbers[`${square}`]) {
      numbers[`${square}`] = square;
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
4 và
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 đều có thể được sử dụng cho "Từ điển" (Cửa hàng cặp có giá trị khóa) khi chúng cho phép bạn thực hiện tất cả các hoạt động đọc và ghi cơ bản mà bạn mong đợi khi làm việc với cấu trúc dữ liệu như vậy: "Đặt", "Nhận được "," Xóa "và" Phát hiện "các khóa, Giá trị & Mục nhập. Trong lịch sử, và trước
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 thậm chí còn tồn tại trong JavaScript, chúng tôi đã sử dụng
// Object dictionary -> WORKS!
const numbers = {
  '0': 0,
  '1': 1,
  '2': 2,
  '3': 3,
  '4': 4,
  '5': 5,
};

function compute(numbers) {
  /*
   * The Object.values() method returns an array of a given object's own
   * enumerable property values, in the same order as that provided by a
   * for...in loop.
   */
  for (number of Object.values(numbers)) {
    console.log('number:', number);

    const square = number * number;

    if (!numbers[`${square}`]) {
      numbers[`${square}`] = square;
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
4 cho từ điển. Tuy nhiên, điều đó hoàn toàn ổn, có những khác biệt quan trọng làm cho
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 thích hợp hơn trong một số trường hợp và điều đó có thể được tìm thấy ở đây: https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/map# object_vs._maps

Về mặt cá nhân, trong trường hợp tôi hiện đang làm việc, tôi muốn sử dụng

// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 qua
// Object dictionary -> WORKS!
const numbers = {
  '0': 0,
  '1': 1,
  '2': 2,
  '3': 3,
  '4': 4,
  '5': 5,
};

function compute(numbers) {
  /*
   * The Object.values() method returns an array of a given object's own
   * enumerable property values, in the same order as that provided by a
   * for...in loop.
   */
  for (number of Object.values(numbers)) {
    console.log('number:', number);

    const square = number * number;

    if (!numbers[`${square}`]) {
      numbers[`${square}`] = square;
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
4 vì tôi cảm thấy rằng
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 sẽ phù hợp hơn cho những gì tôi đang cố gắng đạt được vào lúc này: từ điển lớn với hàng trăm triệu /Viết các hoạt động và dựa trên điểm chuẩn tùy chỉnh,
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 có vẻ nhanh hơn nhiều so với
// Object dictionary -> WORKS!
const numbers = {
  '0': 0,
  '1': 1,
  '2': 2,
  '3': 3,
  '4': 4,
  '5': 5,
};

function compute(numbers) {
  /*
   * The Object.values() method returns an array of a given object's own
   * enumerable property values, in the same order as that provided by a
   * for...in loop.
   */
  for (number of Object.values(numbers)) {
    console.log('number:', number);

    const square = number * number;

    if (!numbers[`${square}`]) {
      numbers[`${square}`] = square;
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
4 (một lần nữa, trong trường hợp của tôi).

Thật không may, khi lặp lại trên từ điển

// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 của tôi (một
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 có thể sử dụng được, vì vậy nó có thể được lặp trực tiếp với

// Map dictionary -> DOESN'T WORK AS IS!
const numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * The values() method returns a new iterator object that contains the values
   * for each element in the Map object in insertion order.
   */
  for (number of numbers.values()) {
    console.log('number:', number);

    const squared = number * number;

    if (!numbers.has(`${squared}`)) {
      // "Iterate-and-Mutate" anti-pattern/problem:
      numbers.set(`${squared}`, squared);
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
7), tôi đang phải đối mặt với vấn đề "lặp lại và đột biến" Tương tự
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 trong vòng lặp. Đó là một người chống lại!"Iterate-and-Mutate" problem: when iterating on a
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8, you are not supposed to mutate that same
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 within iterations. That's an anti-pattern!"Iterate-and-Mutate" problem: when iterating on a
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8, you are not supposed to mutate that same
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 within iterations. That's an anti-pattern!

Với

// Object dictionary -> WORKS!
const numbers = {
  '0': 0,
  '1': 1,
  '2': 2,
  '3': 3,
  '4': 4,
  '5': 5,
};

function compute(numbers) {
  /*
   * The Object.values() method returns an array of a given object's own
   * enumerable property values, in the same order as that provided by a
   * for...in loop.
   */
  for (number of Object.values(numbers)) {
    console.log('number:', number);

    const square = number * number;

    if (!numbers[`${square}`]) {
      numbers[`${square}`] = square;
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
4 (không thực hiện giao thức lặp và do đó các đối tượng không được lặp lại trực tiếp bằng cách sử dụng

// Map dictionary -> DOESN'T WORK AS IS!
const numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * The values() method returns a new iterator object that contains the values
   * for each element in the Map object in insertion order.
   */
  for (number of numbers.values()) {
    console.log('number:', number);

    const squared = number * number;

    if (!numbers.has(`${squared}`)) {
      // "Iterate-and-Mutate" anti-pattern/problem:
      numbers.set(`${squared}`, squared);
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
7 theo mặc định), tôi đang sử dụng Thuộc tính khóa chuỗi [khóa, giá trị] cặp. Do đó, vì tôi không lặp đi lặp lại trên từ điển, nhưng thực sự trên một bộ nhớ riêng biệt, tôi có thể viết/thay đổi từ điển của mình một cách an toàn, mà không phải đối mặt với bất kỳ vấn đề nào liên quan đến vấn đề "lặp lại và đột biến".

Khi sử dụng

// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 làm từ điển và để lặp và đột biến, một giải pháp là sao chép (sao chép nông hoặc sâu) từ điển, sau đó lặp lại từ điển ban đầu, nhưng chỉ làm biến đổi bản sao. Khi chu kỳ lặp kết thúc, gán bản sao cho từ điển ban đầu và xóa bản sao hiện vô dụng. Điều này đòi hỏi phải có một bản sao của từ điển
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 gốc trong bộ nhớ có không gian không cần thiết.

Có cách nào tốt hơn để phá vỡ vấn đề "lặp lại" chống lại "liên quan đến từ điển

// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
8 chứ không phải nhân bản?

Cảm ơn bạn!

Examples:

  1. // Map dictionary + clone (Deep Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Deep Copy).
       * The data itself is cloned (slow and take a lot of memory).
       */
      const clone = new Map([ ...numbers.entries() ]);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    9
// Object dictionary -> WORKS!
const numbers = {
  '0': 0,
  '1': 1,
  '2': 2,
  '3': 3,
  '4': 4,
  '5': 5,
};

function compute(numbers) {
  /*
   * The Object.values() method returns an array of a given object's own
   * enumerable property values, in the same order as that provided by a
   * for...in loop.
   */
  for (number of Object.values(numbers)) {
    console.log('number:', number);

    const square = number * number;

    if (!numbers[`${square}`]) {
      numbers[`${square}`] = square;
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
  1. // Map dictionary + clone (Shallow Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Shallow Copy).
       * The data itself is not cloned (faster and take less memory than Deep Copy).
       */
      const clone = new Map(numbers);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    0
// Map dictionary -> DOESN'T WORK AS IS!
const numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * The values() method returns a new iterator object that contains the values
   * for each element in the Map object in insertion order.
   */
  for (number of numbers.values()) {
    console.log('number:', number);

    const squared = number * number;

    if (!numbers.has(`${squared}`)) {
      // "Iterate-and-Mutate" anti-pattern/problem:
      numbers.set(`${squared}`, squared);
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
  1. // Map dictionary + clone (Shallow Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Shallow Copy).
       * The data itself is not cloned (faster and take less memory than Deep Copy).
       */
      const clone = new Map(numbers);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    1 (chậm và lấy nhiều bộ nhớ)
// Map dictionary + clone (Deep Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Deep Copy).
   * The data itself is cloned (slow and take a lot of memory).
   */
  const clone = new Map([ ...numbers.entries() ]);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
  1. // Map dictionary + clone (Shallow Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Shallow Copy).
       * The data itself is not cloned (faster and take less memory than Deep Copy).
       */
      const clone = new Map(numbers);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    2 (nhanh hơn và có ít bộ nhớ hơn bản sao sâu, nhưng vẫn ...)
// Map dictionary + clone (Shallow Copy) -> WORKS!
let numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * We create a clone (Shallow Copy).
   * The data itself is not cloned (faster and take less memory than Deep Copy).
   */
  const clone = new Map(numbers);

  // Then, we iterate on the original dictionary.
  for (number of numbers.values()) {
    console.log('number:', number);

    const square = number * number;

    if (!clone.has(`${square}`)) {
      // But we mutate the clone, not the original dictionary.
      clone.set(`${square}`, square);
    }
  }

  // Finally, we assign 'clone' to original dictionary 'numbers'.
  numbers = clone;
  // And delete 'clone'.
  delete clone;

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
  1. // Map dictionary + clone (Shallow Copy) -> WORKS!
    let numbers = new Map([
      ['0', 0],
      ['1', 1],
      ['2', 2],
      ['3', 3],
      ['4', 4],
      ['5', 5],
    ]);
    
    function compute(numbers) {
      /*
       * We create a clone (Shallow Copy).
       * The data itself is not cloned (faster and take less memory than Deep Copy).
       */
      const clone = new Map(numbers);
    
      // Then, we iterate on the original dictionary.
      for (number of numbers.values()) {
        console.log('number:', number);
    
        const square = number * number;
    
        if (!clone.has(`${square}`)) {
          // But we mutate the clone, not the original dictionary.
          clone.set(`${square}`, square);
        }
      }
    
      // Finally, we assign 'clone' to original dictionary 'numbers'.
      numbers = clone;
      // And delete 'clone'.
      delete clone;
    
      return numbers;
    }
    
    console.time('timer');
    const result = compute(numbers);
    console.timeEnd('timer');
    
    console.log('result:', result);
    
    3
// Map dictionary -> DOESN'T WORK AS IS!
const numbers = new Map([
  ['0', 0],
  ['1', 1],
  ['2', 2],
  ['3', 3],
  ['4', 4],
  ['5', 5],
]);

function compute(numbers) {
  /*
   * The values() method returns a new iterator object that contains the values
   * for each element in the Map object in insertion order.
   */
  for (number of numbers.values()) {
    console.log('number:', number);

    const squared = number * number;

    if (!numbers.has(`${squared}`)) {
      // "Iterate-and-Mutate" anti-pattern/problem:
      numbers.set(`${squared}`, squared);
    }
  }

  return numbers;
}

console.time('timer');
const result = compute(numbers);
console.timeEnd('timer');

console.log('result:', result);
1