Null 조건부 연산자
C # 6.0이 방금 출시되었으며 JavaScript에서 사용하고 싶은 새롭고 멋진 기능이 있습니다. 이를 Null 조건부 연산자 라고 합니다 . 이들은 ?.
또는 ?[]
구문을 사용 합니다.
이것들이하는 일은 본질적 null
으로 속성에 접근하기 전에 가지고있는 객체가 아닌지 확인할 수있게 해주는 것 입니다. 객체가 null
이면 null
속성 액세스의 결과로 대신 얻을 수 있습니다.
int? length = customers?.Length;
따라서 여기에 int
null이있을 수 있으며, 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 논리 연산자는 true
or 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();
이전의 모든 접근 방식보다 길지만 마법의 뒤처짐없이 의도를 명확하게 보여줍니다.
필요에 따라 코드 가독성을 향상시킬 수있는 몇 가지 방법이 있습니다.
이미 babeljs (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"] }
이미 lodash (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);
일반 자바 스크립트 :
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
'programing' 카테고리의 다른 글
Bash 스크립트에서 백틱과 $ ()의 차이점은 무엇입니까? (0) | 2021.01.16 |
---|---|
Subversion이있는 ".gitignore"파일과 동일 (0) | 2021.01.16 |
VMWARE에서 VirtualBox로 마이그레이션 (0) | 2021.01.15 |
Android의 FLAG_ACTIVITY_CLEAR_TOP (0) | 2021.01.15 |
C #의 정보를 잃지 않고 예외에 메시지를 추가하려면 어떻게해야합니까? (0) | 2021.01.15 |