프로그래밍과 데이터 in JavaScript

프로그래밍과 데이터 in JavaScript

해당 내용은 코드잇의 '프로그래밍과 데이터 in JavaScript' 를 보고 정리한 내용입니다.
문제가 될 시 삭제하겠습니다.

01. 객체

01. 객체와 프로퍼티

  • 객체는 {} 로 만들 수 있음
  • property name 작성 시 따옴표로 감싸지 않을 수 있지만, 그러려면 아래의 조건을 만족해야 함
    • 첫번째는 글자는 반드시 문자, 밑줄(_), 달러기호($) 중 하나로 시작해야 함
    • 띄어쓰기 금지
    • 하이픈(-) 금지
{
    키 : value,
  property name : property value
}

03. 객체에서 데이터 접근하기


let codeit = {
    name: '코드잇',
    'born Year': 2017,
    isVeryNice : true,
    wortCourse: null,
    bestCourse: {
        title: '자바스크립트',
        language: 'JavaScript'
    }
};
  1. 점표기법으로 접근
    • property name 에 띄어쓰기가 있거나 하이픈(-) 이 있는 경우 사용할 수 없음
console.log(codeit.bornYear);
  1. 대괄호 표기법
console.log(codeit['born Year']);
console.log(codeit['born'+' Year']);

let propertyName = 'name';
console.log(codeit[propertyName]);
  1. 객체 안의 객체 접근
    • 존재하지 않은 property 에 접근하려고 하면 undefined가 출력됨
console.log(codeit.bestCourse['title']);

05. 객체 다루기


let codeit = {
    name: '코드잇',
    bornYear: 2017,
    isVeryNice : true,
    wortCourse: null,
    bestCourse: {
        title: '자바스크립트',
        language: 'JavaScript'
    }
};

codeit.name = 'codeit'; // 변경
codeit.ceo = '강영훈'; // 새로운 property 추가
delete codeit.worstCourse; // 삭제

// property 가 있는지 확인
console.log(codeit.name !== undefined);
console.log('name' in codeit);

07. 객체와 메소드

let greetings = {
    width:30,
    height:50,
    sayHello: function (name) {
        console.log(`Hello! ${name}! `);
    },
    sayHi: function () {
        console.log('Hi!');
    },
    sayBye: function () {
        console.log('Bye!');
    }
};

greetings.sayHello('minimi');
greetings['sayHello']('minimi');

09. for ... in 반복문


for (변수 in 객체) {
    동작부분
}
let codeit = {
    name: '코드잇',
    bornYear: 2017,
    isVeryNice : true,
    wortCourse: null,
    bestCourse: {
        title: '자바스크립트',
        language: 'JavaScript'
    }
};

for (let key in codeit) {
    console.log(key);
    console.log(codeit[key]);
}
  • 주의사항 : 객체의 key 를 for문으로 출력 시, 순서대로 출력되는 것이 아님
let myObject = {
  '3': '정수3',
  name: 'codeit',
  '1': '정수1',
  birthDay: '2017.5.17',
  '2': '정수2',
};

for (let key in myObject) {
  console.log(key);
}
1
2
3
name
birthDay

12. Date 객체

내장객체 : 자바스크립트가 미리 가지고 있는 객체

// Date
let today = new Date(); // Date.now()

// new Date(milliseconds)
let myDate = new Date(1000); // 1970년 1월 1일 00:00:00 UTC + 1초

// new Date('YYYY-MM_DD')
let myDate = new Date('2017-05-18'); // 1970년 1월 1일 00:00:00 UTC + 1초

// month 는 0부터 시작
// new Date('YYYY-MM_DDThh:mm:ss')
// new Date(YYYY, MM, DD, hh, mm, ss, ms); //YYYY, MM만 필수요소

let myDate = new Date(2017, 4, 18, 19, 11, 16);

// myDate 객체가 1970년 1월 1일 00:00:00 UTC 부터 몇밀리초 지났는지
console.log(myDate.getTime()); 

let timeDiff = myDate.getTime() - today.getTime();
console.log(timeDiff / 1000 / 60 + '분');
console.log(timeDiff / 1000 / 60 /60 + '시간');
  • 시간 차이 구하기
let myDate1 = new Date(2017, 4, 18);
let myDate2 = new Date(2017, 4, 19);

let timeDiff = myDate2 - myDate1;
console.log(timeDiff); // 86400000 (ms)
console.log(timeDiff / 1000); // 86400 (sec)
console.log(timeDiff / 1000 / 60) // 1440 (min)
console.log(timeDiff / 1000 / 60 / 60) // 24 (hour)
console.log(timeDiff / 1000 / 60 / 60 / 24) // 1 (date)

02. 배열

01. 배열

  • 배열은 객체와 다르게 순서대로 출력됨
let courseRanking = [
    '1',
    '2',
    '3',
    '4'
];

// indexing (0 ~ ... )
console.log(배열이름[index]);
console.log(courseRanking [0]);

03. 배열 다루기

let members = ['a', 'b', 'c'];

// 몇개의 요소가 들어있는지
console.log(members.length);     // 3
console.log(members['length']);  // 3

// 요소 추가하기
console.log(members[4]); // undefined
members[4] = 'nice';
console.log(members.length);     // 4

// 요소 삭제하기

05. 배열 메소드 1

let members = ['a', 'b', 'c', 'd', 'e'];

// splice(시작 index(0부터 시작), deleteCount, item(값추가))
members.splice(1, 1, 'NiceCodeit', 'HiCodeit'); 
// ['a', 'NiceCodeit', 'HiCodeit', 'c', 'd', 'e']

// 배열 특정 위치에 추가만 하고 싶은 경우 
members.splice(1, 0, 'NiceCodeit', 'HiCodeit'); 
// ['a', 'NiceCodeit', 'HiCodeit', 'b', 'c', 'd', 'e']

// 값을 대체하고 싶은 경우 
members.splice(2, 1, 'NiceCodeit'); 
// ['a', 'b', 'NiceCodeit', 'd', 'e']

// 배열의 첫 요소를 삭제 
members.splice(0, 1);

// 배열의 마지막 요소를 삭제 
members.splice(members.length -1, 1);

// 배열의 첫 요소로 값 추가
members.splice(0, 0, 'NiceCodeit');

// 배열의 마지막 요소로 값 추가 
members.splice(members.length, 0, 'HiCodeit');
// 반복문을 활용해서 numbers 배열의 요소들 중 홀수를 모두 삭제해 주세요.
numbers = [1, 2, 3, 5, 8, 9];

for (let i=0; i < numbers.length; i ++){
  if (numbers[i] % 2 == 1 ){
    numbers.splice(i,1)
    i --;
  } 
}

07. 배열 메소드2

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array


members = [1, 2, 3, 4, 5, 6];

// 배열의 첫 요소를 삭제: shift()
members.shift();
console.log(members); // [2, 3, 4, 5, 6]

// 배열의 마지막 요소를 삭제: pop()
members.pop();
console.log(members); // [2, 3, 4, 5]

// 배열의 첫 요소로 값 추가: unshift(value)
members.unshift('Nice');
console.log(members); // ['Nice', 2, 3, 4, 5]

// 배열의 마지막 요소로 값 추가: push(value)
members.push('Hi');
console.log(members); // ['Nice', 2, 3, 4, 5, 'Hi']
  • 배열에서 특정 값이 있는지 확인 : array.indexOf(item)
    • 포함되어 있다면 item 이 있는 index return
    • 포함되어 있지 않다면 -1 return
    • 여러번 포함되어 있으면, 처음 발견된 인덱스 return
    • 뒤에서 부터 탐색하려면 array.lastIndexOf(item)
let brands = ['Google', 'Kakao', 'Naver', 'Kakao'];
console.log(brands.indexOf('Kakao')); // 1
console.log(brands.indexOf('Daum')); // -1
  • 배열에서 특정 값이 있는지 확인 : array.includes(item)
    • array에 item이 있을 경우 true를, 없을 경우 false를 return
    • let brands = ['Google', 'Kakao', 'Naver', 'Kakao']; console.log(brands.includes('Kakao')); // true console.log(brands.includes('Daum')); // false
  • 배열 뒤집기 (reverse)
let brands = ['Google', 'Kakao', 'Naver', 'Kakao'];

console.log(brands);
brands.reverse(); // ['Google', 'Kakao', 'Naver', 'Kakao']

console.log(brands); // ['Kakao', 'Naver', 'Kakao', 'Google']

10. for ... of 반복문

  • for ... in 과 다른 점은 배열을 돌린다는 점, 배열에는 활용하지 않는 것이 좋음

for ( 변수 of 배열 ) {
    동작부분;
}

for (변수 in 객체) {
    동작부분
}

for (let element of influencer) {
    console.log(element);
}

12. 다차원 배열

// 다차원 배열 
let twoDimensional = [[1, 2], [3, 4]];

console.log(twoDimensional[0][1]) // 2

03. 자료형 심화

01. 다양한 숫자 표기법

// 숫자 표기법
let millionaire = 1000000000;
let myNumber = 1e9; // 지수표기법

console.log(millionaire === myNumber); // true

// 16진법 (Hexadecimal)
let hex1 = 0xff; // 255
let hex2 = 0xFF; // 255

// 8진법 (Octal)
let octal = 0o377; // 255

// 2진법 (binary numeral system)
let binary = 0b11111111; // 25

02. 숫자형 메소드

let myNumber = 0.3591;

// toFixed(0 ~ 100)
console.log(myNumber.toFixed(3));  // 0.359
console.log(myNumber.toFixed(7));  // 0.3591000

console.log(typeof myNumber.toFixed(3));  // string
console.log(typeof +myNumber.toFixed(3));  // Number

// toString(2 ~ 36) 
console.log(myNumber.toString(2)); // 2진법 숫자로 변환
console.log(myNumber.toString(8)); // 8진법 숫자로 변환
console.log(myNumber.toString(16)); // 16진법 숫자로 변환
let myNumber = 255;

console.log(255..toString(2)); // 숫자를 그냥 쓰면 에러가 나서 .. 을 붙임 
console.log((255).toString(2)); // 숫자 양옆에 괄호를 붙이면 에러가 안남
console.log(myNumber.toString(2));

04. Math 객체

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math

Math.abs(x) // 절대값
Math.max(2,-1) // 최대값 2
Math.min(2,-1) // 최솟값 -1
Math.pow(2,3) // 거듭제곱 8
Math.sqrt(25) // 제곱근 5
Math.round(2.3) // 반올림 2
Math.floor(2.4) // 버림 2
Math.ceil(2.4) // 올림 3
Math.random()

05. 바보 자바스크립트?

  • 0.1+0.2 를 0.3이라고 계산 못하는 멍충이
let sum = 0.1 + 0.2; // 0.3000000000000000000004

// 올바르게 계산되도록 하기 위해서 아래와 같이 사용함
console.log(+sum.toFixed(1)); // 0.3
console.log(Math.round(sum * 10) / 10);  // 0.3

07. 문자열 심화

// String
let myString = 'Hi Codeit';

// 요소탐색
console.log(myString.indexOf('i')); // 1 앞 부터 
console.log(myString.lastIndexOf('i')); // 7 뒤 부터

// 요소 접근
console.log(myString[3]); // C 대괄호 표기법 
console.log(myString.charAt(3)); // C charAt 메소드

// 문자열 길이 
console.log(myString.length); // 9

// 대소문자 변환
console.log(myString.toUpperCase());
console.log((myString.toLowerCase());

// 양 끝 공백 제거
console.log(myString.trim());

// 부분문자열 접근 slice(start, end) 끝 인덱스 바로 직전까지의 index를 가져옴
// end 생략 시 문자열 끝까지
console.log(myString.slice(0, 2));
console.log(myString.slice(3));
console.log(myString.slice());

10. 기본형과 참조형

기본형 : Number, String, Boolean, Null, Undefined

참조형 : Object (list도 Object)

12. 참조형 복사하기

let numbers1 = [1, 2, 3]
let numbers2 = numbers1;

numbers2.push(4);

console.log(numbers1); // [1, 2, 3, 4]
console.log(numbers2); // [1, 2, 3, 4]

let course1 = {
    title: '미니미 기초',
    language: '파이썬'
};

// 객체를 복사하는 방법
let course2 = Object.assign({}, course1);

course2.title = '알고리즘';

console.log(course1);
console.log(course2);
// 참조형 복사하기
function cloneObject(object) {
    let temp = {};

    for (let key in object) {
        temp[key] = object[key];
    }
    return temp;
};

let course1 = {
    title : '파이썬 기초',
    language: '파이썬'
    pre : []
}

let course2 = cloneObject(course1);
course2.pre.push('파이썬2'); // 객체이기 때문에 course 1,2 에 다들어가도록 됨
// 그러므로 아래와 같이 코드를 변경해줌 
function cloneObject(object) {
    if (object === null || typeof object !== 'object') {
        return object;
    }

    let temp;
    if (Array.isArray(object)) {
        temp = [];
    } else {
        temp = {};
    }

    for (let key of Object.keys(object)) {
        temp[key] = cloneObject(object[key])
    }
    return temp;
};

14. const, 변수와 상수 사이

  • let 으로 선언한 변수는 재할당이 가능함 (변수명은 camelcase로 myName)
  • const 로 선언한 상수는 재할당이 불가능함 (변수명은 대문자로 MY_NAME)
    • 참조형 객체나 배열의 경우에는 값이 변할 수 있음
    • 재할당 시 에러가 발생함

16. 변수, 그땐 그랬지

  • var 키워드로 선언한 변수의 첫 번째 문제는, let과 const와는 다르게 중복 선언이 가능하다는 것
  • 똑같은 이름으로 변수를 한 번 더 선언하게 되면 에러가 발생하는 것이 아니라 그냥 기존의 변수를 덮어써 버림
  • var는 Scope가 자칫 전역변수 역할을 하게 될 수 있음
    let과 const 키워드로 선언한 변수는 if, for, function 등등 어떤 키워드와 관계없이 코드 블록, 즉 {} 중괄호로 감싸진 부분을 기준으로 scope를 갖게 되지만,
    var 키워드로 선언한 변수는 scope가 function에서만 구분되어 있음
    let이나 const 키워드의 경우에는 중괄호로 감싸진 경우라면 모두 중괄호 밖에서는 지역 변수에 접근할 수 없음
    하지만 var 변수는 지역변수의 구분이 함수에만 있기 때문에 if, for, while, switch 등 다양한 상황에서 선언한 변수가 자칫, 전역변수의 역할을 하게 될 수 있음
  • let과 const는 선언되기 이전에 사용할 수 없지만 var 는 함수 스코프를 기준으로 선언되기 이전에도 변수에 접근이 가능함
  • 끌어올림 (Hoisting)
console.log(myVariable);
let myVariable;
Uncaught ReferenceError: Cannot access 'myVariable' before initialization
console.log(myVariable);
var myVariable;

undefined

변수의 선언이 끌려 올라가서 마치, 2번째 줄과 첫 번째 줄이 바뀐 것처럼 동작함

var myVariable;
console.log(myVariable);

이렇게 변수가 끌어올려 지는 현상을 '호이스팅(hoisting)'이라고 부름
호이스팅은 선언과 동시에 값을 할당하더라도, 선언문만 올려지기 때문에 값은 그대로 두 번째 줄에 남아있는 데요.

console.log(myVariable);
var myVariable = 2;
console.log(myVariable);
undefined
2

하지만 이런 식으로 동작하는 방식은 코드의 흐름을 방해하기에 충분해 보이죠? 한 가지 주의해야 될 부분은, 함수를 선언할 때도 이 호이스팅이 적용됨

sayHi();

function sayHi() {
  console.log('hi');
}

이렇게 코드를 작성하더라도 실행해보면,

hi

당연한 듯 함수가 잘 실행되는 모습을 확인할 수 있음

이런 현상은 함수를 한 번 선언하고 나면 어디서든 유연하게 사용할 수 있다는 장점이 있지만, 코드의 흐름에는 부정적인 영향을 끼칠 수 있습니다. 그래서 함수를 선언할 떄는 가급적 코드 윗부분에 선언하거나, 호출을 항상 아래쪽에서 한다거나 나름대로 규칙을 세워서 코드를 작성하시기를 권장함

댓글

Designed by JB FACTORY