객체 초기자

|

객체 초기자

객체 초기자와 비구조화 할당

내가 한 질문

const {name,email,password} = req.body;
 ​ ​
let user = await User.findOne({email}); ​

위의 코드에서 왜 {} 중괄호를 써준것인지 이해가 잘 안가는데요.. es6문법과 관련이 있을까요? ​
헷갈리는게.. 위에서
const {name,email,password} = req.body; 로 가져와줬기때문에 중괄호없이 바로
let user = await User.findOne(email); 이렇게 해줘도 괜찮지 않을까요?

답변

서버 질문이 아니라 자바스크립트 문법 질문으로 보이는군요

1.
const {name,email,password} = req.body;
이 부분은
ES6(EcmaScript 6th) 문법 중 Destructuring Assignment(구조분해할당, 비구조화할당)라고 합니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment


2.
let user = await User.findOne({email});
이 문장에서 {email} 때문에 말씀하시는거면 객체 초기자이며, ES6부터 간결하게 표현이 가능해졌습니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Object_initializer

{ email: email }이라고 한 것과 같습니다.

재질문

답글 감사합니다.
기재해주신 링크에가서 살펴보니
"0개 이상인 객체 속성명 및 관련값 쌍 목록이 콤마로 분리되어 중괄호({})로 묶인 형태입니다."
라고되있는데, const {name,email,password} = req.body; 이 코드안의 name,email,password또한 객체이니깐 {}중괄호로 객체 초기를 명시해준거라고 이해했는데 맞을까요?

재답변

'객체'가 아니라 '객체 속성명'이라고 적혀있지요

req.body는 { name: 'james', email: 'hello@naver.com', password: 'foobar' }
이런 형태로 돼있을겁니다. req.body는 name, email, password라는 속성을 갖고있지요.

구조분해할당을 이용하면 각각 같은 이름의 변수로 할당해줄 수 있는겁니다.

const { name, email, password } = { name: 'james', email: 'hello@naver.com', password: 'foobar' };
라고 하면
name, email, password라는 변수가 선언되면서, name이란 변수가 'james' 라는 값을, email이란 변수가 'hello@naver.com'이라는 값을, password란 변수가 'foobar'란 값을 갖게 되지요.