2015-12-07 23 views
6
[].every(i => i instanceof Node) // -> true 

Tại sao mọi phương thức trên mảng trong JavaScript trả lại đúng khi mảng trống. Tôi đang cố gắng thực hiện xác nhận kiểu như vậy ...Tại sao Array.prototype.every trả về true trên một mảng trống?

let isT = (val, str) => typeof val === str, is = {}, 
nT = (val, str) => !isT(val, str); 

is.Undef = (...args) => args.every(o => isT(o, 'undefined')); 
is.Def = (...args) => args.every(o => nT(o, 'undefined')); 
is.Null = (...args) => args.every(o => o === null); 
is.Node = (...args) => args.every(o => o instanceof Node); 
is.NodeList = (...args) => Array.from(args).every(n => is.Node(n)); 

nhưng những điều này vẫn trở lại đúng ngay cả khi không có đối số nào được chuyển cho họ.

+1

không biết câu trả lời nhưng bạn có thể sử dụng 'is.Undef = (... args) => args.length && args.every (o => isT (o, 'undefined')) ; ' – synthet1c

Trả lời

5

Xem the docs

mỗi hành vi như "cho tất cả" lượng hóa trong toán học. Trong cụ thể, đối với một mảng trống, nó trả về true. (Đó là vacuously đúng rằng tất cả các yếu tố của tập rỗng đáp ứng bất kỳ điều kiện nhất định.)

Là một chỉnh sửa, bởi vì tôi nhìn Vacuous truth lên. Tôi hiểu nó từ ngữ cảnh, nhưng tôi đã quan tâm đến định nghĩa chính thức. quote diễn giải này tiêu biểu cho ý nghĩa:

"You are cháu yêu thích của tôi" là một tuyên bố ngớ ngẩn nếu ông là chỉ cháu trai: không có những người khác để xem xét.

+1

Đó là một ví dụ gây hiểu nhầm vì yêu thích ở đây có nghĩa là "đầu tiên trong số 1." Trống rỗng có xu hướng ngụ ý "tất cả trong số 0." Nếu bạn nói nó một cách chi tiết hơn, "Tôi thích bạn hơn tất cả các cháu bên cạnh bạn," nó trống rỗng vì không có cháu trai nào ngoài "bạn". – djechlin

+1

"Tôi thích mọi newphew bên cạnh bạn ít hơn." – Draco18s

+0

Vâng, điều đó rõ ràng. Lưu ý nó cũng đúng là "Tôi thích mọi cháu trai bên cạnh bạn nhiều hơn nữa." Nó chỉ ra rằng "bạn là cả cháu trai yêu thích và ít được yêu thích nhất của tôi", điều này hơi lạ. – djechlin

3

Về mặt toán học có giá trị hơn để nói "mọi" là - không cần thiết - đúng nếu không có phần tử nào.

Bạn cần nó để mối quan hệ "cho tất cả x, P" giống như "KHÔNG (có tồn tại x sao cho không phải P)".

Đó là một vấn đề về quy ước nhưng nó "làm cho toán học hoạt động độc đáo" khá thường xuyên.

2

MDN Array every()

mỗi hành vi như "cho tất cả" lượng hóa trong toán học. Đặc biệt, đối với một mảng trống, nó trả về true. (Đó là vacuously thật rằng tất cả các yếu tố của tập rỗng đáp ứng bất kỳ điều kiện nhất định.)

2

Từ đặc tả ECMAScript của Array.prototype.every (tôi nhấn mạnh đậm):

every cuộc gọi callbackfn một lần cho mỗi phần tử có trong mảng, theo thứ tự tăng dần, cho đến khi tìm thấy một trong đó callbackfn trả về false. Nếu tìm thấy một phần tử như vậy, mọi phần tử ngay lập tức trả về false. Nếu không, nếu callbackfn trả lại true cho tất cả các thành phần, every sẽ trả lại true.

[...] every hoạt động như định lượng "cho tất cả" trong toán học. Cụ thể, đối với một mảng trống, nó trả về true.

Xét cụm từ táo bạo đầu tiên ở trên: từ every thấy không có các yếu tố mà sự trở lại callback false (vì gọi lại không bao giờ thậm chí chạy, bởi vì không có yếu tố), nó sẽ trả true, như xác nhận bởi các cụm từ in đậm thứ hai .

Các vấn đề liên quan