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 (kết hợp) 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 thức hasOwnProperty
Như mọi người đã đề cập ở đây, bạn có thể có một đối tượng có thuộc tính đượ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 toán tử để biết 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à "các phương thức" sử dụng cơ chế Mô tả thuộc tính trong Javascript (tương tự như phản chiếu Java trong ngôn ngữ Java).
http: //www.ecma-i Intl.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 đó tên của mỗi trường là một tên thuộc tính và giá trị của nó là một 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 hoặc khóa đối tượng sẽ sử dụng cơ chế Javascript [[Get]]. Đó là cách xa nhanh hơn!
điểm chuẩn
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
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à
16,021,758 ±0.45% ops/sec 91% slower
Truy cập các yếu tố trực tiếp (kiểu ngoặc)
var result = array["Impression"] === undefined
Kết quả là
168,270,439 ±0.13 ops/sec 0.02% slower
Truy cập các yếu tố trực tiếp (kiểu đối tượng)
var result = array.Impression === undefined;
Kết quả là
168,303,172 ±0.20% fastest
EDIT: lý do để gán cho một tài sản undefined
giá trị là gì?
Câu hỏi đó đánh đố 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: null
và undefined
.
null
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 ngắn hạn, sự thiếu giá trị được xác nhận . Mặt khác, undefined
là 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ị phù hợp, hãy xem xét sử dụng null
tham chiếu thay undefined
vì vì trong thời điểm ban đầu, thuộc tính được xác nhận là thiếu giá trị.
Đối chiếu:
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[].
khuyên nhủ
Tránh các đối tượng có undefined
giá trị. Kiểm tra trực tiếp bất cứ khi nào có thể và sử dụng null
để khởi tạo giá trị tài sản. Nếu không, sử dụng in
toán tử hoặc hasOwnProperty()
phương thức chậm .
EDIT: 12/04/2018 - KHÔNG LIÊN QUAN ĐẾN BẤT CỨ NƠI NÀO
Như mọi người đã nhận xét, các phiên bản hiện đại của công cụ Javascript (ngoại trừ firefox) đã thay đổi cách tiếp cận đối với các thuộc tính truy cập. Việc triển khai hiện tại chậm hơn so với trước đó đối với trường hợp cụ thể này nhưng sự khác biệt giữa khóa truy cập và đối tượng là không thể bỏ qua.