Từ khóa typeof
được sử dụng để phân biệt các kiểu nguyên thủy trong JavaScript. Nó sẽ trả về một trong chín chuỗi. undefined
, object
[có nghĩa là null], boolean
, number
, bigint
, string
, symbol
, function
hoặc object
[có nghĩa là bất kỳ đối tượng nào, bao gồm cả mảng]
Ảnh của Mr Cup / Fabien Barral trên Bapt
Toán tử
typeof
rất hữu ích vì đây là một cách dễ dàng để kiểm tra loại biến trong mã của bạn. Điều này rất quan trọng vì JavaScript là ngôn ngữ được nhập động. — freeCodeCamp
T câu lệnh typeof
2 thực sự hữu ích trong JavaScript để xác thực dữ liệu và kiểm tra kiểu, nhưng nó có một số tính năng kỳ lạ cần lưu ý.
Cụ thể, có hai trường hợp khi typeof
trả về typeof
4 theo cách không mong muốn và điều này làm cho việc kiểm tra kiểu trở nên hơi bất thường
Cả typeof
typeof
6 và typeof
một mảng đều trả về typeof
4 theo cách có khả năng gây hiểu nhầm, vì typeof
9 là một kiểu nguyên thủy [không phải đối tượng] và mảng là một kiểu đối tượng đặc biệt, tích hợp sẵn trong JavaScript
Trong bài viết này, tôi kiểm tra mọi kết quả có thể có của typeof
trong JavaScript
Ảnh của Alex Đọc trên Bapt
Loại dữ liệu
W hile chỉ có tám loại dữ liệu [bảy kiểu nguyên thủy và đối tượng] trong JavaScript, typeof
sẽ thực sự trả về một trong chín tùy chọn.
undefined
object
[có nghĩa làtypeof
9]boolean
number
bigint
string
symbol
- ________số 8
object
[có nghĩa là bất kỳ đối tượng nào, kể cả mảng]
Chúng tương ứng với các loại dữ liệu JavaScript, ngoại trừ typeof
typeof
9 cũng là typeof
4 do một lỗi đã tồn tại từ lâu
Tiếp theo, tôi giải thích chi tiết khi mong đợi từng phản hồi từ typeof
Ảnh của Julia Margeth Theuer trên BaptKhông xác định
Một Giá trị undefined
trong JavaScript khá phổ biến — nó có nghĩa là một tên biến đã được đặt trước, nhưng chưa có giá trị nào được gán cho tham chiếu đó. Nó chưa được xác định, vì vậy chúng tôi gọi nó là không xác định.
Giá trị object
7 là một kiểu nguyên thủy trong JavaScript và các biến không được khai báo cũng được coi là không xác định
Tham chiếu các biến không được khai báo thường dẫn đến ReferenceError, ngoại trừ khi sử dụng từ khóa typeof
typeof
undefined
là chuỗi boolean
1 — và undefined
là một giá trị giả thường bằng với typeof
9 nhưng không bằng với các giá trị giả khác
Do đó, nếu typeof
nói một giá trị là boolean
1, thì có thể đặt cược an toàn khi cho rằng giá trị đó thực sự là undefined
— nghĩa là nó không được khai báo, đã khai báo nhưng chưa bao giờ được gán giá trị hoặc được khai báo và gán giá trị của undefined
Ảnh của Samuel Zeller trên UnsplashObject [có nghĩa là
typeof
9]F hoặc lý do lịch sử, boolean
9 trong JavaScript là typeof
4. Đây là một lỗi được cho là sẽ không bao giờ được sửa trong JavaScript.
Điều đó có nghĩa là việc kiểm tra null không thể được thực hiện bằng cách sử dụng typeof
Tuy nhiên, việc kiểm tra null khá dễ dàng bằng cách sử dụng toán tử đẳng thức nghiêm ngặt [number
2] để kiểm tra xem giá trị có thực sự là typeof
9 hay không, như trong number
4
Những điều hữu ích cần biết về null
- Giá trị
typeof
9 là sai [được đánh giá là sai trong điều kiện] - Các giá trị
typeof
9 vàundefined
chỉ bằng nhau một cách lỏng lẻo - Cả
typeof
9 vàundefined
đều không bằng các giá trị giả khác
Điều này có nghĩa là việc kiểm tra null bằng cách sử dụng toán tử đẳng thức lỏng lẻo [______50] sẽ thu được cả giá trị null và giá trị không xác định, điều này có thể hữu ích
Thông thường, giá trị undefined
có nghĩa giống như giá trị typeof
9 — không có giá trị, vì vậy nên sử dụng bigint
3 để kiểm tra null
Mặt khác, việc kiểm tra null có thể được thực hiện dễ dàng với toán tử đẳng thức nghiêm ngặt number
2
Hoặc người ta có thể kiểm tra bằng cách biết rằng vì đối tượng trống là trung thực [đánh giá thành Boolean bigint
5 trong điều kiện], nên typeof
9 là đối tượng giả duy nhất
Ảnh của Obi Onyeador trên BaptBoolean
C việc kiểm tra các giá trị Boolean thật dễ dàng — chúng sẽ là bigint
5 hoặc bigint
8, và giá trị typeof
a boolean
trả về string
1.
Lưu ý rằng JavaScript sẽ ép buộc bất kỳ giá trị nào thành bigint
5 hoặc bigint
8 bằng cách sử dụng hàm bao bọc Boolean[], hàm này đặt hai dấu chấm than [logic NOT — string
4] trước biểu thức. Hoặc nó sẽ đặt câu lệnh bên trong một câu điều kiện, chẳng hạn như câu lệnh if, toán tử dấu chấm hỏi string
5 hoặc vòng lặp
Các giá trị ước tính thành _________ 58 được gọi là giá trị sai và mọi thứ khác trong JavaScript ước tính thành ________ 55 [và đây là giá trị trung thực]
Các giá trị giả trong JavaScript là bigint
8, string
9, symbol
0, typeof
9, undefined
, symbol
3 và chuỗi rỗng symbol
4;
Ảnh của Andrik Langfield trên BaptNumber
C kiểm tra số trong JavaScript hoạt động như mong đợi, với typeof
trả về symbol
6.
Lưu ý rằng điều này có nghĩa là việc kiểm tra symbol
7 yêu cầu kiểm tra sự bình đẳng vì symbol
8 là giá trị duy nhất trong JavaScript không bằng chính nó
Ảnh của Kai Gradert trên BaptBigInt
“
symbol
9 là một đối tượng tích hợp sẵn cung cấp cách biểu diễn các số nguyên lớn hơn 253 - 1, đây là số lớn nhất mà JavaScript có thể biểu diễn một cách đáng tin cậy với nguyên hàmfunction
0.symbol
9 có thể được sử dụng cho các số nguyên lớn tùy ý. ” — Tài liệu web MDN
C kiểm tra loại nguyên thủy symbol
9 hoạt động như mong đợi; .
Lưu ý rằng symbol
9 chưa phải là một phần của ECMAScript, tiêu chuẩn JavaScript chính thức, mặc dù nó đã được hỗ trợ bởi Chrome [và do đó bởi Node. js], Firefox và Edge
“Có khả năng cao là
symbol
9 sẽ là một phần của ECMAScript 2019 hoặc 2020. ” - Blog của Ralph
Ảnh của Sagar Dani trên BaptString
Như người ta có thể hy vọng việc kiểm tra một chuỗi trong JavaScript khá đơn giản — typeof
hoạt động chính xác như mong đợi, trả về function
8.
Chắc chắn là tốt khi mọi thứ hoạt động như bình thường khi lập trình
Ảnh của Mr Cup / Fabien Barral trên BaptSymbol
T ký hiệu kiểu dữ liệu nguyên thủy là một mã định danh duy nhất, hữu ích để tạo khóa trên các đối tượng trong JavaScript.
“Một giá trị biểu tượng có thể được sử dụng làm định danh cho các thuộc tính đối tượng; . ” — Tài liệu web MDN
Như mọi người mong đợi, function
9 thực sự là typeof
00
Ảnh của Shahadat Shemul trên BaptFunction
F các lệnh được kiểm tra dễ dàng bằng cách sử dụng từ khóa typeof
, hoạt động hoàn toàn như mong đợi bằng cách trả về typeof
02.
Ảnh của Dane Deaner trên UnsplashObject [Đối tượng có nghĩa hoặc Mảng]
Vì miễn là giá trị được đề cập không phải là null, thì typeof
trả về typeof
4 có nghĩa là giá trị JavaScript là một đối tượng JavaScript.
Một loại đối tượng được tích hợp sẵn trong JavaScript là mảng và typeof
của một mảng là typeof
4. typeof
07
ECMAScript 5 đã giới thiệu một phương thức typeof
08 để kiểm tra một mảng, vì typeof
sẽ không thể phân biệt các mảng từ các đối tượng khác
Các nguyên mẫu JavaScript typeof
10 và typeof
11 là hai loại đối tượng tích hợp khác trong đó typeof
trả về “đối tượng. ” Do đó, ngày tháng và biểu thức chính quy cần có sự khác biệt hơn là chỉ sử dụng từ khóa typeof
Tôi trình bày cách kiểm tra loại đối tượng và mảng trong mã này
Câu lệnh JavaScript dài dòng typeof
14 có thể phân biệt giữa các đối tượng chung, mảng và các đối tượng khác, bởi vì nó trả về một chuỗi xác định loại đối tượng chi tiết hơn so với typeof
Tác giả Moon mô tả phương pháp đó chi tiết hơn trong Lập trình tốt hơn
[Đối tượng đối tượng] trong JavaScript là gì. Vật. nguyên mẫu. toString
Giải thích sâu hơn về [đối tượng Đối tượng]
Trung bình. com
Tương tự, phương thức trợ giúp typeof
08 hoặc từ khóa typeof
17 có thể được sử dụng để kiểm tra mảng hoặc bất kỳ loại đối tượng nào tương ứng
Ảnh của Amador Loureiro trên Bapt Hãy coi chừng “Gotcha. ”
T các trình bao bọc đối tượng cho Boolean, số và chuỗi sẽ ngắt typeof
và dẫn đến kết quả là typeof
4 thay vì string
1, symbol
6 hoặc function
8.
Tại sao các trình bao bọc đối tượng này tồn tại nếu chúng không được gọi một cách rõ ràng?
“JavaScript nhanh chóng ép buộc giữa nguyên thủy và đối tượng. ” — Rủi ro Kiro trong JavaScript được tinh chỉnh
Về cơ bản, việc gọi một thuộc tính chuỗi như typeof
23 dẫn đến việc JavaScript tạo một đối tượng bao bọc và diễn giải mã theo cách này
Vì điều đó xảy ra tự động, nên không cần tạo một đối tượng bao bọc rõ ràng, vì nó sẽ chỉ phá vỡ typeof
, như minh họa ở trên
Ảnh của Midas Hofstra trên BaptThêm một lý do nữa để không sử dụng các đối tượng bao bọc
S tương tự, các đối tượng trình bao thay đổi chức năng của các toán tử đẳng thức == và === trong JavaScript.
Và hành vi chỉ thực sự thay đổi khi từ khóa typeof
25 được sử dụng với lệnh gọi trình bao bọc đối tượng, như được hiển thị trong ví dụ sau
Nói chung, các trình bao bọc chuỗi, Boolean và số sẽ được gọi tự động và các nhà phát triển JavaScript không nên gọi
Ảnh của Marcus dePaula trên BaptChờ đợi, còn đối tượng máy chủ thì sao?
H ost phụ thuộc vào việc triển khai, nghĩa là chúng được cung cấp bởi môi trường thời gian chạy cục bộ.
Nói cách khác, các đối tượng máy chủ là các đối tượng đặc biệt ngoài các đối tượng tích hợp sẵn hoặc đối tượng gốc do JavaScript cung cấp
Ví dụ: đối tượng typeof
26 được cung cấp bởi nguồn cung cấp môi trường trình duyệt, trong khi một nút. môi trường js cung cấp các đối tượng máy chủ khác
Điều này có nghĩa là từ khóa typeof
cũng phụ thuộc vào việc triển khai, ít nhất là trong trường hợp đối tượng máy chủ lưu trữ
Điều đó đang được nói, các triển khai hiện đại có thể sẽ trả về “đối tượng” dưới dạng đối tượng máy chủ typeof
. Ví dụ
Ảnh của Hannes Wolf trên BaptCác loại tĩnh có phải là tương lai không?
Vì JavaScript là ngôn ngữ được nhập động nhưng
typeof
có những điểm kỳ quặc, nên một số nhà phát triển thích kiểm tra kiểu tự động hoặc tĩnh bằng cách sử dụng ngôn ngữ như TypeScript hoặc trình kiểm tra kiểu tĩnh như Flow
U sing TypeScript hoặc Flow chắc chắn có một số lợi thế và có thể ngăn ngừa lỗi, nhưng phải trả giá bằng việc học và triển khai một công cụ khác.
Mặc dù hữu ích nhưng việc sử dụng TypeScript hoặc Flow sẽ thêm một lớp phức tạp hoàn toàn mới vào chương trình JavaScript của bạn
Đối với vanilla JavaScript, thành thạo typeof
là tất cả những gì bạn thực sự cần để kiểm tra các loại dữ liệu như một nhà vô địch
Ảnh của Samuel Ramos trên Bapt
kết thúc
T từ khóa typeof
hữu ích cho việc kiểm tra loại trong JavaScript, nhưng nó có một số lưu ý liên quan đến các lỗi lịch sử.
Kiểm tra loại với typeof
đặc biệt hữu ích đối với hầu hết các loại nguyên thủy trong JavaScript, bao gồm undefined
, string
và number
Mặt khác, typeof
36, typeof
37 và typeof
38 là các đối tượng gốc không được phân biệt với nhau bởi typeof
— tất cả chúng đều trả về typeof
4 — cũng như typeof
9, một cách bất ngờ [trong một lỗi nổi tiếng]