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,
var result = "Impression" in array;
2 is an unknown value [not defined]. If there is a property that will be used later with a proper value consider use var result = "Impression" in array;
3 reference instead of var result = "Impression" in array;
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ị
var result = "Impression" in array;
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: var result = "Impression" in array;
3 và var result = "Impression" in array;
2.
var result = "Impression" in array;
var result = "Impression" in array;
var result = "Impression" in array;
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, var result = "Impression" in array;
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 var result = "Impression" in array;
3 thay vì var result = "Impression" in array;
2 vì trong thời điểm ban đầu, tài sản được xác nhận là thiếu giá trị. Đưa ra một đối tượng JavaScript, bạn có thể kiểm tra xem khóa thuộc tính có tồn tại bên trong các thuộc tính của nó bằng toán tử
12,931,832 ±0.21% ops/sec 92% slower
1 không.Giả sử bạn có đối tượng
12,931,832 ±0.21% ops/sec 92% slower
4:var result = "Impression" in array;
0Chúng ta có thể kiểm tra xem thuộc tính
12,931,832 ±0.21% ops/sec 92% slower
5 có tồn tại bằng cách sử dụng câu lệnh này không, kết quả là 12,931,832 ±0.21% ops/sec 92% slower
6:Chúng ta có thể sử dụng điều này trong một điều kiện:
Một cách khác là sử dụng phương thức
12,931,832 ±0.21% ops/sec 92% slower
2 của đối tượng:var result = "Impression" in array;
1Khi kế thừa là một phần quan trọng trong cấu trúc ứng dụng của bạn, sự khác biệt là
12,931,832 ±0.21% ops/sec 92% slower
1 sẽ dẫn đến 12,931,832 ±0.21% ops/sec 92% slower
6 ngay cả đối với các thuộc tính được thừa hưởng bởi các đối tượng cha.12,931,832 ±0.21% ops/sec 92% slower
2 không có.Nó sẽ chỉ trả về 12,931,832 ±0.21% ops/sec 92% slower
6 nếu đối tượng có thuộc tính đó trực tiếp - không phải là một trong những tổ tiên của nó.Tôi sử dụng cơ chế dự phòng khi tôi muốn một thuộc tính và dự phòng với giá trị mặc định nếu điều đó không tồn tại:
Nếu khóa thuộc tính
var result = array.hasOwnProperty["Impression"]
2 không tồn tại trên đối tượng, câu lệnh này sẽ dẫn đến chuỗi var result = array.hasOwnProperty["Impression"]
3.