2013-06-19 28 views
17

Khi tôi sử dụng opertor logic & & giữa hai chuỗi, tại sao nó cho tôi chuỗi thứ hai là đầu ra:hành logic && và hai chuỗi trong javascript

var c = "Cat" && "Dog"; 

Tôi nhận ra rằng với ngoại lệ của 0 , false, null, undefined, "" - mọi thứ khác được đánh giá là một sự thật boolean trong một biểu thức logic giống như ở trên. Nhưng tại sao chuỗi đầu ra thứ hai và không phải là chuỗi đầu tiên? Và tại sao ouput không chỉ "đúng" vì nó đang được đánh giá như là một biểu thức boolean.

Cảm ơn

+1

Vì đó là cách JS hoạt động và tính chân thực vượt ra ngoài các phép toán khi bạn chỉ ra. –

+0

Xem câu trả lời ngắn gọn này: [Theo các thuật ngữ đơn giản nhất] (http://stackoverflow.com/a/32158899) – Dewey

+0

Xem câu trả lời này [Theo các thuật ngữ đơn giản nhất] (http://stackoverflow.com/a/32158899) – Dewey

Trả lời

17

trong biểu thức

"Cat" && "Dog" 
// => "Dog" 

Bởi vì bạn đang sử dụng &&, JavaScript được hứa hẹn với bạn rằng nó sẽ xác minh rằng cả hai bên của biểu thức là true. Trong trường hợp này, "Dog" là thứ được đánh giá cuối cùng.

Để rõ ràng hơn, bạn có thể làm một cái gì đó giống như

var c = "Cat" != null && "Dog" != null 

Đó là dài dòng hơn một chút, nhưng điều này nắm để

var c = true && true 
// => true 

Nếu bạn muốn có một phím tắt đơn giản cho boolean

var c = !!("Cat" && "Dog") 
// => true 

Nếu bạn chỉ sử dụng bảng điều khiển REPL hoặc JavaScript đơn giản, bạn có thể xem thi S đầu ra rất dễ dàng.


mỗi một trong những ý kiến ​​dưới đây

Sử dụng ||, JavaScript được hứa hẹn với bạn rằng ít nhất một của hai bên là true. Vì "Cat" là true, nó dừng lại ở đó và trả về "Cat". Điều này được gọi là Short-circuit evaluation

+0

" Chó "là điều được đánh giá cuối cùng? Còn về "Mèo" || "Dog" (=> "Mèo") sau đó? –

+1

@su, tôi đã thêm một phần vào câu trả lời của tôi để giải quyết câu hỏi của bạn :) – naomik

+0

Bạn nói đúng. Cảm ơn. –

8

Tôi nghĩ điều này là do tính chất của toán tử logic & &. Javascript thực hiện biểu thức "cat" && "Dog" theo cách sau:

Kiểm tra giá trị "con mèo" - trả về giá trị khác "", 0, null, không xác định hoặc sai và trung thực. Javascript thấy && và vì vậy nó tiếp tục biểu hiện và khuôn mặt chuỗi "Dog", là một cái gì đó khác hơn "", 0, null, undefined hoặc false và là sự thật, biểu thức kết thúc và biểu thức trả về giá trị cuối cùng nó đã kiểm tra.

Nếu bạn thay thế && với || biểu thức kết thúc vào giá trị truthy đầu tiên và thats cách

var boolean = "cat" || "dog" 

lợi nhuận giá trị đầu tiên: cat

+1

+1 Vâng, nó thực sự đi xuống đến các nhà khai thác logic 101, phải không? :) Nice viết lên. – naomik

6

trả lời bởi @naomik khá nhiều bao gồm nó. Nếu bạn muốn đi sâu, tôi khuyên bạn nên xem đặc tả ECMAScript, phần 11.11:

http://www.ecma-international.org/ecma-262/5.1/#sec-11.11

Trong "Semantics", chúng tôi có thể thấy:

Việc sản xuất LogicalANDExpression: LogicalANDExpression & & BitwiseORExpression được đánh giá như sau:

  1. Hãy để lref là kết quả của việc đánh giá LogicalANDExpression.
  2. Hãy để lval là GetValue (lref).
  3. Nếu ToBoolean (lval) là sai, trả lại lval.
  4. Cho phép rref là kết quả của việc đánh giá BitwiseORExpression.
  5. Trả lại GetValue (rref).
+0

Câu hỏi này là 3 tuổi, tại sao lại đăng câu trả lời khác? – Scott

+3

Bởi vì tôi chỉ tìm thấy nó, và nghĩ rằng tôi đã có thêm một chút kiến ​​thức để chia sẻ mà không được chia sẻ trước đó;) Tôi không nghĩ rằng câu hỏi có "ngày hết hạn" trên SO :) –

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