[javascript] ES6 / 2015의 안전하지 않은 속성 액세스 및 조건부 할당

거기 nullES6 (ES2015 / JavaScript.next / 하모니) 등의 -safe 속성 액세스 (null의 전파 / 유) 연산자 ?.커피 스크립트 예는? 아니면 ES7을 계획하고 있습니까?

var aThing = getSomething()
...
aThing = possiblyNull?.thing

이것은 대략 다음과 같습니다.

if (possiblyNull != null) aThing = possiblyNull.thing

이상적 솔루션 (심지어 할당해서는 안됩니다 undefined)로 aThing하면 possiblyNullISnull



답변

업데이트 (2020-01-31) : 사람들이 여전히 이것을 찾는 것 같습니다. 현재 이야기는 다음과 같습니다.

업데이트 (2017-08-01) : 공식 플러그인을 사용하려면 새로운 변형으로 Babel 7의 알파 빌드를 시도 할 수 있습니다. 귀하의 마일리지가 다를 수 있습니다

https://www.npmjs.com/package/babel-plugin-transform-optional-chaining

실물 :

현재 1 단계에있는 기능 : 옵션 체인.

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

오늘 사용하고 싶다면 그것을 수행하는 Babel 플러그인이 있습니다.

https://github.com/davidyaha/ecmascript-optionals-proposal


답변

?만큼 좋지 않습니다. 연산자이지만 비슷한 결과를 얻으려면 다음을 수행하십시오.

user && user.address && user.address.postcode

nullundefined둘 다 잘못된 값 이므로 ( 이 참조 참조 ) &&선행 연산자가 null이거나 정의되지 않은 경우에만 연산자 뒤의 속성에 액세스합니다.

또는 다음과 같은 함수를 작성할 수 있습니다.

function _try(func, fallbackValue) {
    try {
        var value = func();
        return (value === null || value === undefined) ? fallbackValue : value;
    } catch (e) {
        return fallbackValue;
    }
}

용법:

_try(() => user.address.postcode) // return postcode or undefined 

또는 대체 값으로 :

_try(() => user.address.postcode, "none") // return postcode or a custom string


답변

아니요 . JavaScript에서 lodash # get 또는 이와 유사한 것을 사용할 수 있습니다 .


답변

안전한 자산 접근을위한 바닐라 대안

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

가장 간결한 조건부 할당은 아마도

try { b = a.b.c.d.e } catch(e) {}


답변

아니요, ES6에는 null 전파 연산자가 없습니다. 알려진 패턴 중 하나를 사용해야합니다. 합니다.

하지만 다음과 같은 구조 조정을 사용할 수 있습니다.

({thing: aThing} = possiblyNull);

ES7에서 그러한 연산자를 추가하기위한 많은 토론 (예 : this ) 있지만 실제로 이륙 한 사람은 없습니다.


답변

여기 의 목록으로 이동하면 현재 Ecmascript에 안전한 순회를 추가 할 제안이 없습니다. 따라서이를 수행 할 수있는 좋은 방법은 없을뿐만 아니라 미래에도 추가되지는 않을 것입니다.


답변

// Typescript
static nullsafe<T, R>(instance: T, func: (T) => R): R {
    return func(instance)
}

// Javascript
function nullsafe(instance, func) {
    return func(instance);
};

// use like this
const instance = getSomething();
let thing = nullsafe(instance, t => t.thing0.thing1.thingx);