Javascript에 null moalesing 연산자가 있습니까?
예를 들어 C#에서는 다음과 같이 할 수 있습니다.
String someString = null; var whatIWant = someString ?? "Cookies!";
Javascript에 대해 제가 알 수 있는 최선의 근사치는 조건 연산자를 사용하는 것입니다.
var someString = null; var whatIWant = someString ? someString : 'Cookies!';
어떤 게 좀 이상한 IMHO야? 더 잘할 수 있을까?
질문에 대한 답변
갱신하다
이제 JavaScript는 nullish 병합 연산자(–)를 지원합니다. 왼쪽 피연산자가 다음과 같을 때 오른쪽 피연산자를 반환합니다.null
또는undefined
, 그 이외의 경우 왼쪽 오퍼랜드를 반환합니다.
오래된 답변
호환성을 확인한 후 사용하십시오.
C# 늘 머지 연산자와 동등한 JavaScript(??
)는 논리 OR( )을 사용하고 있습니다.
):
var whatIWant = someString
"Cookies!";
동작은 C#과 일치하지 않는 경우가 있습니다만, 이것이 JavaScript에서 기본값/대체 값을 할당하는 일반적인 간단한 방법입니다.
설명
첫 번째 피연산자의 유형에 관계없이 부울로 캐스팅하면 다음과 같은 결과가 됩니다.false
할당에는 두 번째 오퍼랜드가 사용됩니다.다음의 모든 경우에 주의해 주세요.
alert(Boolean(null)); // false alert(Boolean(undefined)); // false alert(Boolean(0)); // false alert(Boolean("")); // false alert(Boolean("false")); // true -- gotcha! :)
이것은 다음을 의미합니다.
var whatIWant = null
new ShinyObject(); // is a new shiny object var whatIWant = undefined
"well defined"; // is "well defined" var whatIWant = 0
42; // is 42 var whatIWant = ""
"a million bucks"; // is "a million bucks" var whatIWant = "false"
"no way"; // is "false"
function coalesce() {
var len = arguments.length;
for (var i=0; i<len; i++) {
if (arguments[i] !== null && arguments[i] !== undefined) {
return arguments[i];
}
}
return null; }
var xyz = {}; xyz.val = coalesce(null, undefined, xyz.val, 5);
// xyz.val now contains 5
이 솔루션은 SQL 병합 함수처럼 작동하며 임의의 수의 인수를 수락하고 값이 없는 경우 null을 반환합니다.C#처럼 동작합니다.연산자는 “”, “false” 및 “0”은 NOT NULL로 간주되므로 실제 값으로 카운트됩니다..net 배경의 경우, 이것이 가장 자연스러운 느낌의 솔루션이 될 것입니다.
네, 곧 나옵니다.제안서는 여기를 참조해 주세요.또, 도입 상황은 여기를 참조해 주세요.
다음과 같습니다.
x ?? y
예
const response = {
settings: {
nullValue: null,
height: 400,
animationDuration: 0,
headerText: '',
showSplashScreen: false
} };
const undefinedValue = response.settings?.undefinedValue ?? 'some other default'; // result: 'some other default' const nullValue = response.settings?.nullValue ?? 'some other default'; // result: 'some other default' const headerText = response.settings?.headerText ?? 'Hello, world!'; // result: '' const animationDuration = response.settings?.animationDuration ?? 300; // result: 0 const showSplashScreen = response.settings?.showSplashScreen ?? true; // result: false
한다면
C#의 대체품으로서??
이 경우 빈 문자열과 0을 삼키기 때문에 언제든지 자신의 함수를 쓸 수 있습니다.
function $N(value, ifnull) {
if (value === null
value === undefined)
return ifnull;
return value;
}
var whatIWant = $N(someString, 'Cookies!');
여기서 아무도 그 가능성을 언급하지 않았다.NaN
이 값도 null-ish 값입니다.그래서 2센트를 더 넣으려고 했어요.
지정된 코드의 경우:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1 ;
를 사용하는 경우
연산자, 첫 번째 false 이외의 값을 얻습니다.
var result = a
b
c
d
e
f; // result === 1
새로운 것을 사용하는 경우??
오퍼레이터, 당신은 그것을 얻을 수 있습니다.c
값은 다음과 같습니다.NaN
vas result = a ?? b ?? c ?? d ?? e ?? f; // result === NaN
둘 다 내게는 맞지 않는 것 같다.당신의 세계와 다를 수 있는 나의 작은 통합 논리 세계에서는 정의되지 않은 Null, NaN이 모두 “null-ish”라고 생각합니다.그래서, 난 다시 돌아올 수 있을 것 같아.d
(0)을 클릭합니다.
만약 누군가의 뇌가 내 뇌처럼 작동한다면NaN
, 그리고 이 커스텀coalesce
method(여기에 기재된 것과 달리)는 다음을 수행합니다.
function coalesce() {
var i, undefined, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg !== null && arg !== undefined
&& (typeof arg !== 'number'
arg.toString() !== 'NaN') ) {
return arg;
}
}
return null; }
코드를 가능한 한 짧게 하고 싶은 분들에게는 @impinball의 제안대로 사용할 수도 있습니다.이는 NaN이 NaN과 동등하지 않다는 사실을 이용합니다.자세한 내용은 여기를 참조하십시오.NaN이 NaN과 동등하지 않은 이유는 무엇입니까?
function coalesce() {
var i, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg != null && arg === arg ) { //arg === arg is false for NaN
return arg;
}
}
return null; }