이번에는 여러가지 작업하는데 유용한 문법들을 공부해보겠다
삼항연산자
이전 글에서 잠깐 다룬적 있는데,
조건 ? A : B
꼴의 문법으로 조건이 충족할때는 A, 그렇지 않을때는 B를 실행하여 굳이 if else문을 사용하지 않아도 된다.
Truthy and Falsy
False와 같은 값들이란 의미로
undefined
null
0
''
NaN
false
값들이 있다 이 이의외 값은 모두 Truthy 즉, 참으로 구분되게 된다.
특히 null채킹을 할때
function print(person) {
if ( !person ){
return;
}
console.log(person.name);
}
const person = {
name: "mingyu"
};
print(person); //mingyu
처럼 false 값이 들어오면 오류대신 그냥 빈값 반환을 하는것으로 알 수 있다.
그렇다면 truthy한 값을 true로 바꾸려면 어떻게 해야할까?
단순하게 !를 두번 쓰면된다.
let value = 3;
console.log(value); //3
console.log(!value) //false
console.log(!!value); //true
즉, 위처럼 나타나게 된다. 물론 if문 안에 value를 그대로 써도 작동하긴 한다.
단축평가 논리 계산법
const dog = {
name : '멍멍이'
};
function getName(animal){
if (animal){
return animal.name;
}
return undefined;
}
const name = getName();
console.log(name)
위 코드는 dog객체를 입력받아서 이름을 출력하는 단순코드인데, falthy한 값이 오면 return하는 코드이다. 위코드를 간단히 만들 수 있는 방법이 있다.
먼저 아래 코드를 이해해보자.
console.log(true && 'hello'); //hello
console.log(false && 'hello'); //false
console.log('hello' && 'bye'); //bye
console.log(null && 'hello'); //null
console.log(undefined && 'hello') //undefined
쉽게 생각해서 &&는 앞에 오는것이 false면 뒤에있는걸 검사할 필요가 없기 때문에 앞의것의 값을 가지게 되고 앞이 true면 뒤에있는것도 검사를 해봐야 하기에 가져가는 것이다.
console.log(true || 'hello'); //true
console.log(false || 'hello'); //hello
console.log('hello' || 'bye'); //hello
console.log(null || 'hello'); //hello
console.log(undefined || 'hello') //hello
or는 반대로 앞에것이 false면 뒤에것을 검사해 보아야 하지만, 앞에것이 true면 검사할 필요가 없다.
즉, and 연산자와 반대라고 생각하면 될 것 같다. 이를 이용해서 위 코드를 줄인다면
const dog = {
name : '멍멍이'
};
function getName(animal){
return animal && animal.name;
}
const name = getName();
console.log(name)
위 코드처럼 줄일 수 있을 것이다.
함수의 기본 파라미터
function calculateCircleArea(r = 1 ) {
return Math.PI *r *r;
}
const area = calculateCircleArea(4);
console.log(area);
const area2 = calculateCircleArea();
console.log(area2);
함수에 인자를 넣어주지 않았을때 기본값을 지정하는 방법이다.
위에 내용들을 간단히 종합해서 아래와같이 좀 더 보기같은 코드를 짤 수 있다.
function getSound(animal) {
const sounds = {
개: "멍멍",
고양이: "야옹",
참새: "쨱짹",
비둘기: "구구구구"
};
return sounds[animal] || "?????";
}
console.log(getSound("개")); //멍멍
console.log(getSound("민규")); //?????
객체의 key,value값을 이용한건데 나는 파이썬을 이용하여 공부해와서 딕셔너리 개념과 약간 유사하다고 느꼈다.
비 구조화 할당(구조 분해)
말 그대로 객체의 구조를 분해해서 할당할 수 있다는 것이다. 간단한 예시를 먼저 보자
const object = { a : 1};
const { a,b = 2} = object;
console.log(a); //1
console.log(b); //2
a,b 값이 정상적으로 입력된 것을 알 수 있다.
const animal ={
name : '멍멍이',
type : '개'
};
const { name : nickname} = animal;
console.log(nickname); //멍멍이
이를 활용하여 이름도 바꿀 수 있는데, nickname을 조회해도 멍멍이가 나오는것을 알 수있다.
주의할 점은 이렇게 한다고 animal의 구조가 바뀌는건 아니란 것이다.
const deepObject = {
state: {
information: {
name: "velopert",
languages: ["korean", "english", "chinese"]
}
},
value: 5
};
const { name, languages } = deepObject.state.information;
const { value } = deepObject;
const extracted = {
name,
languages,
value
};
console.log(extracted);
깊은 곳에서 따올때는 위처럼 비구조화 할당을 여러번해도 되지만
const deepObject = {
state: {
information: {
name: "velopert",
languages: ["korean", "english", "chinese"]
}
},
value: 5
};
const {
state:{
information:{
name,languages:[firstLang,secondLang]
}
},
value
} = deepObject
const extracted = {
name,
firstLang,secondLang,
value
};
console.log(extracted);
위 코드처럼 비구조화 할당 한번에 할수도 있다. 하지만 오히려 이경우 한번에 비구조화 할당을 하는것이 더 지저분한 느낌이 든다.. 그때그때 조금 더 깔끔해 보이는 것으로 하면 될 것 같다.
배열 비구조화 할당
배열에도 비구조화 할당을 적용할 수 있다.
const array = [1];
const [one,two =2] = array;
console.log(one); //1
console.log(two); //2
console.log(array) //[1]
사용하는건 객체와 비슷하다.
spread
객체 혹은 배열을 펼칠 수 있다.
...을 사용한다.
const slime = {
name: "슬라임"
};
const cuteslime = {
...slime,
attribute: "cute"
};
const purplecuteslime = {
...cuteslime,
color: "purple"
};
console.log(slime);
//{name: "슬라임"}
console.log(cuteslime);
// {name: "슬라임", attribute: "cute"}
console.log(purplecuteslime);
//{name: "슬라임", attribute: "cute", color: "purple"}
만약
const purplecuteslime = cuteslime;
purplecuteslime.color = 'purple';
위처럼 purple을 넣어주게 되면 결국 purplecuteslime과 cuteslime이 가르키는 객체가 같아져서 두 객체 모두에 purple이 추가되게 된다.
rest
객체,배열,함수의 파라미터에서 사용할 수 있다.
해당 객체에서 남는부분을 빼오게 된다.
const purplecuteslime = {
name : '슬라임',
attribute : 'cute',
color: "purple"
};
const {color, ...cuteslime} = purplecuteslime;
console.log(color);//purple
console.log(cuteslime);
//{name: "슬라임", attribute: "cute"}
const {attribute, ...slime} = cuteslime;
console.log(slime)
//{name: "슬라임"}
spread와 약간 반대의 개념이라 생각할 수도 있을것 같다.
배열에서도 사용할 수 있다.
const numbers = [0, 1, 2, 3, 4, 5, 6];
const [one, two, ...rest] = numbers;
console.log(one); //0
console.log(two); //1
console.log(rest); //[2, 3, 4, 5, 6]
물론 함수에서도 사용할 수 있다. 함수의 인자가 정해지지 않은 경우에 유효하며 이전 글에서의 reduce내장함수를 곁들이면 조금 더 이쁜 코드를 작성할 수 있다.
function sum(...rest) {
return rest.reduce((acc,cur) => acc + cur,0);
}
console.log(sum(1,2,3,4,5,6,7,8)) //36
const numbers = [1,2,3,4,5,6,7,8];
console.log(sum(...numbers))
2번재 코드블럭처럼 넣어줄 수도 있다.
scope
global scope, 함수형 scope등이 있다.
프로그래밍 언어지식이 어느정도 있다면 전역변수와 지역변수 개념이라고 생각하면 될 것 같다.
const value = "hello";
function myFunction() {
console.log("my Functions : ");
console.log(value);
}
function otherFunction() {
console.log("otherFunction : ");
const value = "bye";
console.log(value);
}
myFunction();
otherFunction();
console.log("global scope :", value);
즉, 함수 안에서 설정한 값은 그 안에서만 유효하다.
단 헷갈릴 수 있는 개념이 있는데, var는 함수단위로, let은 블록 단위로 유효성이 존재하게 된다. 그렇기 때문에 var보단 let이 사용이 더 권장된다. 이전에 다루었던 hoisting과도 연관되어 있다.
'FrontEnd > JavaScript' 카테고리의 다른 글
14_리액트_클래스형 컴포넌트 (0) | 2021.12.24 |
---|---|
08_HTML과 JS연동하기 (0) | 2021.12.20 |
06_JS_배열 내장함수 (0) | 2021.12.18 |
05_promise,Async-Await (0) | 2021.12.05 |
04_JS_클래스 (0) | 2021.12.03 |