자바 스크립트에서 Ruby의 || = (또는 같음)?


128

저는 Ruby의 ||=메커니즘을 좋아 합니다. 변수가 존재하지 않거나 nil인 경우 생성하고 다음과 동일하게 설정합니다.

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

지금 JavaScript에서 비슷한 작업을해야합니다. 이를 수행하는 규칙이나 적절한 방법은 무엇입니까? ||=유효한 구문이 아님을 알고 있습니다. 이를 처리하는 두 가지 명백한 방법은 다음과 같습니다.

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

// or

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

답변:


152

둘 다 절대적으로 정확하지만 ||=루비 처럼 작동하는 것을 찾고 있다면 . variable = variable || {}당신이 찾고 있는 첫 번째 방법 :)


1
에 대한 유효한 값 x이 거짓 (예 :)이고이 정의되지 않은 false경우에만 기본값을 설정하려는 경우주의해서 사용하십시오 x.
Joshua Pinter

위의 의견이 맞습니다. 예를 들어 JS에서 동일한 방식으로 작동하지 않습니다. let amount = 0;그런 다음 amount = amount || 5 금액이 5로 변경됩니다. 그렇게하지 않으려면 ??대신 연산자를 사용하십시오 ||.
AshwinKumarS

@AshwinKumarS 아니면 그냥 amount ??= 5;.
user4642212

@ user4642212 구문이 JS에서 작동한다고 생각하지 않습니까?
AshwinKumarS

@AshwinKumarS 예, 그렇습니다. 문서 , 사양 , 제안을 참조하십시오 .
user4642212

22

거짓 값인 ||경우 오른쪽 피연산자를 평가 하는 논리 OR 연산자 를 사용할 수 있습니다 lVal.

거짓 값에는 다음이 포함됩니다. null, false, 0, "", undefined, NaN

x = x || 1

에 대한 유효한 값 x이 거짓 (예 :)이고이 정의되지 않은 false경우에만 기본값을 설정하려는 경우주의해서 사용하십시오 x.
Joshua Pinter

4

객체로 작업하는 경우 다음과 같이 구조화 (ES6 이후)를 사용할 수 있습니다.

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

...하지만 혼동을 제외하고는 받아 들여진 대답에 대해 아무것도 얻지 못합니다.


1
"그러나 당신은 혼동을 제외하고 받아 들여진 대답에 대해 아무것도 얻지 못합니다."-좋습니다. :)
lindes

나는 누군가가 자바 스크립트를 싫어하는 이유로 이것을 취할 것이라고 장담합니다
Volper

1

요청하신 연산자 는 JavaScript의 기능으로 제안되었습니다 . 현재 3 단계 에 있으므로 아직 공식 언어의 일부는 아니지만, 예상치 못한 중대한 문제를 발견하는 경우 기껏해야 사소한 변경으로 받아 들여질 것입니다.

이제 plugin-proposal-logical-assignment-operators Babel 플러그인을 사용하여 사용할 수 있습니다 . 나는 그 플러그인을 사용한 적이 없기 때문에 그것이 얼마나 잘 작동하는지 전혀 모른다.


-1

Ruby의 || = 연산자 단락 할당. 다음과 같이 생각할 수 있습니다.

return a || a = b

따라서 자바 스크립트에서 이것은 매우 유사하게 보입니다.

return a || (a = b);

그러나 아래 주석에서 지적한 것처럼이 문자 그대로의 루비 형식은 표준 자바 스크립트 관용구 a = a || 비.

참고 : http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html


1
실제로 보인다 a = a || b형태가 더 최적 jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3이
jchook

아 멋진 도구. x에 값이 있고 회로가 단락되면 어떻게 생겼습니까?
chris

나는 분해가 jsperf에서 명시 적이어야한다고 생각하므로이 테스트 는 단락 성능을 보여야한다. 내 생각 엔 V8에는 양식에 대한 특수 최적화가 a = a || b있습니다.
jchook

3
참고로 어떤 차이가 있었는지 이제 최적화 된 것 같습니다.
Charles Wood

a || (a = b)함수 이름을 추론하는 올바른 의미를 가지고 있습니다. 현재 새로운 제안 에 대해 논의 중 입니다.
user4642212

-1

정수 전용 자바 스크립트에서 | = 연산자를 사용하여 원하는 동작을 얻을 수 있습니다. 하지만 먼저 변수를 정의해야합니다.

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

개체

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

어레 이용

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

질문은 |또는에 관한 것이 아닙니다 |=. 질문에서 원하는 동작은 비트 연산과 관련이 없습니다.
user4642212

당신이 맞아요 내가 그에 따라 대답을 편집하겠습니다
wallgeek

편집. 이제 말이 되길 바랍니다.
wallgeek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.