[aboutJS] Object

Adela·2020년 8월 7일
0

aboutJS

목록 보기
6/9
post-thumbnail

참고영상: 드림코딩 | 자바스크립트 기초 강의

object

  • primitive type
    변수 하나당 값 하나만 할당 가능
  • 출력함수를 구현한다면?
    각각을 parameter로 전달해야함
const name = 'kim'
const age = 20
print(name, age)
function print(name, age){
  console.log(name)
}

그런데 만약 좀 더 인자가 많아지면??

  • 추가해야 할것들이 많음
  • 관리 어렵고, logical하게 짜기 힘듦

🙋🏻‍♀️ 그래서 object를 사용 !

function print(person){
  console.log(person.name)
  console.log(person.age)
}

const yangwon = {name: 'kim', age: 20}
print(yangwon)

이렇게 한데 묶어 하나의 parameter로 전달 가능

  • 관리가 쉽다.

object 만드는 방법

  • object literal
  • object constructor
const obj1 = {} // object literal
const obj2 = new Object() // object constructor

object는 key, value의 집합체

  • key: 우리가 접근할 수 있는 변수, property
  • value: key가 갖는 값

자바스크립트라서 가능한 미친짓

  • 중간에 추가하기
function print(person){
  console.log(person.name)
  console.log(person.age)
}

const yangwon = {name: 'kim', age: 20}
// 이미 object 정의 끝남
print(yangwon)
yangwon.isStudent = true
console.log(yangwon.isStudent)

뒤늦게 isStudent 추가 가능

👉🏻 바로, 자바스크립트가 Runtime때 type이 정의되기 때문이다.

그러나 유지보수도 어렵고 생각지 못한 에러가 발생할 수 있기 때문에 지양하는 것이 좋음

  • 삭제하기
function print(person){
  console.log(person.name)
  console.log(person.age)
}

const yangwon = {name: 'kim', age: 20}
print(yangwon)
yangwon.isStudent = true
console.log(yangwon.isStudent)

delete yangwon.isStudent
console.log(yangwon.isStudent)

마음이 바뀌어서 삭제하고 싶으면 delete를 사용해 삭제할 수 있다.

object['key']

Computed properties: 계산된 프로퍼티

다음과 같이 값에 접근할 수 있다.

console.log(yangwon.name); // . 을 사용하여 접근
console.log(yangwon['name']) // computed property

📍 key는 반드시 string type이어야 한다.

console.log(yangwon[name])

''를 빼고 실행하면 값이 나오지 않는다.

이 방법으로 자바스크립트 미친짓도 가능하다.

function print(person){
  console.log(person.name)
  console.log(person.age)
}

const yangwon = {name: 'kim', age: 20}
print(yangwon)
yangwon.isStudent = true
console.log(yangwon.isStudent)

delete yangwon.isStudent // 삭제
console.log(yangwon.isStudent)

console.log(yangwon.name); // . 을 사용하여 접근
console.log(yangwon['name'])
yangwon['isStudent'] = true // 다시 true로 만듦
console.log(yangwon.isStudent)

다시 true도 나온다.

🖐🏻 이 두가지 방법은 각각 어떤때 쓰지??

  • . : 코딩하는 그 순간 그 key에 해당하는 값을 받아오고 싶을 때
  • [''] : 정확히 어떤 키가 필요한지 잘 모를때 === runtime에서 결정될 때

예를 들어, key값이 사용자로부터 입력되어지는 값이라 (코딩하고 있는 지금 이 시점에) 정확히 어떤 값이 들어올 지 모른다면

function printVal(obj, key){
    console.log(obj.key)
}

printVal(yangwon, 'name')

.을 사용하면 출력되지 않는다.

function printVal(obj, key){
    // computed property 사용
    console.log(obj[key])
}

printVal(yangwon, 'name')

computed property 형식으로 작성해야 정상 작동한다.

shorthand

const person1 = {name: 'lee', age: 2}
const person2 = {name: 'park', age: 3}
const person3 = {name: 'choi', age: 4}

이렇게 작성하면 번거롭다..
어느 세월에 일일이 작성하나 ㅜㅜ

방법: 함수로 만든다.

const person1 = {name: 'lee', age: 2}
const person2 = {name: 'park', age: 3}
const person3 = {name: 'choi', age: 4}
const person4 = makePerson('jang', 4)

function makePerson(name, age){
    return {name: name, age: age}
}

매우 좋은 방법이다.
자바스크립트에서는 key와 value값이 같다면 생략할 수 있다.

function makePerson(name, age){
    return {name, age}
}

이렇게만 해줘도 생성 가능
person4 를 출력하면?

constructor function

const person1 = {name: 'lee', age: 2}
const person2 = {name: 'park', age: 3}
const person3 = {name: 'choi', age: 4}
const person4 = new Person('jang', 4)

function Person(name, age){
    this.name = name
    this.age = age
}

클래스에서 오브젝트를 만드는 것처러 구현할 수 있음.

const person1 = {name: 'lee', age: 2}
const person2 = {name: 'park', age: 3}
const person3 = {name: 'choi', age: 4}
const person4 = new Person('jang', 4)

function Person(name, age){
  // this = {}
    this.name = name
    this.age = age
  // return this
}

이렇게 생략된 부분을 거쳐 실행되는 것

in

해당 pbject 안에 key가 있는지 없는지 확인

console.log('name' in person1)

name이 있으므로 true가 출력됨
정의하지 않은 key를 실행하면? false가 나옴

for..in, for..of

for..in

for(key in person1){
    console.log(key)
}

person1을 돌때마다 key가 key라는 지역변수에 할당된다.
따라서 모든 key가 출력된다.

for..of

배열과 같은 배열리스트, 즉 순차적으로 iterable한 아이들을 씀

const array = [1, 2, 4, 5]
for(value of array){
    console.log(value)
}

cloning

const user = {name: 'yangwon', age: '20'}
const user2 = user

이렇게 하면 메모리엔 어떤 변화가??

user가 가리키는 ref가 user2에도 동일하게 할당된다.
즉, 똑같은 object를 가리키게 되는 것.

이때 만약 user2의 name을 바꾸면?

const user = {name: 'yangwon', age: '20'}
const user2 = user
user2.name = "coder"
console.log(user)

user의 name도 바뀐다.
왜냐하면 user2가 가리키는 ref의 이름을 바꿨기 때문이다.
동일한 ref를 가지고 있기 때문에 user에게도 영향을 미치게 된다.

🖐🏻 그럼 복제 못해? ㅜㅜ
ㄴㄴ 방법이 있으니 걱정말자.

  • 옛날 방식
const user3 = {}
for(key in user){
    user3[key] = user[key]
}
console.log(user3)

user안에 있는 모든 key들을 돌면서 user3에 그대로 복사하는 방식이다.

  • 요즘 방식
// 1
const user4 = {}
Object.assign(user4, user)
console.log(user4)

// 2
const user4 = Object.assign({}, user)
console.log(user4)
  • 복사할 애: user
  • 복사될 애: user4

이 둘을 Object.assign(user4, user) 하면, user4에 user가 복사되어 반환된다.

위에껀 옛날 방식, 밑에껀 요즘 방식이다.
똑같이 복사되었다.

Object.assign 안에 할당된 두 소스가 섞여 나온다는 것을 알 수 있다.

Object.assign

여러개도 가능하다.

const fruit1 = {color: 'red'}
const fruit2 = {color: 'blue', size:'big'}
const mixed = Object.assign({}, fruit1, fruit2)
console.log(mixed.color)
console.log(mixed.size)

그럼 이렇게 하면 어케 될까?

왜냐하면 뒤에 나온 애가 앞에 있는 애와 property가 똑같다면 값을 덮어쓰기 때문

제일 뒤에 나온 애를 기준으로 나오게 된다.

profile
개발 공부하는 심리학도

0개의 댓글

관련 채용 정보