참고
- https://poiemaweb.com/js-object
- https://soeunlee.medium.com/javascript%EC%97%90%EC%84%9C-%EC%99%9C-%ED%95%A8%EC%88%98%EA%B0%80-1%EA%B8%89-%EA%B0%9D%EC%B2%B4%EC%9D%BC%EA%B9%8C%EC%9A%94-cc6bd2a9ecac
- https://velog.io/@reveloper-1311/%EC%9D%BC%EA%B8%89-%EA%B0%9D%EC%B2%B4First-Class-Object%EB%9E%80

객체

- 키(key)값(value)으로 구성된 프로퍼티(property)들의 집합

- 자바스크립트의 함수는 일급 객체이므로 값으로 취급할 수 있다.

- 즉 프로퍼티 값으로 함수를 사용할 수 있고 프로퍼티 값이 함수일 경우 일반 함수와 구분하기 위해 메소드라고 부른다.

- 객체는 데이터를 의미하는 프로퍼티(property)와 데이터를 참조하고 조작할 수 있는 동작을 의미하는 메소드(method)로 구성된 집합이다.

 

일급 객체

다른 객체에서 연산(인자로 전달, 결과값으로 리턴, 변수에 할당)을 할수 있도록 지원하는 객체 

 

(조건)

1) 다른 객체에서 인자로 전달할 수 있다.

    var a = function(num) {
        return num
    }
    
    function add(number) {
        var sum = number+number;
        console.log(sum); // 6
    }
    
    add(a(3)) // a(num)함수를 add(number)함수의 인자로 사용

2. 변수에 할당할 수 있다.

    var a = function(num) {
        console.log(num)
    }

3. 다른 함수의 결과로 리턴될 수 있다.

    function add(numA) {
        return function (numB) {
            return numA + numB;
        }
    }
    console.log(add(2)(3)); // 5

 

객체 생성 방법

1. 객체 리터럴

- 중괄호({})를 사용하여 {}내에 프로퍼티를 추가해서 객체를 생성할 수 있고 {}내에 아무것도 기술하지 않으면 빈 객체가 생성된다. 

    var me = {
        name : 'Kim',
        age : 25,
        introduce : function() {
            console.log("my name is " + this.name);
        }
    }
    
    me.introduce() // my name is Kim

2. 생성자 함수

- 프로퍼티가 동일한 객체를 여러개 쉽게 생성할 수 있다.

- 생성자 함수 이름은 보통 대문자로 시작한다.(생성자 함수임을 표현하기 위해)

- 프로퍼티 or 메소드명 앞에 기술한 this는 생성자 함수가 만들 인스턴스(instance)를 가리킨다.

- this에 연결(바인딩)되어 있는 프로퍼티 및 메소드는 public(외부에서 참조 가능)하다.

- 생성자 함수 내에서 선언한 변수는 private(외부에서 참조 불가능)하다.(즉 생성자 함수 내부에서는 접근이 가능하나 외부에서는 접근 불가능)

    function student(name, age) {
        var check = true;
        this.name = name;
        this.age = age;
        console.log(check); // true
    }
    
    var a = new student('Kim', 25);
    console.log(a) // { name: 'Kim', age: 25 }
    console.log(a.check) // undefined

 

객체 프로퍼티 접근

1. 프로퍼티 키

- 프로퍼티 키는 문자열로 지정한다.

- 문자열 타입의 값으로 수렴하는 표현식도 가능하다.(단 따옴표('' or "")를 사용해야함)

- 자바스크립트에서 사용 가능한 이름인 경우 따옴표를 생략할 수 있지만 유효하지 않을 경우 반드시 따옴표를 사용해야한다.

    var like = {
        food-name : 'ramen', // 불가능  이유:SyntaxError: Unexpected token '-'
        'food-name' : 'ramen', // 가능
        
        food_name : 'rice', // 가능
    }

2. 프로퍼티 값 읽기

- 객체의 프로퍼티 값 접근 방법은 마침표(.) 표기법 과 대괄호[] 표기법이 있다.

- 프로퍼티 키가 유효한 자바스크립트 이름이고 예약어가 아닌 경우 (마침표, 대괄호)표기법 모두 사용 가능하다.

- 프로퍼티 키가 유효하지 않은 자바스크립트 이름이거나 예약어인 경우 대괄호 표기법으로 읽어야 하고

대괄호 내에 들어가는 프로퍼티 이름은 반드시 문자열이어야 한다.

var person = {
  'first-name': 'Ung-mo',
  'last-name': 'Lee',
  gender: 'male',
  1: 10
};

console.log(person);

console.log(person.first-name);    // NaN: undefined-undefined
console.log(person[first-name]);   // ReferenceError: first is not defined
console.log(person['first-name']); // 'Ung-mo'

console.log(person.gender);    // 'male'
console.log(person[gender]);   // ReferenceError: gender is not defined
console.log(person['gender']); // 'male'

console.log(person['1']); // 10
console.log(person[1]);   // 10 : person[1] -> person['1']
console.log(person.1);    // SyntaxError

3. 프로퍼티 삭제

- delete 연산자를 사용하면 객체의 프로퍼티를 삭제할 수 있다.(피연산자는 프로퍼티 키)

    var me = {
        name : 'Kim',
        age : 25,
    }
    
    console.log(me.age) // 25
    delete me.age;
    console.log(me.age) // undefined

4. for-in 문

- 객체에 포함된 모든 프로퍼티에 대해 루프를 수행할 수 있다.

- 단 for-in문은 배열에는 사용하지 않는 것이 좋다

  • 배열은 순서를 보장하는 데이터 구조이지만 for-in문은 순서를 보장하지 않기 때문
  • 배열 요소만을 순회하지 않는다.
var array = ['one', 'two'];
array.name = 'my array';

for (var index in array) {
  console.log(index + ': ' + array[index]);
}

/*
0: one
1: two
name: my array
*/

'Javascript' 카테고리의 다른 글

[Javascript] 함수(function)  (0) 2021.06.30
[Javascript] 객체와 변경불가성(Immutability)  (0) 2021.06.22
[Javascript] 데이터 타입  (0) 2021.06.18
자잘한 용어 정리  (0) 2021.06.09
[Javascript] var, let, const 차이점  (0) 2021.02.15
식별자 : 변수, 배열, 함수 등에 지정된 이름(ex - var str = "hi")
변수 : 값이 저장된 메모리 공간의 주소를 가리키는 식별자

데이터 타입

- 데이터 타입은 프로그래밍 언어에서 사용할 수 있는 데이터(숫자, 문자열, 객체)의 종류를 말한다.

- 데이터 타입은 크게 기본형(원시타입)과 참조형(객체타입)이 있다.

- 자바스크립트는 동적 타입 언어이다. 값이 할당되는 과정에서 자동으로 변수의 타입이 결정 된다.

원시 타입

- boolean, null, undefined, number, string, symbol이 있다.

- 원시 타입은 변경 불가능한 값이다. 

- pass-by-value(값에 의한 전달)

변경 불가능한 값(메모리 영역에서 값 변경이 불가능하다는 뜻)

var str = "hi";
str = "bye";

첫번째 줄에서 문자열 hi가 생성되고 str은 hi 메모리 주소를 가리킨다.
두번째 줄에서 문자열 bye가 생성되고 str은 bye 메모리 주소를 가리킨다.


첫번째 줄에서 hi 문자열이 생성된 메모리의 값이 bye로 바뀌는것이 아니라
str이 hi 메모리 주소에서 bye 메모리 주소로 가리키는 주소가 바뀌는 것이다.

객체 타입

- 원시 타입을 제외한 나머지 값들(배열, 함수, 정규표현식)은 모두 객체(object)이다.

- 객체 타입은 변경 가능한 값이다.

- pass-by-reference(참조에 의한 전달)

 

call by value vs call by reference

평가전략
프로그래밍 언어에서 함수 호출의 인자(Argument)의 순서를 언제 결정하고
함수에 어떤 종류의 값을 보낼지 결정하는 것
ex) Call by- , Pass-by-

"Call"은 함수를 "호출"할 때 사용하는 동사
"Pass"는 인자를 "전달"한다는 의미를 나타내는 동사

 

call by value

1. 함수에 인자(Argument)로 값이 넘어온다.

2. 값이 넘어올 때 복사된 값이 넘어온다.

2. 넘어온 인자 값을 재할당, 연산 등을 하더라도 인자는 영향을 받지 않는다.

    var num = 1
    
    function value(a) {
        a += 1;
        return a
    }
    
    console.log(value(num)) // 2
    console.log(num) // 1

- 원시 타입의 값을 Argument로 넘겨주게되면 call by value의 형태로 작동한다.

  함수에 인자로 값을 넘겨줄 때 복사된 값을 넘겨주고

  이때 (인자:num, 인수:a)는 다른 메모리 공간을 차지하게 되어 변수 num에는 아무런 영향이 없다. 

 

call by reference

1. 인자(Argument)로 참조(값에 대한 참조 주소, 메모리 주소를 담고있는 변수)를 넘겨준다.

2. 참조 주소를 넘기다 보니 해당 참조값을 복사하지는 않는다.

3. 참조값을 복사해서 넘기지 않고 참조 주소를 넘기기 때문에 인자(Argument)는 연산 및 재할당에 영향을 받는다.

    var person = { name:"Kim" };
    
    function reference(str) {
        str.name = "Lee";
        return str
    }
    
    console.log(person); // { name: 'Kim' }
    reference(person);
    console.log(person); // { name: 'Lee' }​

  - 참조값을 Argument로 넘겨주게되면 call by reference의 형태로 작동한다.

  함수에 인자로 값을 넘겨줄 때 복사된 값이 아닌 참조 주소를 넘겨주고

  이때 (인자:person, 인수:str)는 같은 메모리 공간을 가리키게 되어 변수 person에 값이 함수의 동작에 의해 변한다.

undefined vs null

공통점
- 둘다 '없음'을 나타내는 값

차이점
undefined : 개발자가 의도적으로 할당한 값이 아닌 자바스크립트 엔진에 의해 초기화된 값
null : 개발자가 의도적으로 변수에 값이 없다는 것을 명시한 값

동적 타이핑(Dynamic Typing)

- 자바스크립트는 동적 타입 언어이다.

- 변수의 타입을 지정하지 않고 값을 할당하는 과정에서 값의 타입이 자동으로 결정된다는 의미로 이를 동적 타이핑이라 한다.

    var a;
    console.log(typeof a); // undefined
    
    a = 5;
    console.log(typeof a); // number
    
    a = 'str'
    console.log(typeof a); // string
    
    a = [1,2,3];
    console.log(typeof a); // object
    
    a = true;
    console.log(typeof a); // boolean

var 키워드의 문제점

1. 함수 레벨 스코프

  • 전역 변수로 남발될 수 있다.
  • 반복문 내부 초기화식에서 사용된 변수를 반복문 외부 또는 전역에서 사용할 수 있다.

2. 중복 선언 가능

  • 위에서 할당한 변수값을 실수로 밑에서 값을 변경할 수 있다.

3. 변수 호이스팅

  • 변수를 선언하기 이전에 상단에서 사용할 수 있다.

'Javascript' 카테고리의 다른 글

[Javascript] 객체와 변경불가성(Immutability)  (0) 2021.06.22
[Javascript] 객체  (0) 2021.06.21
자잘한 용어 정리  (0) 2021.06.09
[Javascript] var, let, const 차이점  (0) 2021.02.15
클로저(개념정리X)  (0) 2020.06.30

연산 - 주어진 식을 계산하여 결과를 얻어내는 과정

연산자(operator) - 연산을 수행하는 기호(%, +, -, /, *)등등

피연산자 - 연산자의 작업 대상(변수)

 

프로그래밍 - 시간의 순서에 따라서 일어나야 하는 일을 컴퓨터에게 알려주는 일

 

변수 - 변경 가능한 데이터가 담길 수 있는 공간

식별자 - 변수, 배열, 함수 등에 지정된 이름

 

인수(Parameter), 인자(Argument) 

function solve(a, b) {	<-- 인수(Parameter)
	return a+b;
}
solve(3,4) <-- 인자(Argument)

(a, b) 인수(Parameter)
(3,4) 인자(Argument)

 

'Javascript' 카테고리의 다른 글

[Javascript] 객체와 변경불가성(Immutability)  (0) 2021.06.22
[Javascript] 객체  (0) 2021.06.21
[Javascript] 데이터 타입  (0) 2021.06.18
[Javascript] var, let, const 차이점  (0) 2021.02.15
클로저(개념정리X)  (0) 2020.06.30
변수 var let const
변수 재선언 O X X
값 재할당 O O X

변수 재선언

var a = 'var';
let b = 'let';
const c = 'const';

var a = 'var 재선언'; // O
let b = 'let 재선언'; // X
const c = 'const 재선언'; // X

console.log(a); // var 재선언
console.log(b); // SyntaxError: Identifier 'b' has already been declared
console.log(c); // SyntaxError: Identifier 'c' has already been declared

변수 재할당

var a = 'var';
let b = 'let';
const c = 'const';

a = 'var 재할당'; // O
b = 'let 재할당'; // O
c = 'const 재할당'; // X

console.log(a); // var 재할당
console.log(b); // let 재할당
console.log(c); // TypeError: Assignment to constant variable.

'Javascript' 카테고리의 다른 글

[Javascript] 객체와 변경불가성(Immutability)  (0) 2021.06.22
[Javascript] 객체  (0) 2021.06.21
[Javascript] 데이터 타입  (0) 2021.06.18
자잘한 용어 정리  (0) 2021.06.09
클로저(개념정리X)  (0) 2020.06.30

 

var game = '리그오브레전드'

function login(id, pass) {
  var id = id
  var passWord = pass

  if(passWord == '몰라 알려줘') {
    findPassWord()
  } else {
    console.log('환영합니다') // 1 (로그인 성공시)
  }

  function findPassWord() {
    var findPassWord = '123123'
    console.log(`${game} '${id}'회원님의 비밀번호는 '${passWord}'가 아니라 ${findPassWord}입니다`) // 1 (로그인 실패시)
  }
  console.log('내가 입력한 id, pass 값') // 2
  console.log(id) // 3
  console.log(passWord) // 4
}
// 로그인 성공시
login('데프트', '123123')

// 1 - 환영합니다
// 2 - 내가 입력한 id, pass 값
// 3 - 데프트
// 4 - 123123

// 비밀번호를 모를시
login('데프트', '몰라 알려줘')

// 1 - 리그오브레전드 '데프트'회원님의 비밀번호는 '몰라 알려줘'가 아니라 123123 입니다
// 2 - 내가 입력한 id, pass 값
// 3 - 데프트
// 4 - 몰라 알려줘

스코프 데이터 접근

(데이터 상황)

(전역)
var game = '리그오브레전드'

(login함수)
var id = '데프트'
var passWord = '몰라 알려줘'

(findPassWord함수)
var findPassWord ='123123'

// 접근 할 수있는 변수
(전역)
var game = '리그오브레전드'

(login함수)
var game = '리그오브레전드'
var id = '데프트'
var passWord = '몰라 알려줘'

(findPassWord함수)
var game = '리그오브레전드'
var id = '데프트'
var passWord = '몰라 알려줘'
var findPassWord ='123123'

 

ex) (findPassWord함수)에서 game변수를 출력하려고 한다면

(findPassWord함수) -> (login함수) -> (전역) 순서로 찾는다

1. (findPassWord함수)에서 game 변수가 있는지 찾아보고 없다면

2. (login함수)에서 game 변수를 찾아보고 없다면

3. (전역)에서 game 변수를 찾았다

 

포함 관계는 전역 > login함수 > findPassWord함수 이지만

접근 관계는 반대이다

 

'Javascript' 카테고리의 다른 글

[Javascript] 객체와 변경불가성(Immutability)  (0) 2021.06.22
[Javascript] 객체  (0) 2021.06.21
[Javascript] 데이터 타입  (0) 2021.06.18
자잘한 용어 정리  (0) 2021.06.09
[Javascript] var, let, const 차이점  (0) 2021.02.15

+ Recent posts