programing

Null이거나 JavaScript에서 정의되지 않은 경우 값 바꾸기

testmans 2023. 10. 7. 09:30
반응형

Null이거나 JavaScript에서 정의되지 않은 경우 값 바꾸기

나는 그것을 적용하기 위한 요구사항이 있습니다.??자바스크립트에 대한 C# 연산자인데 어떻게 하는지 모르겠습니다.이를 C#에서 살펴봅니다.

int i?=null;
int j=i ?? 10;//j is now 10

이제 자바스크립트로 설정합니다.

var options={
       filters:{
          firstName:'abc'
       } 
    };
var filter=options.filters[0]||'';//should get 'abc' here, it doesn't happen
var filter2=options.filters[1]||'';//should get empty string here, because there is only one filter

어떻게 하면 올바르게 할 수 있습니까?

감사해요.

편집: 문제의 절반을 발견했습니다.개체에 'indexer' 표기법을 사용할 수 없습니다(my_object[0]). 우회할 수 있는 방법이 있습니까? (필터 속성의 이름을 미리 모르므로 필터 속성을 반복하고 싶지 않습니다.)

자바스크립트와 동등한 것은 다음과 같습니다.

var i = null;
var j = i || 10; //j is now 10

논리 연산자는 부울 값을 반환하지 않고 true로 변환할 수 있는 첫 번째 값을 반환합니다.

또한 단일 개체 대신 개체 배열을 사용합니다.

var options = {
    filters: [
        {
            name: 'firstName',
            value: 'abc'
        }
    ]
};
var filter  = options.filters[0] || '';  // is {name:'firstName', value:'abc'}
var filter2 = options.filters[1] || '';  // is ''

그것은 색인으로 접근할 수 있습니다.

ES2020 답변

새로운 Nullish Coalesing Operator는 마침내 JavaScript에서 사용할 수 있습니다.그러나 브라우저 지원에 유의해야 합니다.바벨과 같은 자바스크립트 컴파일러를 사용하여 이전 버전과 호환되는 것으로 변환해야 할 수도 있습니다.

문서에 의하면,

nullish 병합 연산자(??)는 왼쪽 피연산자가 null이거나 정의되지 않으면 오른쪽 피연산자를 반환하고, 그렇지 않으면 왼쪽 피연산자를 반환하는 논리 연산자입니다.

const options={
  filters:{
    firstName:'abc'
  } 
};
const filter = options.filters[0] ?? '';
const filter2 = options.filters[1] ?? '';

이렇게 하면 두 변수 모두 다음 값을 가질 수 있습니다.''한다면filters[0]아니면filters[1]이다null, 아니면undefined.

nullish calesing 연산자는 다음과 같은 다른 유형의 false 값에 대한 기본값을 반환하지 않습니다.0그리고.''. 모든 잘못된 값을 설명하려면 OR 연산자를 사용해야 합니다.||.

논리적 무효 할당, 2020+ 솔루션

새 연산자가 추가되었습니다.??=. 이는 다음과 같습니다.value = value ?? defaultValue.

||=그리고.&&=이와 유사하며 아래 링크들이 있습니다.

왼쪽이 정의되지 않았거나 null인지 확인하고 이미 정의된 경우 단락합니다.그렇지 않으면 왼쪽에 오른쪽 값이 할당됩니다.

기본 예시

let a          // undefined
let b = null
let c = false

a ??= true  // true
b ??= true  // true
c ??= true  // false

// Equivalent to
a = a ?? true

객체/배열 예시

let x = ["foo"]
let y = { foo: "fizz" }

x[0] ??= "bar"  // "foo"
x[1] ??= "bar"  // "bar"

y.foo ??= "buzz"  // "fizz"
y.bar ??= "buzz"  // "buzz"

x  // Array [ "foo", "bar" ]
y  // Object { foo: "fizz", bar: "buzz" }

기능 예시

function config(options) {
    options.duration ??= 100
    options.speed ??= 25
    return options
}

config({ duration: 555 })   // { duration: 555, speed: 25 }
config({})                  // { duration: 100, speed: 25 }
config({ duration: null })  // { duration: 100, speed: 25 }

??= 브라우저 지원 2021년 9월 - 90%

??= 모질라 설명서

||= 모질라 설명서

&&= 모질라 설명서

TLDR:

int j=i ?? 10;javascript에서도 사용해도 무방합니다.교체만 하면 됩니다.int와 함께let.

??||

??보다 선호되어야 할||null과 미정의 경우만 확인하기 때문입니다.

아래의 표현은 모두 참입니다.

(null || 'x') === 'x' ;
(undefined || 'x') === 'x' ;
//Most of the times you don't want the result below
('' || 'x') === 'x'  ;
(0 || 'x') === 'x' ;
(false || 'x') === 'x' ;
//-----

//Using ?? is preferred
(null ?? 'x') === 'x' ;
(undefined ?? 'x') === 'x' ;
//?? works only for null and undefined, which is in general safer
('' ?? 'x') === '' ;
(0 ?? 'x') === 0 ;
(false ?? 'x') === false ;

별표:브라우저 호환성을 확인하고 이러한 다른 브라우저를 지원해야 한다면 babel을 사용합니다.

문제의 절반을 발견했습니다.개체(my_object[0])에 'indexer' 표기를 사용할 수 없습니다.우회할 방법이 있습니까?

아니요. 객체 리터럴은 이름에서 알 수 있듯이 객체이며 배열이 아닙니다. 따라서 속성의 특정 순서가 없으므로 인덱스를 기준으로 속성을 검색할 수 없습니다.값을 검색할 수 있는 유일한 방법은 특정 이름을 사용하는 것입니다.

var someVar = options.filters.firstName; //Returns 'abc'

으로.for ... in프:

for(var p in options.filters) {
    var someVar = options.filters[p]; //Returns the property being iterated
}

파괴해법

질문 내용이 변경되었을 수도 있으니 철저히 답변하도록 하겠습니다.

파괴 기능을 사용하면 속성이 있는 모든 항목에서 값을 끌어낼 수 있습니다.null/undefined 및 name alias의 경우 기본값을 정의할 수도 있습니다.

const options = {
    filters : {
        firstName : "abc"
    } 
}

const {filters: {firstName = "John", lastName = "Smith"}} = options

// firstName = "abc"
// lastName = "Smith"

참고: 자본화 문제

배열로 작업하는 경우 다음과 같이 수행합니다.

이 경우 이름은 배열의 각 개체에서 추출되며 고유한 별칭이 부여됩니다.하지 않을 수 입니다.= {}가 추가되었습니다.

const options = {
    filters: [{
        name: "abc",
        value: "lots"
    }]
}

const {filters:[{name : filter1 = "John"} = {}, {name : filter2 = "Smith"} = {}]} = options

// filter1 = "abc"
// filter2 = "Smith"

자세한 자습서

브라우저 지원 92% 2020년 7월

언급URL : https://stackoverflow.com/questions/1011317/replace-a-value-if-null-or-undefined-in-javascript

반응형