Ruby | | = (hoặc bằng) trong JavaScript?


127

Tôi yêu ||=cơ chế của Ruby . Nếu một biến không tồn tại hoặc tồn tại nil, thì hãy tạo nó và đặt nó bằng với một cái gì đó:

amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0

Tôi cần phải làm một cái gì đó tương tự trong JavaScript bây giờ. Quy ước hoặc cách thích hợp để làm điều này là gì? Tôi biết ||=cú pháp không hợp lệ. 2 cách rõ ràng để xử lý nó là:

window.myLib = window.myLib || {};

// or

if (!window.myLib)
  window.myLib = {};

Câu trả lời:


151

Cả hai đều hoàn toàn chính xác, nhưng nếu bạn đang tìm kiếm thứ gì đó hoạt động như ||=trong ruby. Phương pháp đầu tiên là phương pháp variable = variable || {}bạn đang tìm kiếm :)


21

Bạn có thể sử dụng toán tử OR logic ||để đánh giá toán hạng bên phải của nó nếu lVallà giá trị giả.

Giá trị giả bao gồm ví dụ null, false, 0, "", undefined, NaN

x = x || 1

4

Nếu bạn đang làm việc với các đối tượng, bạn có thể sử dụng hàm hủy (kể từ ES6) như vậy:

({ myLib: window.myLib = {} } = window);

... nhưng bạn không đạt được bất cứ điều gì qua câu trả lời được chấp nhận ngoại trừ sự nhầm lẫn.


1
"nhưng bạn không đạt được bất cứ điều gì qua câu trả lời được chấp nhận ngoại trừ nhầm lẫn" - tốt đẹp. :)
lindes

Tôi cá là ai đó sẽ lấy điều này làm lý do để ghét javascript
Volper

1

Toán tử mà bạn hỏi về đã được đề xuất như một tính năng trong JavaScript . Nó hiện đang ở Giai đoạn 3 , vì vậy nó chưa phải là một phần chính thức của ngôn ngữ, nhưng nó sẽ được chấp nhận, với hầu hết các thay đổi nhỏ nếu họ phát hiện ra những vấn đề lớn không mong muốn.

Bạn có thể sử dụng nó ngay bây giờ bằng cách sử dụng plugin Babel plugin-đề xuất-logic-gán-toán tử . Tôi chưa bao giờ sử dụng plugin đó, vì vậy tôi không biết nó hoạt động tốt như thế nào.


-1

Ruby | | = gán ngắn mạch toán tử. Có thể nghĩ như thế này:

return a || a = b

Vì vậy, trong javascript, điều này trông rất giống nhau:

return a || (a = b);

Tuy nhiên, có vẻ như đã chỉ ra trong các ý kiến ​​dưới đây, hình thức ruby ​​theo nghĩa đen này kém hiệu quả hơn thành ngữ javascript tiêu chuẩn a = a || b.

Để tham khảo: http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html


1
Trong thực tế, có vẻ như a = a || bhình thức tối ưu hơn jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3
jchook

ah công cụ mát mẻ. Nó trông như thế nào nếu x có giá trị và ngắn mạch như vậy?
chris

Tôi tin rằng sự cố xé cần phải rõ ràng trên jsperf vì vậy bài kiểm tra này sẽ cho thấy hiệu suất ngắn mạch. Tôi đoán là V8 có một tối ưu hóa đặc biệt cho hình thức a = a || b.
jchook

3
FYI Dường như bất kỳ sự khác biệt nào hiện đã được tối ưu hóa.
Charles Wood

a || (a = b)có ngữ nghĩa chính xác để suy ra tên hàm. Nó hiện đang được thảo luận cho đề xuất mới.
dùng4642212

-1

Bạn có thể đạt được hành vi mong muốn bằng cách sử dụng toán tử | = trong javascript cho số nguyên. Nhưng bạn phải xác định biến trước.

let a = 0
a |= 100
console.log(a) // 100

Đối với các đối tượng

let o = {}
o.a |= 100
console.log(o) // {a: 100}

Đối với mảng

let arr = []
arr[0] |= 100
console.log(arr) // [100]

Câu hỏi không phải là về |hoặc |=. Hành vi mong muốn trong câu hỏi không liên quan đến hoạt động bitwise.
dùng4642212

Bạn đúng tôi sẽ chỉnh sửa câu trả lời cho phù hợp
wallgeek

Đã chỉnh sửa. Tôi hy vọng nó có ý nghĩa bây giờ.
wallgeek
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.