[javascript] 자바 스크립트에 null-coalescing (Elvis) 연산자 또는 안전한 탐색 연산자가 있습니까?

예를 들어 설명하겠습니다.

엘비스 연산자 (? 🙂

“Elvis 연산자”는 Java의 3 진 연산자를 줄입니다. 이것이 편리한 곳의 한 예는 표현식이 false 또는 null로 해석되는 경우 ‘감지 가능한 기본값’을 반환하는 것입니다. 간단한 예는 다음과 같습니다.

def gender = user.male ? "male" : "female"  //traditional ternary operator usage

def displayName = user.name ?: "Anonymous"  //more compact Elvis operator

안전 탐색 연산자 (?.)

안전 탐색 연산자는 NullPointerException을 피하기 위해 사용됩니다. 일반적으로 객체에 대한 참조가있는 경우 객체의 메서드 나 속성에 액세스하기 전에 객체가 null이 아닌지 확인해야합니다. 이를 피하기 위해 안전한 탐색 연산자는 다음과 같이 예외를 발생시키는 대신 단순히 null을 반환합니다.

def user = User.find( "admin" )           //this might be null if 'admin' does not exist
def streetName = user?.address?.street    //streetName will be null if user or user.address is null - no NPE thrown



답변

Elvis 연산자 대신 논리 ‘OR’연산자를 사용할 수 있습니다.

예를 들면 displayname = user.name || "Anonymous".

그러나 Javascript에는 현재 다른 기능이 없습니다. 다른 구문을 원하면 CoffeeScript를 보는 것이 좋습니다 . 찾고있는 것과 비슷한 약기가 있습니다.

예를 들어 존재 연산자

zip = lottery.drawWinner?().address?.zipcode

기능 단축키

()->  // equivalent to function(){}

섹시한 함수 호출

func 'arg1','arg2' // equivalent to func('arg1','arg2')

여러 줄 주석과 클래스도 있습니다. 분명히 이것을 자바 스크립트로 컴파일하거나 페이지에 삽입해야 <script type='text/coffeescript>'하지만 많은 기능을 추가합니다 :). 사용 <script type='text/coffeescript'>은 실제로 개발 용이 아니며 프로덕션 용이 아닙니다.


답변

조금 더 길지만 다음은 안전한 탐색 연산자와 동일하다고 생각합니다.

var streetName = user && user.address && user.address.street;

streetName그러면 user.address.street또는 의 값이 undefined됩니다.

다른 것을 기본값으로 사용하려면 위의 단축키와 결합하거나 다음을 제공 할 수 있습니다.

var streetName = (user && user.address && user.address.street) || "Unknown Street";


답변

Javascript의 논리 OR 연산자단락 되어 “Elvis”연산자를 대체 할 수 있습니다.

var displayName = user.name || "Anonymous";

그러나 내 지식으로는 ?.운영자 와 동등한 것은 없습니다 .


답변

때때로 다음 관용구가 유용하다는 것을 알았습니다.

a?.b?.c

다음과 같이 다시 작성할 수 있습니다.

((a||{}).b||{}).c

이것은 객체에서 알 수없는 속성을 얻는 것이 null또는 on 에서처럼 예외를 던지기보다는 정의되지 않은 것을 반환한다는 사실을 이용 undefined하므로 탐색하기 전에 null 및 undefined를 빈 객체로 바꿉니다.


답변

lodash _.get()가에서와 같이 여기에서 도울 수 있다고 생각 _.get(user, 'name')합니다._.get(o, 'a[0].b.c', 'default-value')


답변

현재 초안 스펙이 있습니다.

https://github.com/tc39/proposal-optional-chaining

https://tc39.github.io/proposal-optional-chaining/

그러나 지금은 lodashget(object, path [,defaultValue]) 또는 dlv 를 사용하고 싶습니다.delve(obj, keypath)

업데이트 (2019 년 12 월 23 일 현재) :

옵션 체인이 4 단계로 이동했습니다.


답변

2019 년 업데이트

JavaScript는 이제 Elvis Operator 및 Safe Navigation Operator에 해당합니다.


안전한 자산 접근

옵션 체인 연산자 ( ?.) 현재이다 단계 4 인 ECMAScript의 제안 . 오늘 Babel과 함께 사용할 수 있습니다 .

// `undefined` if either `a` or `b` are `null`/`undefined`. `a.b.c` otherwise.
const myVariable = a?.b?.c;

논리 AND 연산자 ( &&)이 시나리오를 처리 할 수있는 “오래된”더-자세한 방법입니다.

const myVariable = a && a.b && a.c;

기본 제공

nullish 병합 연산자 ( ??) 현재 인 3 단 대한 ECMAScript 제안 . 오늘 Babel과 함께 사용할 수 있습니다 . 연산자의 왼쪽이 널값 ( null/ undefined) 인 경우 기본값을 설정할 수 있습니다 .

const myVariable = a?.b?.c ?? 'Some other value';

// Evaluates to 'Some other value'
const myVariable2 = null ?? 'Some other value';

// Evaluates to ''
const myVariable3 = '' ?? 'Some other value';

논리 OR 연산자 ( ||) 다른 해결책이 약간 다른 행동 . 연산자의 왼쪽이 거짓 인 경우 기본값을 설정할 수 있습니다 . myVariable3아래 결과는 myVariable3위와 다릅니다 .

const myVariable = a?.b?.c || 'Some other value';

// Evaluates to 'Some other value'
const myVariable2 = null || 'Some other value';

// Evaluates to 'Some other value'
const myVariable3 = '' || 'Some other value';