Câu trả lời nhanh
Làm cách nào để kiểm tra xem một khóa cụ thể có tồn tại trong một đối tượng hoặc mảng JavaScript không? Nếu một khóa không tồn tại và tôi cố gắng truy cập nó, nó sẽ trả về sai? Hoặc ném một lỗi?
Truy cập trực tiếp một thuộc tính bị thiếu bằng cách sử dụng kiểu mảng hoặc kiểu đối tượng sẽ trả về một hằng số không xác định.
Chậm và đáng tin cậy trong toán tử và phương pháp HasownProperty
Như mọi người đã đề cập ở đây, bạn có thể có một đối tượng với một tài sản được liên kết với hằng số "không xác định".
var bizzareObj = {valid_key: undefined};
Trong trường hợp đó, bạn sẽ phải sử dụng HasownProperty hoặc trong nhà điều hành để biết chìa khóa có thực sự ở đó không. Nhưng, nhưng với giá nào?
Vì vậy, tôi nói với bạn ...
Trong toán tử và HasownProperty là "phương pháp" sử dụng cơ chế mô tả thuộc tính trong JavaScript [tương tự như phản xạ Java trong ngôn ngữ Java].
//www.ecma-international.org/ecma-262/5.1/#sec-8.10
Loại mô tả thuộc tính được sử dụng để giải thích thao tác và thống nhất các thuộc tính thuộc tính được đặt tên. Các giá trị của loại mô tả thuộc tính là các bản ghi bao gồm các trường được đặt tên trong đó mỗi tên trường tên là một tên thuộc tính và giá trị của nó là giá trị thuộc tính tương ứng như được chỉ định trong 8.6.1. Ngoài ra, bất kỳ lĩnh vực có thể có mặt hoặc vắng mặt.
Mặt khác, gọi một phương thức đối tượng hoặc khóa sẽ sử dụng cơ chế JavaScript [[get]]. Đó là một cách xa hơn nhanh hơn!
Điểm chuẩn
//jsben.ch/HaHQt
Sử dụng trong toán tử
var result = "Impression" in array;
Kết quả là
12,931,832 ±0.21% ops/sec 92% slower
Sử dụng Hasownproperty
var result = array.hasOwnProperty["Impression"]
Kết quả là
Sử dụng Hasownproperty 16,021,758 ±0.45% ops/sec 91% slower
16,021,758 ±0.45% ops/sec 91% slower
var result = array["Impression"] === undefined
Kết quả là
168,270,439 ±0.13 ops/sec 0.02% slower
Sử dụng Hasownproperty
var result = array.Impression === undefined;
Kết quả là
168,303,172 ±0.20% fastest
Sử dụng Hasownproperty
16,021,758 ±0.45% ops/sec 91% slower
Truy cập các yếu tố trực tiếp [phong cách dấu ngoặc]confirmed lack of value. On the other hand,
12,931,832 ±0.21% ops/sec 92% slower
2 is an unknown value [not defined]. If there is a property that will be used later with a proper value consider use 12,931,832 ±0.21% ops/sec 92% slower
3 reference instead of 12,931,832 ±0.21% ops/sec 92% slower
2 because in the initial moment the property is confirmed to lack value.Compare:
var a = {1: null};
console.log[a[1] === undefined]; // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.: the value is defined.
console.log[a[0] === undefined]; // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].
Truy cập các yếu tố trực tiếp [kiểu đối tượng]
Chỉnh sửa: Lý do gán cho thuộc tính giá trị
12,931,832 ±0.21% ops/sec 92% slower
2 là gì?Câu hỏi đó đặt câu hỏi cho tôi. Trong JavaScript, có ít nhất hai tài liệu tham khảo cho các đối tượng vắng mặt để tránh các vấn đề như thế này: 12,931,832 ±0.21% ops/sec 92% slower
3 và 12,931,832 ±0.21% ops/sec 92% slower
2.
12,931,832 ±0.21% ops/sec 92% slower
12,931,832 ±0.21% ops/sec 92% slower
12,931,832 ±0.21% ops/sec 92% slower
3 là giá trị nguyên thủy đại diện cho sự vắng mặt có chủ ý của bất kỳ giá trị đối tượng nào, hoặc trong thời gian ngắn, sự thiếu giá trị được xác nhận. Mặt khác, 12,931,832 ±0.21% ops/sec 92% slower
2 là một giá trị không xác định [không được xác định]. Nếu có một thuộc tính sẽ được sử dụng sau này với giá trị thích hợp, hãy xem xét việc sử dụng tham chiếu ____23 thay vì 12,931,832 ±0.21% ops/sec 92% slower
2 vì trong thời điểm ban đầu, tài sản được xác nhận là thiếu giá trị. Các đối tượng trong JavaScript là các loại dữ liệu không nguyên thủy chứa một bộ sưu tập các cặp giá trị khóa không có thứ tự.
Như bạn có thể thấy trong hình trên, khóa là thuộc tính và mỗi giá trị đối tượng phải có khóa.
Khi tương tác với các đối tượng, các tình huống có thể phát sinh yêu cầu bạn kiểm tra xem một khóa cụ thể có tồn tại không. Điều quan trọng cần lưu ý là nếu bạn biết một khóa tồn tại tự động có nghĩa là một giá trị tồn tại. Giá trị này có thể là bất cứ điều gì - thậm chí trống rỗng, null hoặc không xác định.
Trong bài viết này, chúng tôi sẽ tìm hiểu các phương pháp khác nhau để kiểm tra xem khóa của một đối tượng có tồn tại trong JavaScript hay không.
Trong trường hợp bạn đang vội, đây là hai phương pháp tiêu chuẩn chúng ta có thể sử dụng để kiểm tra:
var result = "Impression" in array;
0Bạn có thể sử dụng toán tử JavaScript
var result = array.hasOwnProperty["Impression"]
1 để kiểm tra xem thuộc tính/khóa được chỉ định có tồn tại trong một đối tượng không. Nó có cú pháp đơn giản và trả về var result = array.hasOwnProperty["Impression"]
4 nếu thuộc tính/khóa được chỉ định tồn tại trong đối tượng được chỉ định hoặc chuỗi nguyên mẫu của nó.Cú pháp khi sử dụng toán tử
var result = array.hasOwnProperty["Impression"]
1 là:var result = "Impression" in array;
1Giả sử chúng ta có một đối tượng chứa chi tiết của người dùng:
var result = "Impression" in array;
2Chúng ta có thể kiểm tra xem một khóa có tồn tại với toán tử
var result = array.hasOwnProperty["Impression"]
1 như được thấy dưới đây không:var result = "Impression" in array;
3Lưu ý: Giá trị trước từ khóa
var result = array.hasOwnProperty["Impression"]
1 phải thuộc loại var result = array.hasOwnProperty["Impression"]
8 hoặc var result = array.hasOwnProperty["Impression"]
9.Cách kiểm tra xem một đối tượng có 16,021,758 ±0.45% ops/sec 91% slower
0 trong JavaScript với phương pháp var result = array.hasOwnProperty["Impression"]
2 không
16,021,758 ±0.45% ops/sec 91% slower
var result = array.hasOwnProperty["Impression"]
Bạn có thể sử dụng phương thức JavaScript
var result = array.hasOwnProperty["Impression"]
2 để kiểm tra xem một đối tượng được chỉ định có thuộc tính đã cho làm thuộc tính của nó không. TPhương pháp của anh ấy khá giống với toán tử
var result = array.hasOwnProperty["Impression"]
1. Phải mất một var result = array.hasOwnProperty["Impression"]
8 và sẽ trả lại var result = array.hasOwnProperty["Impression"]
4 nếu 16,021,758 ±0.45% ops/sec 91% slower
0 tồn tại trong đối tượng và 16,021,758 ±0.45% ops/sec 91% slower
7 nếu không.Cú pháp khi sử dụng phương thức
var result = array.hasOwnProperty["Impression"]
2 là:var result = "Impression" in array;
4Giả sử chúng ta có một đối tượng chứa chi tiết của người dùng:
var result = "Impression" in array;
2Chúng ta có thể kiểm tra xem một khóa có tồn tại với toán tử
var result = array.hasOwnProperty["Impression"]
1 như được thấy dưới đây không:var result = "Impression" in array;
6Lưu ý: Giá trị trước từ khóa
var result = array.hasOwnProperty["Impression"]
1 phải thuộc loại var result = array.hasOwnProperty["Impression"]
8 hoặc var result = array.hasOwnProperty["Impression"]
9.Cách kiểm tra xem một đối tượng có
16,021,758 ±0.45% ops/sec 91% slower
0 trong JavaScript với phương pháp var result = array.hasOwnProperty["Impression"]
2 khôngvar result = "Impression" in array;
7Bạn có thể sử dụng phương thức JavaScript var result = array.hasOwnProperty["Impression"]
2 để kiểm tra xem một đối tượng được chỉ định có thuộc tính đã cho làm thuộc tính của nó không. T
var result = array.hasOwnProperty["Impression"]
Phương pháp của anh ấy khá giống với toán tử
var result = array.hasOwnProperty["Impression"]
1. Phải mất một var result = array.hasOwnProperty["Impression"]
8 và sẽ trả lại var result = array.hasOwnProperty["Impression"]
4 nếu 16,021,758 ±0.45% ops/sec 91% slower
0 tồn tại trong đối tượng và 16,021,758 ±0.45% ops/sec 91% slower
7 nếu không.Cú pháp khi sử dụng phương thức
var result = array.hasOwnProperty["Impression"]
2 là:Lưu ý: Giá trị bạn chuyển vào phương thức
var result = array.hasOwnProperty["Impression"]
2 phải thuộc loại var result = array.hasOwnProperty["Impression"]
8 hoặc var result = array.hasOwnProperty["Impression"]
9.var result = "Impression" in array;
8Vì bây giờ chúng ta biết rằng các phương pháp này tồn tại, giờ đây chúng ta có thể sử dụng một điều kiện để kiểm tra và thực hiện bất kỳ hoạt động nào chúng ta muốn thực hiện:
var result = "Impression" in array;
9Gói lên
12,931,832 ±0.21% ops/sec 92% slower
0Trong bài viết này, chúng tôi đã học được cách kiểm tra xem một đối tượng có khóa bằng hai phương pháp tiêu chuẩn không. Sự khác biệt giữa hai phương thức là
var result = array["Impression"] === undefined
3 tìm kiếm một khóa trong một đối tượng trong khi toán tử var result = array.hasOwnProperty["Impression"]
1 tìm khóa trong đối tượng và chuỗi nguyên mẫu của nó.12,931,832 ±0.21% ops/sec 92% slower
1Có những phương pháp khác bạn có thể sử dụng, nhưng đến một lúc nào đó chúng có thể trở nên quá phức tạp và không dễ hiểu. Họ cũng có thể thất bại khi được thử nghiệm chống lại một số điều kiện nhất định.
Ví dụ: chúng ta có thể sử dụng chuỗi tùy chọn, vì vậy nếu một khóa được chỉ định không tồn tại, nó sẽ trả về
12,931,832 ±0.21% ops/sec 92% slower
2:Vì vậy, chúng tôi có thể tạo ra một điều kiện mà khi nó không bằng
12,931,832 ±0.21% ops/sec 92% slower
2, điều đó có nghĩa là chính tồn tại: