2010-04-06 32 views
5

tôi chạy qua đoạn mã này (sửa đổi) trong ứng dụng của chúng tôi, và tôi bối rối đến thế nào nó hoạt động:ANDing javascript đối tượng cùng

function someObject() 
    { 
     this.someProperty = {}; 
     this.foo = 
     { 
      bar: 
      { 
       baz: function() { return "Huh?" } 
      } 
     }; 

     this.getValue = function() 
     { 
      return (this.someProperty && this.foo.bar && this.foo.bar.baz && this.foo.bar.baz()) || null; 
     } 
    } 

    function test() 
    { 
     var o = new someObject(); 
     var val = o.getValue(); 
     alert(val); 
    } 

khi bạn gọi thử nghiệm) function (, văn bản "Huh? " được cảnh báo. Tôi không chắc chắn như thế nào là kết quả của getValue đang trở lại đó, tôi sẽ đã nghĩ làm Một & & B & & C & & D sẽ trở thành sự thật, chứ không phải là giá trị của D.

+0

Sửa mẫu ở trên. :) – Jonas

Trả lời

10

Đó xảy ra vì Boolean Operators trong JavaScript có thể trở lại một toán hạng, và không nhất thiết là một Boolean kết quả, ví dụ:

các logic AND (&&), sẽ trả về giá trị của toán hạng thứ hai nếu là người đầu tiên là truthy:

0.123.
true && "foo"; // "foo" 

Và nó sẽ trả về giá trị của toán hạng đầu tiên nếu nó là tự falsy:

NaN && "anything"; // NaN 
0 && "anything"; // 0 

Đó là lý do tại sao trong ví dụ của bạn "Huh?" được trả lại, bởi vì tất cả những biểu hiện trước là truthy:

alert("A" && "B" && "C" && "Huh?"); // "Huh?" 
alert(true && true && true && "Huh?"); // "Huh?" 

Các operat logic OR hoặc (||) có hành vi tương tự, nó sẽ trả về giá trị của toán hạng thứ hai, nếu một trong những đầu tiên là falsy:

false || "bar"; // "bar" 

Và nó sẽ trả về giá trị của toán hạng đầu tiên nếu nó là bởi bản thân phi falsy:

"foo" || "anything"; // "foo" 

hành vi này thường được dùng để thiết lập giá trị mặc định , ví dụ:

function test (arg1) { 
    arg1 = arg1 || "default value"; 
} 

Lưu ý: giá trị Falsy là những ép buộc để false khi được sử dụng trong một bối cảnh boolean, và họ là: null, undefined, NaN, 0, zero-dài chuỗi, và tất nhiên false. Mọi thứ khác sẽ ép buộc vào true.

+0

điều này có thể khắc phục sự cố của anh ấy: !! (this.someProperty && this.foo.bar && this.foo.bar.baz && this.foo.bar.baz()) lưu ý "!!" –

+1

Trên một lưu ý liên quan, sự tồn tại của câu hỏi này ở đây là bằng chứng cho thấy việc sử dụng các phím tắt cú pháp logic này cho nên được coi là xấu ... "Nói những gì bạn muốn nói", March Hare nói. – dkamins

+1

Tóm tắt tuyệt vời của javascripts thường bị hiểu lầm các nhà khai thác! –

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