๋ ผ๋ฆฌ ์ฐ์ฐ์์ ๋ํด ์๊ณ ์๋ค๋ฉด ๋ค์ ์ฌํญ์ ์ ์์งํ๊ณ ์์ ๊ฒ์ด๋ค.
true && true // true
true && false // false
true || false // true
false || true // true
๋ณดํต ๋ ผ๋ฆฌํฉ(||) ๋๋ ๋ ผ๋ฆฌ๊ณฑ(&&) ์ฐ์ฐ์ ํํ์์ ํ๊ฐ ๊ฒฐ๊ณผ๋ booleanํ์ ์ผ๋ก ์ธํด์ ๊ฒฐ๊ณผ๊ฐ์ true(1) ๋๋ false(0) ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง, ๊ผญ ๋ถ๋ฆฌ์ธ ๊ฐ์ด ์๋ ์ ์๋ค. ๋ฌธ์์ด์ด๋ ์ซ์, ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ ํ ์๋ ์๊ณ , ํด๋น ๊ฐ์ด Truthy ํ๋ Falsy ํ๋์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์์ด๋ ํ๋์ ๊ฐ์ผ๋ก ํ๊ฐ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
'Cat' && 'Dog' // "Dog"
'Cat' || 'Dog' // "Cat"
๋
ผ๋ฆฌํฉ(||) ๋๋ ๋
ผ๋ฆฌ๊ณฑ (&&) ์ฐ์ฐ์ ํํ์์ ์ธ์ ๋ 2๊ฐ์ ํผ์ฐ์ฐ์ ์ค ์ด๋ ํ์ชฝ์ผ๋ก ํ๊ฐ๋๋ค. ๋
ผ๋ฆฌ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ ํ๋ ํผ์ฐ์ฐ์๋ฅผ ํ์
๋ณํํ์ง ์๊ณ ๊ทธ๋๋ก ๋ฐํํ๋ค. ์ด๋ฅผ ๋จ์ถ ํ๊ฐ
๋ผ๊ณ ํ๋ค. ๋ ์ฐ์ฐ์ ๋ชจ๋ ์ขํญ์์ ์ฐํญ์ผ๋ก ํ๊ฐ๋ฅผ ์งํํ๋ค.
'Cat' && 'Dog' // "Dog"
๋
ผ๋ฆฌ๊ณฑ(&&) ์ฐ์ฐ์๋ ๋ ๊ฐ์ ํผ์ฐ์ฐ์๊ฐ ๋ชจ๋ true๋ก ํ๊ฐ๋ ๋ true๋ฅผ ๋ฐํํ๋ฉฐ, ์ขํญ์์ ์ฐํญ์ผ๋ก ํ๊ฐ๊ฐ ์งํ๋๋ค. ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์ 'Cat'์ truthyํ ๊ฐ์ด๋ฏ๋ก true๋ก ํ๊ฐ๋๋ค. ํ์ง๋ง ์ ํํ์์ ์ด ์์ ์์ ํ๊ฐํ ์ ์๋ค. ๋ ๋ฒ์งธ ํผ์ฐ์ฐ์๊น์ง ํ๊ฐํด ๋ณด์์ผํ๋ค.
์ฆ, ๋ ๋ฒ์งธ ํผ์ฐ์ฐ์๊ฐ ๋
ผ๋ฆฌ๊ณฑ ์ฐ์ฐ์ ํํ์์ ํ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, ๋
ผ๋ฆฌ๊ณฑ ์ฐ์ฐ์๋ ๋
ผ๋ฆฌ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ ํ๋ ๋ ๋ฒ์งธ ํผ์ฐ์ฐ์ 'Dog'๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ค.
'Cat' || 'Dog' // "Cat"
๋
ผ๋ฆฌํฉ(||) ์ฐ์ฐ์๋ ๋ ๊ฐ์ ํผ์ฐ์ฐ์ ์ค ํ๋๋ง true๋ก ํ๊ฐ๋์ด๋ true๋ฅผ ๋ฐํํ๋ฉฐ, ์ขํญ์์ ์ฐํญ์ผ๋ก ํ๊ฐ๊ฐ ์งํ๋๋ค. ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์ 'Cat'์ true๋ก ํ๊ฐ๋ฉ๋๋ค. ์ด ์์ ์ ๋ ๋ฒ์งธ ํผ์ฐ์ฐ์๊น์ง ํ๊ฐํ์ง ์์๋ ์ ํํ์์ ํ๊ฐํ ์ ์๋ค.
๋
ผ๋ฆฌํฉ ์ฐ์ฐ์๋ ๋
ผ๋ฆฌ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ ํ ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์, ๋ฌธ์์ด 'Cat'์ ๊ทธ๋๋ก ๋ฐํํ๋ค.
๊ทธ๋ผ ๋จ์ถ ํ๊ฐ๋ ์ด๋ค ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ๊น?
let done = true;
let message = "";
if (done) message = "์๋ฃ";
// ์์๋์ ์ฝ๋๋ ๊ฐ์ ๋์์ ์ํ
message = done && "์๋ฃ";
---
if (!done) message = '๋ฏธ์๋ฃ'
// ์์๋์ ์ฝ๋๋ ๊ฐ์ ๋์์ ์ํ
message = done || '๋ฏธ์๋ฃ';
let elem = null;
let value = elem.value; // TypeError: Cannot read property 'value' of null
let value = elem && elem.value; // // null
// ๋จ์ถ ํ๊ฐ๋ฅผ ์ฌ์ฉํ ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ ์ค์
function getStringLength(str) {
str = str || "";
return str.length;
}
getStringLength(); // 0
getStringLength("hi"); // 2
// ES6) ๋ค์๊ณผ ๊ฐ์ด ๋งค๊ฐ๋ณ์๋ก ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
function getStringLength(str = "") {
return str.length;
}
getStringLength(); // 0
getStrringLength("hi"); // 2
์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์ (?.)๋ ์ขํญ์ ํผ์ฐ์ฐ์๊ฐ null๋๋ undefined์ธ ๊ฒฝ์ฐ undefined๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐํญ์ ํ๋กํผํฐ๋ฅผ ์ด์ด๊ฐ๋ค.
์ต์ ๋ ์ฒด์ด๋์ ์ฌ์ฉํ๋ฉด ํ๋กํผํฐ๊ฐ ์๋ ์ค์ฒฉ ๊ฐ์ฒด๋ฅผ ์๋ฌ์์ด ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋ค.
๋ค์ ์์ ๋ฅผ ์ดํด๋ณด์.
const students = {
mark: {
age: 20,
score: {
korean: 90,
english: 80,
math: 40,
},
},
john: {
age: 20,
},
};
john์ด๋ผ๋ ์ฌ๋์ ์ํ์ ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ํน์ ๊ณผ๋ชฉ ์ ์ ์ ๋ณด์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
console.log(students.john.score.math); // TypeError: Cannot read property 'math' of undefined
์ต์ ๋ ์ฒด์ด๋์ ์ด์ฉํ๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ undefined๋ฅผ ๋ฐํํ๋ค.
console.log(students.john.score?.math); // undefined
์ด ๋ฌธ์ ๋ ์์์ ์ธ๊ธํ ๋จ์ถ ํ๊ฐ
์ && ์ฐ์ฐ์๋ก๋ ํด๊ฒฐํ ์ ์๋ค. ํ์ง๋ง ์ด์ฒ๋ผ ๊ฐ์ฒด์ ํน์ ํ๋กํผํฐ์ ์ ๊ทผํ๊ธฐ ์ํด ๊ฑฐ์ณ์ผ ํ ๊ตฌ์ฑ์์๊ฐ ๋ง์์ง๋ฉด ์ด๋ ๊ฒ ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ ๋จ์ ์ด ์๋ค.
console.log(
students && students.john && students.john.score && students.john.score.math
); // undefined
์ฃผ์ โ๏ธ
์ต์
๋ ์ฒด์ด๋์ ๋จ์ฉํ์ง ์๋๋ก ์ฃผ์ํด์ผํ๋ค
?.๋ ์กด์ฌํ์ง ์์๋ ๊ด์ฐฎ์ ๋์์๋ง ์ฌ์ฉํด์ผํ๋ค. ์ ์์์์๋ ์ฌ์ฉ์์ ์ํ์ ์๊ฐ ํ์๊ฐ์ด ์๋๋ค. ๋ฐ๋ผ์ students.john.score?.math๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
?. ์์ ๋ณ์๋ ๊ผญ ์ ์ธ๋์ด ์์ด์ผ ํ๋ค
์์ ์์์์ students๊ฐ ์ ์ธ๋์ด์์ง ์์ผ๋ฉด students.anything ํ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
console.log(students?.john); // ReferenceError: students is not defined
students?.john์ ์ฌ์ฉํ๋ ค๋ฉด let, const๋ฅผ ์ด์ฉํด students๋ฅผ ์ ์ํด์ผํ๋ค.
null ๋ณํฉ ์ฐ์ฐ์(??)๋ ์ขํญ์ ํผ์ฐ์ฐ์๊ฐ null ๋๋ undefined์ธ ๊ฒฝ์ฐ ์ฐํญ์ ํผ์ฐ์ฐ์๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ขํญ์ ํผ์ฐ์ฐ์๋ฅผ ๋ฐํํ๋ค.
let firstName = null;
let lastName = null;
let nickName = "๋ฐ์ด์ฌ๋ ";
// null์ด๋ undefined๊ฐ ์๋ ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์
console.log(firstName ?? lastName ?? nickName ?? "์ต๋ช
์ ์ฌ์ฉ์"); // ๋ฐ์ด์ฌ๋
์์ ๊ฐ๋
๋ง ๋ณธ๋ค๋ฉด ์ต์
๋ ์ฒด์ด๋ ์ฐ์ฐ์(?.)์ ๋
ผ๋ฆฌ ์ฐ์ฐ์(&&)
๊ทธ๋ฆฌ๊ณ null ๋ณํฉ ์ฐ์ฐ์(??)์ ๋
ผ๋ฆฌ ์ฐ์ฐ์(||)
๋ ์๋ก ๋ณ๋ค๋ฅผ๊ฒ์ด ์์ด ๋ณด์ธ๋ค. ์ค์ ๋ก ์์์ ์ค๋ช
ํ ์์๋ค์์ ??๋ฅผ ||๋ก ๋ฐ๊ฟ๋ ๊ทธ ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค.
ํ์ง๋ง ์ค์ํ ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค. ๋ฌด์์ด ๋ค๋ฅผ๊น โ
๋
ผ๋ฆฌ์ฐ์ฐ์ (&&, ||)
๋ ํผ์ฐ์ฐ์๊ฐ truthy ํน์ falsyํ ๊ฐ์ธ์ง์ ๋ํด ์ด์ ์ ๋๋ค.์ต์
๋ ์ฒด์ด๋ ์ฐ์ฐ์(?.)
์ null ๋ณํฉ ์ฐ์ฐ์(??)
๋ ํผ์ฐ์ฐ์๊ฐ null ํน์ undefined์ธ์ง์ ๋ํด ์ด์ ์ ๋๋ค.์ด ์ฐจ์ด์ ์ null, undefined๊ณผ / ""๊ฐ์ string
์ด๋ ์ซ์ 0
์ ๊ตฌ๋ถ์ง์ด์ผํ ๋ ์ค์ํ ์ญํ ์ ํ๋ค.
let str = "";
let length1 = str && str.length;
let length2 = str?.length;
console.log(length1); // ''
console.log(length2); // 0
str && str.length
๋ str์ ""๋ฅผ ํ ๋นํ์ง๋ง, ""์ faslyํ ๊ฐ์ผ๋ก ์ทจ๊ธํ๊ธฐ ๋๋ฌธ์ str์ ๊ฐ์ธ ""์ ๋ฐํํ๋ค.
๋ฐ๋ฉด str?.length
๋ str์ด null์ด๊ฑฐ๋ undefined์ผ ๊ฒฝ์ฐ์๋ง undefined๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ฐ๋ฐ ""๋ ๊ทธ๋ ์ง ์์ผ๋ฏ๋ก ์ฐํญ์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋น์ด์๋ ๋ฌธ์์ด์ length๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋ฏ๋ก 0์ด ๋๋ค.
๋ฐ๋ผ์ ๋น ๋ฌธ์์ด ""์ด ํ ๋น๋ ์ ์๋ ๋ณ์๋ฅผ ์ฌ์ฉํด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ค๋ฉด ์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์๊ฐ ๋ ์ ํฉํ๋ค.
let height = 0;
console.log(height || 100); // 100
console.log(height ?? 100); // 0
height || 100
๋ height์ 0์ ํ ๋นํ์ง๋ง, 0์ falsyํ ๊ฐ์ผ๋ก ์ทจ๊ธํ๊ธฐ ๋๋ฌธ์ null์ด๋ 0์ ํ ๋นํ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ๋ค.
๋ฐ๋ฉด height ?? 100
์ height๊ฐ null์ด๊ฑฐ๋ undefined์ผ ๊ฒฝ์ฐ์๋ง 100์ด ๋๋ค. ๋ฐ๋ผ์ 0์ด ์ถ๋ ฅ๋๋ค.
๋ฐ๋ผ์ 0์ด ํ ๋น๋ ์ ์๋ ๋ณ์๋ฅผ ์ฌ์ฉํด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ค๋ฉด null ๋ณํฉ ์ฐ์ฐ์๊ฐ ๋ ์ ํฉํ๋ค.