var, let, const - Khác nhau chỗ nào trong app script google

Trong Google Apps Script (GAS), các từ khóa var, let, và const đều được sử dụng để khai báo biến, nhưng chúng có sự khác biệt nhau như thế nào ?

  1. var
  2. let
  3. const
  4. Tóm tắt sự khác biệt let, var, const
  5. Khi nào nên dùng gì?
  6. Chia sẽ một số kinh nghiệp về let,var, const

Các từ khóa var, let, và const đều được sử dụng để khai báo biến, nhưng chúng có sự khác biệt về phạm vi, khả năng thay đổi giá trị, và cách thức hoạt động trong các ngữ cảnh khác nhau.

1. var

   

 var so=10; 

    Phạm vi: Biến khai báo bằng var có phạm vi trong hàm (function scope) hoặc toàn bộ đoạn mã (global scope) nếu khai báo bên ngoài hàm.
    Khả năng thay đổi: Biến có thể thay đổi giá trị sau khi khai báo.
    Hoisting: Biến khai báo bằng var sẽ được "hoisted" (dời lên đầu phạm vi), nghĩa là nó sẽ được tạo ra tại đầu phạm vi, mặc dù chỉ có giá trị undefined trước khi gán giá trị thực tế.

 Logger.log(x);  // undefined (do hoisting)
  var x = 10;
  Logger.log(x);  // 10

2. let

    Phạm vi: Biến khai báo bằng let có phạm vi trong khối lệnh (block scope). Điều này có nghĩa là biến chỉ tồn tại trong phạm vi khối {} mà nó được khai báo.
    Khả năng thay đổi: Biến khai báo bằng let có thể thay đổi giá trị sau khi khai báo.
    Hoisting: Biến khai báo bằng let cũng bị hoisted, nhưng không thể truy cập được trước khi khai báo do có "temporal dead zone" (khoảng không thể truy cập trước khi khai báo).

  // console.log(x);  // ReferenceError: Cannot access 'x' before initialization
  let x = 10;
  console.log(x);  // 10

3. const

    Phạm vi: Biến khai báo bằng const có phạm vi trong khối lệnh (block scope), tương tự như let.
    Khả năng thay đổi: Biến khai báo bằng const không thể thay đổi giá trị sau khi khai báo. Tuy nhiên, nếu giá trị là một đối tượng (object) hoặc mảng (array), bạn có thể thay đổi các thuộc tính hoặc phần tử bên trong đối tượng/mảng đó.
    Hoisting: Biến khai báo bằng const cũng bị hoisted và có "temporal dead zone" giống như let.

  // console.log(x);  // ReferenceError: Cannot access 'x' before initialization
  const x = 10;
  console.log(x);  // 10
 
  // x = 20;  // TypeError: Assignment to constant variable.

4. Tóm tắt sự khác biệt let, var, const

    Phạm vi:
        var: Hàm (function) hoặc toàn cục.
        let, const: Khối lệnh (block).

    Khả năng thay đổi giá trị:
        var, let: Có thể thay đổi giá trị.
        const: Không thể thay đổi giá trị.

    Hoisting:
        var: Hoisted và có giá trị undefined trước khi khai báo.
        let, const: Hoisted nhưng không thể truy cập được cho đến khi khai báo.

Dưới đây là bảng so sánh sự khác biệt giữa var, let, và const trong Google Apps Script (hoặc JavaScript nói chung):

Đặc điểm var let const
Phạm vi Hàm (function scope) hoặc toàn cục (global scope) Khối lệnh (block scope) Khối lệnh (block scope)
Khả năng thay đổi giá trị Có thể thay đổi giá trị Có thể thay đổi giá trị Không thể thay đổi giá trị (immutable)
Hoisting Hoisted lên đầu phạm vi với giá trị undefined Hoisted, nhưng không thể truy cập trước khi khai báo (temporal dead zone) Hoisted, nhưng không thể truy cập trước khi khai báo (temporal dead zone)
Có thể khai báo lại trong cùng phạm vi? Có thể khai báo lại Không thể khai báo lại trong phạm vi khối lệnh Không thể khai báo lại trong phạm vi khối lệnh
Giá trị mặc định khi chưa gán? undefined Không có giá trị mặc định, sẽ gây lỗi khi truy cập trước khi gán Không có giá trị mặc định, sẽ gây lỗi khi truy cập trước khi gán
Ứng dụng Thường không nên dùng trong mã mới, chỉ còn dùng trong mã cũ Dùng khi cần khai báo biến có thể thay đổi trong phạm vi khối lệnh Dùng khi bạn không muốn thay đổi giá trị của biến, đặc biệt là với đối tượng hoặc mảng

5. Khi nào nên dùng gì?

    const: Khi bạn không muốn thay đổi giá trị của biến (nhưng có thể thay đổi nội dung của đối tượng/mảng nếu cần).
    let: Khi bạn cần khai báo một biến và có thể thay đổi giá trị của nó trong quá trình thực thi.
    var: Nên tránh sử dụng, trừ khi bạn cần tính tương thích với mã cũ, vì let và const cung cấp sự kiểm soát tốt hơn về phạm vi và hoisting.

6. Chia sẽ một số kinh nghiệp về let,var, const

Ví dụ 1:

 var so=100;
function chenDL()
{  
   var a=5;
   if(a>0)
      var so=1;
   Logger.log(so);   
}

Qua ví dụ trên nếu bạn là một lập trình kinh nghiệm sẽ nhận ra vấn đề ngay, nhưng nếu bạn mới học ngôn ngữ javascript sẽ khó nhận ra ví dụ trên nói điều gì ? tôi sẽ nó như như thế này.

Khi bạn viết một ứng dụng web thì không phải chỉ có 7 dòng code như thế, có thể lên đến hàng nghìn dòng, và có hàng trăm biến cần sử dụng nên việc khai báo biến so sẽ để ở 1 dòng nào đó mà ta có thể quên, nhưng vô tình chúng khai báo lại biến so thì làm giá trị bị thay đổi và có thể dẫn đến các phép toán bị sai.

Điều này ta sẽ không mong muốn, vì không cố tính tạo lại biến so

nên khai báo let ra đời giúp giải quyết vấn đề khai báo trùng ghi đè giá trị biến so thế này.

* Giải pháp: đổi var thành const thì giá trị biến sẽ không bị thay đổi trong quá trình chạy code.

Bạn hãy chạy ví dụ dưới và xem giá trị của biến so có gì đặc biệt so với ví dụ trên khai báo dạng ver

  var so=100;
function chenDL()
{  
   var a=5;
   if(a>0)
   {
      let so=1;
      Logger.log("Giá trị biến so trong if:"+so);   
   }
   Logger.log("Giá trị biến so ngoài if:"+so);   
}

 // kết quả là
Giá trị biến so trong if:1
Giá trị biến so ngoài if:100

// Suy ra: nếu là var thì trong if biến số bị thay đổi giá trị ban đầu, coi như là bị khai báo lại biến số.
Khi ta dùng len thì phạm vi biến không ảnh hưởng

Trong ngôn ngữ lập trình người ta hay dùng từ scope (phạm vi) còn gọi là pham vi sử dụng của biến.

Nếu là let so=1; thì phạm vi biến so chỉ trong if { ...... } 

let chỉ cho phép update giá trị biến chứ không có khai báo lại

//nếu var

var a=1;
var a=10; // biến a đã khai báo lại và cập nhật là 10

//nếu let thì

let a=1;
let a=10; // sẽ báo lỗi là biến a đã tồn tại

Ta thấy let quản lý biến chặc chẽ hơn.

* Trong lập trình như C#, hay JAVA... ngay từ đầu quản lý rất chặc chẻ, nhưng bản chất của javascript là một ngôn ngữ dành cho hầu hết các mọi đối tượng lập trình nên ngay từ đầu họ đã không gò ép các kiểu khai báo biến, nhưng trong quá trình vận hành của phần mềm web các chuyên gia đã nhận ra và thay đổi lại cho phù hợp.


Khai báo biến var có thể cập nhật và khai báo lại trong phạm vi ứng dụng web của nó;
Khai báo kiển let có thể cập nhật giá trị nhưng không khai báo lại được;
Các biến const không thể cập nhật là giá trị cũng như không thể khai báo lại.
Nhưng các biến var được khởi tạo với giá trị undefined, còn khai báo biến let và const không như vậy, chúng không được khởi tạo.
Khai báo kiển var và let có thể khai báo mà không cần khởi tạo, const phải được khởi tạo trong quá trình khai báo

 

Tìm kiếm:

Bài viết liên quan:

Trong Google Apps Script (GAS), các từ khóa var, let, và const đều được sử dụng để khai báo biến, nhưng chúng có sự khác biệt nhau như thế nào ?