자바 스크립트에서 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.