2010-12-15 34 views
10

Trong javascript, nếu chúng ta có một số mã nhưCách gán lôgic javascript hoạt động như thế nào?

var a = "one"; 
var b = q || a; 
alert (b); 

Các toán tử logic OR sẽ gán một giá trị cho b, và cảnh báo sẽ là "một."

Điều này có hạn chế đối với các bài tập hay chúng tôi có thể sử dụng ở mọi nơi không?

Dường như một chuỗi trống được xử lý giống như không xác định. Thê nay đung không?

Tính năng này hoạt động với các biến AND như thế nào? Điều gì về sự kết hợp của họ?

Ví dụ hay về thời điểm sử dụng các thành ngữ này hoặc khi nào không?

+1

Xem [Javascript OR (||) biến giải thích bài tập ] (http://stackoverflow.com/questions/2100758/javascript-or-variable-assignment-explanation) và [Trong Javascript, điều đó có nghĩa là gì khi có một toán tử logic trong một khai báo biến? ] (http://stackoverflow.com/questions/3088098/in-javascript-what-does-it-mean-when-there-is-a-logical-operator-in-a-variable-d). –

+1

Không sử dụng. Đó là cấu trúc cú pháp ngu ngốc không trực quan và làm chậm nhiều người khi đọc mã. –

+5

@MK, không loại trừ một cấu trúc chung chỉ vì những người chưa biết (chưa biết JavaScript) không quen thuộc với nó. –

Trả lời

21

Đối q || a của bạn để đánh giá để a, q phải là một giá trị 'falsy'. Những gì bạn đã làm được gọi là "Đánh giá ngắn mạch".

Trả lời câu hỏi của bạn:

  1. Các toán tử logic (như và - &&, hoặc - ||) có thể được sử dụng trong các tình huống khác nữa. Nói chung trong các câu lệnh có điều kiện như if. More here

  2. Chuỗi rỗng không được coi là undefined. Cả hai đều là giá trị giả. Có một vài giá trị giả khác. More here

  3. AND hoặc && trong JavaScript, không phải là biến.Đây là một toán tử

  4. Thành ngữ bạn đã sử dụng là khá phổ biến.

    var x = val || 'default'; //is generally a replacement for

    var x = val ? val : 'default' //or

    if (val) var x = val; else var x = 'default';

6

Cách || công trình trong Javascript là:

  1. Nếu toán hạng trái đánh giá như true, trả lại toán hạng trái
  2. Nếu không, trả lại toán hạng phải

& & công trình tương tự.

Bạn có thể tận dụng điều này để kiểm tra sự tồn tại trong dòng, ví dụ:

var foo = (obj && obj.property) 

sẽ thiết lập foo-obj.property nếu obj được định nghĩa và "truthy".

+0

Rất được giải thích !! – eddy

+1

* "Nếu toán hạng bên trái đánh giá là true, trả về toán hạng bên trái" * Không, điều đó sai. * Truthy *, không phải là 'true'. –

1

Hành vi này được chia sẻ với các ngôn ngữ kịch bản khác như Perl. Toán tử OR hợp lý có thể được sử dụng như một thuật toán cú pháp để xác định các giá trị mặc định do thực tế toán hạng OR dừng đánh giá các toán hạng của nó khi nó gặp biểu thức đầu tiên đánh giá đúng: "đánh giá toán hạng đầu tiên và nếu giá trị được diễn giải không sai, chỉ định nó. Nếu không thì lặp lại cho toán hạng thứ hai. "

Tôi thấy tôi thường sử dụng hành vi này để chỉ định giá trị mặc định cho tham số chức năng. Ví dụ.

function myFunction(foo, bar) { 
    var fooValue = foo || "a"; 

    // no need to test fooValue -- it's guaranteed to be defined at this point 
} 
+0

Điều gì xảy ra nếu giá trị của foo là false (không phải là "false")? – JVM

+0

Điều đó sẽ dẫn đến fooValue == "a". Trong một bối cảnh boolean false, null, undefined, 0, NaN và chuỗi rỗng tất cả được đánh giá là sai - hãy xem https://developer.mozilla.org/en-US/docs/Glossary/Falsy để biết chi tiết –

+0

Đúng. Sau đó, điều này có thể thất bại tại nơi mà một trong những thực sự cần sai như là một giá trị. – JVM

1

Tôi không khá chắc chắn tôi làm theo câu hỏi của bạn. Bạn có thể sử dụng một biểu thức ở bất cứ nơi nào bạn có thể sử dụng một biểu thức, và toán tử logic trên hai biểu thức kết quả trong một biểu thức.

alert(q||a); 
alert(true||false); 

var x=5; 
var y=0; 
if (y!=0 && x/y>2) { /*do something*/ } 

Bit cuối cùng hữu ích. Giống như hầu hết các ngôn ngữ, các AND và ORs ngắn mạch của Javascript. Nếu phần đầu tiên của AND là false, nó không đánh giá bit thứ hai - tiết kiệm cho bạn một phân chia-by-0. Nếu phần đầu tiên của OR là true, nó không đánh giá phần thứ hai.

Nhưng bạn có thể sử dụng toán tử boolean ở bất kỳ đâu bạn có thể sử dụng biểu thức.

1

Javascript đánh giá logic bằng truethness/false. Các giá trị như (false, "", null, undefined, 0, -0) được đánh giá là logic sai.

Kết hợp điều này với đánh giá lười biếng, các hoạt động 'OR' hiện được đánh giá từ left to rightdừng lại khi đã tìm thấy true. Vì trong ví dụ của bạn, sự thật không phải là một boolean, giá trị được trả về.

Trong trường hợp này:

x = 0; y = 5; alert(y || x)/*returns 5*/; alert(x || y)/*also returns 5*/; 

này cũng có thể là các đối tượng khác.

functionThatReturnsTrue() || functionThatDoesSomething(); 
0

IMHO - không sử dụng để gán kiểu boolean. Nó có thể gây nhầm lẫn. Như undefined! == false, tức là sai chính nó là một giá trị.

Ví dụ: Nếu u muốn sao chép một giá trị trường từ một đối tượng nếu và chỉ nếu trường được định nghĩa

var bar.value = false; 
var foo = true; 

var foo = bar.value || foo; // ==> should be false as bar.value is defined 

Đối với phân loại boolean, u thực sự cần sử dụng

var foo = (bar.value !== undefined) ? bar.value : foo; 
Các vấn đề liên quan