Computer >> Máy Tính >  >> Lập trình >> Javascript

Điều gì có nghĩa là Giá trị Nguyên thủy Bất biến trong JavaScript?

Trong JavaScript, bạn sẽ thường nghe nói rằng các giá trị nguyên thủy là bất biến, không giống như các giá trị không nguyên thủy, có thể thay đổi. Điều quan trọng là phải hiểu sự khác biệt giữa các loại giá trị này (còn được gọi là loại dữ liệu ) bởi vì nó sẽ giúp bạn đỡ phải đau đầu khi đi trên đường.

Giá trị nguyên thủy là những thứ như:

  • số
  • chuỗi
  • booleans

Các giá trị không nguyên thủy là:

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

Có thể thay đổi có nghĩa là nó có thể được thay đổi.

Bất biến có nghĩa là nó không thể được thay đổi.

Các giá trị không nguyên thủy có thể thay đổi

Sau đây là danh sách (mảng) những người được gán cho một biến:

let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph']

Bây giờ tôi muốn đột biến danh sách của tôi. Mutate chỉ đơn giản có nghĩa là thay đổi. Tôi muốn hoán đổi Arnold với Jean-Claude và in ra kết quả:

let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph']

peopleList[0] = 'Jean-Claude'

console.log(peopleList)

Nó đã làm việc! Chúng tôi chỉ tạo ra một đột biến trên một giá trị hiện có. Trong trường hợp này, giá trị hiện có là một mảng (danh sách) hoặc cụ thể hơn là một đối tượng mảng .

Trong JavaScript, các giá trị không phải nguyên thủy có thể thay đổi (có thể thay đổi).

Giá trị nguyên thủy là không thay đổi

Sau đây là giá trị văn bản (chuỗi) được gán cho một biến:

let person = 'Ernold'

Khỉ thật, thật không may, Arnold đã viết sai chính tả khi sử dụng chữ E thay vì chữ A trong chữ cái đầu tiên của tên anh ấy. Hãy nhanh chóng thay đổi điều đó và in ra kết quả:

let person = 'Ernold'

person[0] = 'A' 

console.log(person) // output: Ernold

Chờ đã, cái gì? Tại sao nó lại in ra “Ernold”? Chẳng phải chúng ta vừa hoán đổi E với A sao !?

Không, bởi vì giá trị chúng tôi đang cố gắng thay đổi là một chuỗi, giá trị nguyên thủy - và tất cả các giá trị nguyên thủy là bất biến (không thể thay đổi).

Chỉ các giá trị không phải nguyên thủy (đối tượng và chức năng) mới có thể thay đổi được.

Bạn bối rối?

Hoàn toàn bình thường nếu bạn nhầm lẫn về nội dung này khi bắt đầu hành trình học JavaScript của bạn bởi vì nhìn bề ngoài, các ví dụ ở trên trông và thậm chí hoạt động tương tự - trong một số tình huống.

Hãy in ra tên từ mảng của chúng tôi từ trước đó:

let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph']

console.log(peopleList[0]) // output: "Arnold"

Không có gì ngạc nhiên ở đó, nó in ra "Arnold" .

Bây giờ chúng ta hãy in ra chữ cái đầu tiên chuỗi của chúng tôi từ trước đó (tên sai chính tả):

let person = 'Ernold'

console.log(person[0]) // output: ??

Bạn nghĩ điều gì sẽ xảy ra?

...

...

Nó đã làm việc! Nó in ra "E" !

Bạn có mong đợi những điều trên không hoạt động?

Dù bằng cách nào, bài học quan trọng ở đây là bạn có thể truy cập một giá trị nguyên thủy theo cách tương tự như cách bạn truy cập các giá trị không nguyên thủy, nhưng bạn không thể thay đổi (biến đổi) nó. Đó là sự khác biệt lớn (truy cập so với đột biến).

Trong JavaScript, các giá trị nguyên thủy là chỉ đọc, trong khi các giá trị không phải nguyên thủy (đối tượng / mảng, hàm) đều là đọc và ghi.

Đó là lý do tại sao chúng tôi có thể thay đổi (thay đổi) giá trị mục đầu tiên trong mảng của chúng tôi từ Arnold tới Jean-Claude sớm hơn, nhưng chúng tôi không thể sửa một lỗi chính tả đơn giản từ "Ernold" tới "Arnold" - bởi vì nó là một chuỗi và chuỗi / giá trị nguyên thủy là bất biến.

Biến so với giá trị

(Tôi biết một số bạn đang nghĩ gì)

Mặc dù chúng tôi vừa kết luận rằng các giá trị nguyên thủy là bất biến, tôi vẫn quyết tâm sửa lỗi chính tả của “Ernold”. Hãy thử một cái gì đó mới!

Hãy xem đoạn mã sau (đọc kỹ):

let person = 'Ernold'

person = 'Arnold'

console.log(person) // output: ??

Xem xét những gì bạn đã học về các giá trị nguyên thủy, chẳng hạn như chuỗi, bạn có nghĩ rằng phần trên sẽ in ra Arnold , có hay không?

...

(Hãy nghĩ về nó)

...

Nó không in ra Arnold !

Một số bạn đã biết lý do tại sao, nhưng nếu bạn chưa biết thì đó là điều bình thường, bạn sẽ trải qua “khoảnh khắc aha” trong giây lát. Đọc kỹ đoạn sau.

Mã trên hoạt động vì chúng tôi không thay đổi giá trị chuỗi, thậm chí chúng tôi không chạm vào nó. Thay vào đó, chúng tôi đang chỉ định một mới giá trị chuỗi được gọi là 'Arnold' cho person nên nó không còn tham chiếu (trỏ tới) 'Ernold' Chuỗi giá trị.

Giá trị nguyên thủy không thể thay đổi, nhưng các biến có thể thay đổi!

Các biến không phải là giá trị, vì vậy các quy tắc về sự đồng biến hoặc bất biến không giống nhau. Các biến chỉ trỏ đến giá trị.

Chúng tôi chưa bao giờ chạm vào giá trị chuỗi cũ 'Ernold' trực tiếp, chúng tôi vừa nói với person của chúng tôi biến để trỏ đến một chuỗi khác được gọi là 'Arnold' và sau đó sử dụng console.log() để in ra kết quả.

Một số bạn có thể nghĩ rằng tôi đang đánh chết con ngựa ở đây, nhưng điều quan trọng là bạn phải nhận thức được điều này về cách JavaScript hoạt động. Sự lặp lại là bạn của bạn.

Lưu ý:loại biến chúng tôi đã sử dụng trong toàn bộ hướng dẫn này thuộc loại từ khóa let - có thể thay đổi, như bạn vừa thấy trong ví dụ mã trước. Chúng ta đã sử dụng const chưa thay đổi, tình huống sẽ khác - nhưng tôi sẽ lưu chủ đề đó cho một hướng dẫn khác.

Tóm lại:

Trong JavaScript:

  • các giá trị không phải nguyên thủy có thể được tham chiếu, truy cập - và biến đổi.
  • các giá trị nguyên thủy có thể được tham chiếu, được truy cập - nhưng không bị thay đổi.
  • biến và giá trị là hai thứ khác nhau, các quy tắc khác nhau sẽ được áp dụng.