Boolean

Boolean (불리언)

Boolean 값은 true 또는 false 두 값 중 하나일 수 있으며, 논리적 명제의 진리값을 나타냅니다. 원문은 MDN의 JavaScript 내장 객체 참고 문서입니다.

출처: Boolean - JavaScript | MDN

본문

Boolean 값은 true 또는 false 두 값 중 하나일 수 있으며, 논리적 명제의 진리값을 나타냅니다.

불리언 값은 일반적으로 관계 연산자, 동등 연산자, 논리 NOT(!)에 의해 생성됩니다. Array.isArray()처럼 조건을 나타내는 함수들에 의해서도 생성됩니다. 참고로 &&|| 같은 2진 논리 연산자는 피연산자의 값을 반환하며, 그 값이 꼭 불리언일 필요는 없습니다.

불리언 값은 일반적으로 조건부 테스트에서 사용됩니다 — if...elsewhile 문의 조건, 조건 연산자(? :), 또는 Array.prototype.filter()의 술어 반환 값 등이 그 예입니다.

명시적으로 어떤 것을 불리언 값으로 변환할 일은 거의 없습니다. JavaScript는 불리언 컨텍스트에서 이를 자동으로 수행하므로, truthiness에 기반해 어떤 값이든 불리언인 것처럼 사용할 수 있기 때문입니다. 또한 if (condition === true)if (condition === false) 대신 if (condition)if (!condition)을 사용하는 것이 권장되는데, 이 관례를 활용할 수 있기 때문입니다. 다만 조건을 나타내는 값이 항상 불리언이도록 하는 것은 코드의 의도를 명확히 하는 데 도움이 될 수 있습니다.

// 이렇게 하세요 (항상 불리언 값을 반환):
const isObject = (obj) => !!obj && typeof obj === "object";
// 또는:
const isObject = (obj) => Boolean(obj) && typeof obj === "object";
// 또는:
const isObject = (obj) => obj !== null && typeof obj === "object";
// 이렇게 하지 마세요 (false와 같지 않은 falsy 값을 반환할 수 있음):
const isObject = (obj) => obj && typeof obj === "object";

Boolean 기본형과 Boolean 객체 (Boolean primitives and Boolean objects)

비불리언 값을 불리언으로 변환하려면 Boolean을 함수로 사용하거나 이중 NOT 연산자를 사용하세요. new와 함께 Boolean() 생성자는 사용하지 마세요.

const good = Boolean(expression);
const good2 = !!expression;
const bad = new Boolean(expression); // 사용하지 마세요!

그 이유는 감싼 값이 false인 Boolean 객체를 포함한 모든 객체가 truthy이고, 조건문 같은 곳에서 true로 평가되기 때문입니다.

if (new Boolean(true)) {
  console.log("This log is printed.");
}
if (new Boolean(false)) {
  console.log("This log is ALSO printed.");
}
const myFalse = new Boolean(false); // myFalse는 Boolean 객체 (기본형 false가 아님)
const g = Boolean(myFalse); // g는 true

경고: Boolean을 생성자로 사용하는 일은 드물어야 합니다.

Boolean 강제 변환 (Boolean coercion)

불리언을 기대하는 많은 내장 연산은 먼저 인자를 불리언으로 강제 변환합니다. 그 과정은 다음과 같이 요약됩니다.

  • 불리언은 그대로 반환됩니다.
  • undefinedfalse가 됩니다.
  • nullfalse가 됩니다.
  • 0, -0, NaNfalse, 다른 숫자는 true가 됩니다.
  • 0nfalse, 다른 BigInt는 true가 됩니다.
  • 빈 문자열 ""false, 다른 문자열은 true가 됩니다.
  • Symbol은 true가 됩니다.
  • 모든 객체는 true가 됩니다.

참고: 레거시 동작으로 document.all은 객체임에도 불리언으로 사용될 때 false를 반환합니다. 이 속성은 레거시이고 비표준이므로 사용하지 말아야 합니다.

참고: 문자열 강제 변환이나 숫자 강제 변환 같은 다른 타입 변환과 달리, 불리언 강제 변환은 사용자 메서드를 호출하여 객체를 기본형으로 변환하려 시도하지 않습니다.

즉, false로 강제 변환되는 값은 손에 꼽을 정도로 적습니다 — 이를 falsy 값이라고 합니다. 나머지 모든 값은 truthy 값입니다. 값의 truthiness는 논리 연산자, 조건문, 또는 어떤 불리언 컨텍스트와 함께 사용될 때 중요합니다.

JavaScript에서 같은 효과를 얻는 두 가지 방법이 있습니다. 이중 NOT(!!x) — x를 두 번 부정하여 위와 같은 알고리즘으로 x를 불리언으로 변환합니다. 그리고 Boolean() 함수(Boolean(x)) — 위와 같은 알고리즘으로 x를 변환합니다.

참고: truthiness는 true 또는 false와 느슨하게 같은 것과는 다릅니다.

if ([]) {
  console.log("[] is truthy");
}
if ([] == false) {
  console.log("[] == false");
}
// [] is truthy
// [] == false

[]는 truthy이지만 false와도 느슨하게 같습니다. 모든 객체가 truthy이기 때문에 truthy입니다. 그러나 기본형인 false와 비교할 때 []도 기본형으로 변환되며, Array.prototype.toString()을 통해 ""가 됩니다. 문자열과 불리언을 비교하면 둘 다 숫자로 변환되고 모두 0이 되므로 [] == false는 true입니다. 일반적으로 falsiness와 == false는 다음 경우에 다릅니다.

  • NaN, undefined, null은 falsy이지만 false와 느슨하게 같지 않습니다.
  • "0"(그리고 ""이 아니지만 0으로 강제 변환되는 다른 문자열 리터럴)은 truthy이지만 false와 느슨하게 같습니다.
  • 객체는 항상 truthy이지만, 그 기본형 표현은 false와 느슨하게 같을 수 있습니다.

truthy 값이 true와 느슨하게 같을 가능성은 더욱 낮습니다. 모든 값은 truthy 또는 falsy 중 하나이지만, 대부분의 값은 truefalse 어느 쪽과도 느슨하게 같지 않습니다.

생성자 및 인스턴스 멤버

  • Boolean() — Boolean 객체를 만듭니다. 함수로 호출하면 Boolean 타입의 기본형 값을 반환합니다.
  • 인스턴스 속성 constructor는 인스턴스 객체를 만든 생성자 함수입니다(Boolean 인스턴스의 초기값은 Boolean 생성자).
  • Boolean.prototype.toString() — 객체의 값에 따라 true 또는 false 문자열을 반환합니다. Object.prototype.toString()을 override합니다.
  • Boolean.prototype.valueOf() — Boolean 객체의 기본형 값을 반환합니다. Object.prototype.valueOf()을 override합니다.

예제 (Examples)

false 값 만들기.

const bNoParam = Boolean();
const bZero = Boolean(0);
const bNull = Boolean(null);
const bEmptyString = Boolean("");
const bfalse = Boolean(false);

true 값 만들기.

const btrue = Boolean(true);
const btrueString = Boolean("true");
const bfalseString = Boolean("false");
const bSuLin = Boolean("Su Lin");
const bArrayProto = Boolean([]);
const bObjProto = Boolean({});

사양 및 호환성

Boolean은 ECMAScript® 2027 Language Specification의 # sec-boolean-objects 절에 정의되어 있습니다. Baseline "Widely available"로 분류되어 2015년 7월부터 브라우저 전반에서 사용 가능했습니다.

더 알아보기