2011-12-19 56 views
16

JavaScript là ngôn ngữ không được nhập đúng như Java chẳng hạn.Chuyển đổi loại JavaScript: (true && 1) vs (true | | 1)

Như chúng ta đã biết, nó chuyển đổi giá trị của kết quả lệ thuộc vào bối cảnh:

"2" + "3" quả "23"

"2" * "3" kết quả 6

này là khá rõ ràng và bật đèn xanh cho sự hiểu biết.

Tôi chỉ cố gắng ngữ dưới đây và đã nhầm lẫn:

true && 1 kết quả 1
true || 1 kết quả true

Tại sao là người đầu tiên mang đến cho Số lượng và thứ hai mang đến cho boolean?

Xem xét các quy tắc chuyển đổi JavaScript, tôi mong đợi nhận được boolean giá trị trong cả hai trường hợp, do boolean ngữ cảnh biểu thức.

Trả lời

8

Kiểm tra Douglas Crockford's site, nó nói:

Nhà điều hành & & thường được gọi là logic và. Nó cũng có thể được gọi là bảo vệ . Nếu toán hạng đầu tiên là false, null, undefined, "" (chuỗi rỗng ), hoặc số 0 thì nó trả về toán hạng đầu tiên. Nếu không, nó sẽ trả về toán hạng thứ hai. Điều này cung cấp một cách thuận tiện để viết một null-kiểm tra:

var value = p && p.name; /* The name value will only be retrieved from 
p if p has a value, avoiding an error. */ 

Các || toán tử thường là được gọi là logic hoặc. Nó cũng có thể được gọi là mặc định. Nếu toán hạng đầu tiên là false, null, undefined, "" (chuỗi rỗng) hoặc số 0, thì nó sẽ trả về toán hạng thứ hai. Nếu không, nó sẽ trả về toán hạng đầu tiên. Điều này cung cấp một cách thuận tiện để xác định giá trị mặc định:

value = v || 10; /* Use the value of v, but if v doesn't have a value, 
use 10 instead. */ 
+0

cảm ơn bạn đã giải thích - đó là điểm thú vị về bảo vệ và mặc định – sergionni

+0

Bạn được chào đón. Tất cả trong tất cả, tôi sẽ khuyên bạn nên đọc trang Douglas trên JavaScript thay vì các đặc điểm kỹ thuật. Nó dễ hiểu hơn nhiều trong quan điểm của tôi. http://javascript.crockford.com/ –

+0

Giải thích tuyệt vời! Tôi ước tôi có thể cung cấp cho bạn +3. –

9

Để quote MDC;

&&; Trả về expr1 nếu nó có thể được chuyển thành false; nếu không, trả về expr2. Do đó, khi được sử dụng với các giá trị Boolean, && trả về true nếu cả hai toán hạng là đúng; nếu không, trả về false.
||; Trả về expr1 nếu nó có thể được chuyển thành true; nếu không, trả về expr2. Do đó, khi được sử dụng với các giá trị Boolean, || trả về true nếu toán hạng là đúng; nếu cả hai đều sai, trả về false.

Vì vậy, trong ví dụ đầu tiên, 1 đang được trả lại vì không thể chuyển đổi thành expr1 thành sai.

Trong ví dụ thứ hai, true có thể được chuyển đổi thành true, vì vậy nó được trả lại.

+0

cảm ơn rất nhiều, thực sự bạn nhắc nhở tôi, rằng nguồn Mozilla là rất có giá trị như tài liệu hướng dẫn JavaScript – sergionni

0

Bạn có thể làm những việc khác nữa như:

var myVar = Math.random() > 0.5; 

myVar && doFunc(); 

mà là giống như

if(myVar) { 
    doFunc(); 
} 

Các || về cơ bản có nghĩa là "Nếu điều đầu tiên là sai sự thật, đi đến thứ hai"

&& về cơ bản có nghĩa là "Nếu điều đầu tiên là đúng, hãy chuyển đến phần thứ hai"

Đây là lý do tại sao bạn thấy những điều như thế này ở phía trên cùng của các chức năng:

function myFunction(options) { 
    options = options || {}; 
} 

Có nghĩa là: Nếu tùy chọn là falsey, làm cho nó {}

9

này không có gì để làm với loại chuyển đổi.

|| trả về toán hạng thực đầu tiên. 1 || true sẽ cung cấp cho bạn 1

&& trả về toán hạng giả đầu tiên hoặc toán hạng thứ hai nếu cả hai đều đúng.

Xem trang 58 của ECMAScript specification

+0

cảm ơn bạn, không bao giờ được biết về cách tiếp cận "đầu cuối" – sergionni

0

Bạn đang gây nhầm lẫn khi truyền (các toán tử */+ sẽ thực hiện việc này) với đánh giá lôgic (trong đó & &, ||).

+0

thể Không nhận được câu trả lời của bạn – sergionni

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