Toán tử bậc ba viết tắt trong Javascript


102

Tôi biết rằng trong php 5.3 thay vì sử dụng cú pháp toán tử bậc ba dư thừa này:

startingNum = startingNum ? startingNum : 1

... chúng ta có thể sử dụng cú pháp viết tắt cho các toán tử bậc ba của mình nếu có:

startingNum = startingNum ?: 1

Và tôi biết về toán tử bậc ba trong javascript:

startingNum = startingNum ? startingNum : 1

... nhưng có cách viết tắt?

Câu trả lời:


175
var startingNumber = startingNumber || 1;

Một cái gì đó tương tự như những gì bạn đang tìm kiếm, nơi nó mặc định nếu không được xác định?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2

Nhân tiện, điều này hoạt động cho nhiều trường hợp, bao gồm các đối tượng:

var foo = bar || {}; // secure an object is assigned when bar is absent

Thật vậy, đã nảy sáng nay. Đã sửa, nhưng cảm ơn vì đã chú ý.
Brad Christie

1
Ý bạn không phải là ||thay vì ??sao?
Rocket Hazmat

2
Cảm ơn! Bạn đã đóng đinh nó. Tôi thực sự đang sử dụng một đối tượng trong trường hợp này. :)
Web_Designer

8
Đối với bất kỳ ai tò mò, điều này hoạt động vì ||toán tử của JS không trả về true hoặc false, nó trả về giá trị 'true' đầu tiên. Giả sử bạn có val0val1như undefined, và val2đang 2, val33. val0 || val1 || val2 || val3sẽ trả về 2, vì nó là giá trị 'trung thực' đầu tiên.
Jake T.

2
Thành ngữ này không phải là chống lại khuôn mẫu sao? Điều gì xảy ra nếu bạn chuyển 0 hoặc chuỗi trống, biểu thức 'OR' sẽ bỏ qua nó và sử dụng giá trị mặc định mà bạn thực sự muốn là 0 hoặc chuỗi trống.
Paul Trzyna

24

|| sẽ trả về giá trị trung thực đầu tiên mà nó gặp phải và do đó có thể được sử dụng như một toán tử liên kết, tương tự như của C # ??

startingNum = startingNum || 1;

Tôi như lời giải thích của bạn nhiều hơn những người khác
ajax333221

12

Có, có:

var startingNum = startingNum || 1;

Nói chung, expr1 || expr2hoạt động theo cách sau (như được đề cập trong tài liệu ):

Trả về expr1nếu nó có thể được chuyển đổi thành true; ngược lại, trả về expr2. Do đó, khi được sử dụng với Booleancác giá trị, ||trả về truenếu một trong hai toán hạng là true; nếu cả hai đều false, trả về false.


Không phải là nó chính xác hơn để nói if a is truthyvs if a is evaluated to true?
JaredPar

3
@JaredPar: Để tránh sự mơ hồ, tôi đã thay thế giải thích chi tiết ban đầu của mình bằng giải thích từ Mạng nhà phát triển Mozilla. Nó sẽ ít mơ hồ hơn.
Tadeck

2
var startingNum = startingNum || 1;

Trong trường hợp này, bạn có thể sử dụng toán tử OR.


2
startingNum = startingNum || 1

Nếu bạn có một điều kiện với null, như

startingNum = startingNum ? startingNum : null

bạn có thể dùng '&&'

startingNum = startingNum && startingNum

Nhưng sẽ không anything && nullđánh giá thành null trừ khi anythinglà giả mạo?
Petruza

Vâng, nếu bất cứ điều gì là trung thực, nó sẽ đánh giá là null. Nếu falsy của mình, đánh giá lại với giá trị falsy
a2441918

1

Các câu trả lời trên là đúng. Trong JavaScript, câu lệnh sau:

startingNum = startingNum ? otherNum : 1

có thể được diễn đạt như

startingNum = otherNum || 1

Một tình huống khác không được đề cập ở đây là nếu bạn muốn giá trị trả về false khi không khớp. JavaScript viết tắt cho điều này là:

startingNum = startingNum ? otherNum : 0

Nhưng nó có thể được diễn đạt như

startingNum = startingNum && otherNum

Chỉ muốn đề cập đến một kịch bản khác trong trường hợp những người khác đang tìm kiếm một câu trả lời tổng quát hơn.


có một cách viết tắt cho một cái gì đó như thế này: x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
oldboy

@Anthony Không, bởi vì innerWidth * 0.0375 > 24khác với if truephần vốn có innerWidth * 0.0375. Tốc ký chỉ có thể được sử dụng nếu expression to be evaluatedif truecùng một giá trị. Tương tự tại sao bạn sẽ không thể viết nhanh x = someBoolean ? 'Heck yea!' : 'No way!'.
deedub

@deedub tốt, thực ra, có một "tốc ký" (nếu bạn muốn gọi nó như vậy) sẽ làMath.max(innerWidth * 0.0375, 24)
oldboy

@Anthony Bạn sẽ không gọi nó như vậy;) Nhưng Math.maxhoạt động tốt hơn toán tử bậc ba trong trường hợp sử dụng của bạn.
deedub

1
" startingNum = startingNum ? otherNum : 1có thể được diễn đạt là startingNum = otherNum || 1" là sai. tôi vừa thử nghiệm cái này
oldboy

0

Để tạo ra một con chim nhạn như:

boolean_condition ? true_result : false_result

trong javascript, bạn có thể làm:

(boolean_condition && true_result ) || false_result;

Thí dụ:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"

sooo x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24sẽ trở thành (innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? có cách viết tắt nào để tôi không phải lặp lại innerWidth * 0.0375, ngoài việc gán nó cho một biến không ???
oldboy

1
Trong trường hợp này, Math.max( innerWidth * 0.0375 , 24 )sẽ làm việc thanh lịch. Đối với trường hợp tổng quát hơn, sẽ tốt hơn nếu bạn tạo một phương thức mô tả được gọi là 'somethingifiedInnerWidth' để cải thiện khả năng đọc, thay vì tạo một biến. Mặc dù trong một số trường hợp, sẽ dễ đọc hơn nếu có một biến (có tên mô tả đó), vì vậy trong tương lai câu hỏi 'tại sao nó lại được nhân với biến này?' không được nâng lên.
xxjjnn

wow thậm chí không biết bạn có thể cung cấp một đối số thứ hai cho Math.max. giải pháp siêu thanh lịch !!
oldboy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.