programing

Null 조건부 연산자

projobs 2021. 1. 16. 09:10
반응형

Null 조건부 연산자


C # 6.0이 방금 출시되었으며 JavaScript에서 사용하고 싶은 새롭고 멋진 기능이 있습니다. 이를 Null 조건부 연산자 라고 합니다 . 이들은 ?.또는 ?[]구문을 사용 합니다.

이것들이하는 일은 본질적 null으로 속성에 접근하기 전에 가지고있는 객체가 아닌지 확인할 수있게 해주는 것 입니다. 객체가 null이면 null속성 액세스의 결과로 대신 얻을 수 있습니다.

int? length = customers?.Length;

따라서 여기에 intnull이있을 수 있으며, null이면 해당 값을 사용합니다 customers. 더 좋은 점은 다음을 연결할 수 있다는 것입니다.

int? length = customers?.orders?.Length;

나는 우리가 자바 스크립트로 이것을 할 수 있다고 믿지 않지만, 비슷한 일을하는 가장 좋은 방법이 무엇인지 궁금합니다. 일반적으로 체인 if블록은 읽기가 어렵습니다.

var length = null;
if(customers && customers.orders) {
    length = customers.orders.length;
}

"선택적 체인"이라고 불리는이 제안은 현재 3 단계에서 TC39 제안입니다 . 바벨 플러그인 그러나 V7에서 이미 사용할 수 있습니다.

사용 예 :

const obj = {
  foo: {
    bar: {
      baz: 42,
    },
  },
};

const baz = obj?.foo?.bar?.baz; // 42

const safe = obj?.qux?.baz; // undefined

js 논리 연산자는 trueor false가 아니라 truly또는 falsy값 자체를 반환 합니다. 예를 들어 expression x && y에서 x가 거짓이면 반환되고 그렇지 않으면 y반환됩니다. 따라서 운영자의 진리표가 정확합니다.

귀하의 경우에는 표현식 customers && customers.orders && customers.orders.Length사용 하여 length가치 또는 첫 번째 값 을 얻을 수 있습니다 falsy.

또한 ((customers || {}).orders || {}).length(개인적으로 나는이 구문과 가능한 가비지 수집 압력이 마음에 들지 않습니다)와 같은 마술을 할 수 있습니다.

또는 maybe모나드를 사용하십시오 .

function Option(value) {
    this.value = value;
    this.hasValue = !!value;
}

Option.prototype.map = function(s) {
    return this.hasValue
        ? new Option(this.value[s])
        : this;
}

Option.prototype.valueOrNull = function() {
    return this.hasValue ? this.value : null;
}

var length = 
    new Option(customers)
        .map("orders")
        .map("length")
        .valueOrNull();

이전의 모든 접근 방식보다 길지만 마법의 뒤처짐없이 의도를 명확하게 보여줍니다.


필요에 따라 코드 가독성을 향상시킬 수있는 몇 가지 방법이 있습니다.

  1. 이미 (v7 이상)를 사용하고 있으며 "Optional Chaining"babel 플러그인 (여전히 1 단계 제안) 을 사용할 의향이 있습니다 .

    const length = customers?.orders?.Length;
    
    // With default value (otherwise it will be `undefined`):
    const length = customers?.orders?.Length || defaultLength;
    
    // File: .babelrc
    { "plugins": ["@babel/plugin-proposal-optional-chaining"] }
    
  2. 이미 (v3.7 이상)를 사용하고있는 경우 : 다음 lodash.get방법을 사용합니다 .

    var length = _.get(customers, 'orders.length');
    
    // With default value (otherwise it will be `undefined`):
    var length = _.get(customers, 'orders.length', defaultLength);
    
  3. 일반 자바 스크립트 :

    var length = customers && customers.orders && customers.orders.length;
    
    // With default value (otherwise it may be whatever falsy value "customers" or "customers.orders" might have):
    var length = (customers
        && customers.orders
        && customers.orders.length) || defaultLength;
    

작동하는 빠르고 더러운 버전이 있습니다.

String.prototype.nullSafe = function() {
    return eval('var x='+this.replace(/\?/g,';if(x)x=x')+';x');
};

사용 예 :

var obj = { 
    Jim: 1,
    Bob: { "1": "B", "2": "o", "3": "b" },
    Joe: [ 1, 2, 3, { a: 20 } ]
};

 obj.Joe[3].a                 // 20    
"obj.Joe[3]?.a".nullSafe()    // 20

 obj.Joe[4].a                 // Error: Can't read 'a' from undefined
"obj.Joe[4].a".nullSafe()     // Error: Can't read 'a' from undefined
"obj.Joe[4]?.a".nullSafe()    // undefined

 obj.Jack[3].a.b              // Error: Can't read '3' from undefined
"obj.Jack[3].a.b".nullSafe()  // Error: Can't read '3' from undefined
"obj.Jack?[3].a.b".nullSafe() // undefined

참조 URL : https://stackoverflow.com/questions/31610869/null-conditional-operators

반응형