Javascript 자바스크립트 데이터 개념정리
by 효기’s
객체와 프로퍼티
객체 (object) : 여러 가지 값을 한번에 저장한다.
▶ name: 'hyogi' → 속성 (Property)
property name → name (문자열 string)
property Value → 'hyogi'
▶Property Name 주의 사항
1. 첫 번째 글자는 반드시 문자, 밑줄( _ ), 달러 기호($) 중 하나로 시작
2. 띄어쓰기 금지
3. 하이픈(-) 금지
→ property name에 따옴표 ( ' ) 를 추가하면 숫자도 사용가능 ex) '1stHyogi'
▶Property Value
1. 모든 자료형 사용가능
2. 객제 안에 객체를 넣을 수 있다.
// 객체(Object) let hyogi = { name : 'hyogi', // name은 key, 'hyogi'는 value(값) year: '25', 'mybirth year': 1999, GoodJoob: 'false', SoSo: 'null', greatCourse: { // 객체 안에 객체 title: 'hello World', language: 'Python' } }
객체에서 데이터 접근
// 점 표기법 (ObjectName.propertyName) console.log(hyogi.name); // hyogi console.log(mybirth year); // 불가능 x console.log(hyogi.greatCourse.title); // hello World // 대괄호 표기법 (ObjectName['propertyName']) console.log(hyogi['mybirth year']); // 1999 console.log(hyogi['mybirth' + 'year']); // 1999 console.log(hyogi.greatCourse['title']); // hello World let propertyName = 'hyogi'; console.log(hyogi[propertyName]); // hyogi // 존재하지 않는 property에 접근하면 undefined처리가 됨. (오류 x)
객체 다루기
객체의 프로퍼티 수정방법 (변수의 값을 재할당 방법과 유사)
// 객체(Object) let hyogi = { name : 'hyogi', // name은 key, 'hyogi'는 value(값) year: '25', 'mybirth year': 1999, GoodJoob: 'false', SoSo: 'null', greatCourse: { title: 'hello World', language: 'Python' } } // 객체의 프로퍼티 수정방법 (변수의 값을 재할당 방법과 유사) console.log(hyogi.name); // 수정전 : hyogi hyogi.name = '효기'; console.log(hyogi.name); // 수정후 : 효기 // 객체의 프로퍼티 추가방법 console.log(hyogi.study); // 객체에 존재하지 않는 프로퍼티 undefined 출력 hyogi.study = 'javascript'; console.log(hyogi.study); // javascript // 객체의 프로퍼티 삭제방법 console.log(hyogi.greatCourse); // { title: 'hello World', language: 'Python' } delete hyogi.greatCourse; console.log(hyogi.greatCourse); // undefined // in 연산자 (안전하게 프로퍼티 유무 확인하려면 in 연산자 사용) console.log(hyogi.name !== undefined); // 객체에 프로퍼티 존재 유무 확인 true console.log('name' in hyogi); // true if('year' in hyogi){ // hyogi 객체 안에 'year 프로퍼티 존재 유무 확인 console.log('ok'); // ok } else { console.log('not ok'); }
객체와 메소드
메소드 : 객체의 고유한 동작으로써 함수의 의미를 부여할 수 있다.
// 메소드 (Method) let hyogi = { sayA: function (name) { console.log(`A ${name}!`); }, sayB: function () { console.log('B'); }, sayC: function () { console.log('C'); } }; hyogi.sayA('hyogi'); // A hyogi! hyogi.sayB(); // B hyogi['sayA']('hyogi'); // A hyogi!
for..in 반복문
객체의 프로퍼티를 가지고 반복적인 동작을 한다.
▶주의사항
1. 숫자형 (양수) 프러퍼티 네임
숫자형key값은 문자열(string)이며 대괄호 표기법으로만 접근이 가능하다.
2. 정수형 프로퍼티 네임
정수형 네임을 오름차순으로 먼저 정렬하고 추가 순서대로 정렬하는 특징이 있다.
let hyogi = { name : 'hyogi', // name은 key, 'hyogi'는 value(값) year: '25', 'mybirth year': 1999, GoodJoob: 'false', SoSo: 'null', greatCourse: { title: 'hello World', language: 'Python' } } for (let key in hyogi){ console.log(key); } /* 출력결과 name year mybirth year GoodJoob SoSo greatCourse */ for (let key in hyogi){ console.log(hyogi[key]); } /* 출력결과 name hyogi year 25 mybirth year 1999 GoodJoob false SoSo null greatCourse { title: 'hello World', language: 'Python' } */
Date 객체
▶ month는 0부터 시작
▶틀린 Date객체의 날짜를 수정하면 자동으로 날짜 수정
▶Date.new() 메소드는 이 메소드가 호출된 시점 타임스템프를 반환한다.
// Date let my1Date = new Date(); console.log(my1Date); // 2023-03-22T02:58:35.881Z (오늘시간 출력) //1970년 1월 1일 00:00:00 UTC + 1000밀리초 let my2Date = new Date(1000); console.log(my2Date); // 1970-01-01T00:00:01.000Z // 문자열로 시간을 할당 let my3Date = new Date('2023-03-22'); console.log(my3Date); // 2023-03-22T00:00:00.000Z // 시간 분 초까지 할당 my3Date = new Date('2023-03-22T09:11:12'); console.log(my3Date); // 2023-03-22T00:11:12.000Z // 소괄호 안에 여러 값을 할당 (month는 0부터 시작) let my5Date = new Date(1999, 08, 06, 12, 11, 50, 12); // yyyy, MM, DD, hh, mm, ss, ms console.log(my5Date); // 1999-09-06T03:11:50.012Z // Date.getTime() → 몇밀리초가 지났는지 계산 let my6Date = new Date(1999, 08, 06, 12, 11, 50, 12); // 1970년 1월 1일 00:00:00 UTC 부터 몇 밀리초가 지났는지 console.log(my6Date.getTime()); // 936587510012 (타임스탬프) // 지금으로부터 몇 밀리초, 초, 분, 시간이 차이나는지 계산 let today = new Date(); // 오늘 시간 출력 let timeDiff = my6Date.getTime() - today.getTime(); console.log(timeDiff + '밀리초'); // -742867634694밀리초 console.log(timeDiff / 1000 + '초'); // -742867712.473초 console.log(timeDiff / 1000 / 60 + '분'); // -12381128.541216668분 console.log(timeDiff / 1000 / 60 / 60 + '시간'); // -206352.14235361113시간 let my7Date = new Date(2014, 6, 12, 13, 17, 15); console.log(my7Date.getFullYear()); // 2014 console.log(my7Date.getMonth()); // 6 (0부터 시작) console.log(my7Date.getDate()); // 12 (일) console.log(my7Date.getDay()); // 6 (요일) console.log(my7Date.getHours()); // 13 console.log(my7Date.getMinutes()); // 17 console.log(my7Date.getSeconds()); // 15 console.log(my7Date.getMilliseconds()); // 0 // set 으로 생성된 Date 객체 정보 수정 my7Date.setFullYear(1999); my7Date.setMonth(2); my7Date.setDate(30); console.log(my7Date); // 1999-03-30T04:17:15.000Z (변경 값) // 브라우저에 설정된 국가 표기에 맞춰 날짜와 시간을 보여줌 let myDate = new Date(); console.log(myDate.toLocaleDateString()); // 2023. 3. 22. (년. 월. 일) console.log(myDate.toLocaleTimeString()); // 오후 12:30:19 (시:분:초) console.log(myDate.toLocaleString()); // 2023. 3. 22. 오후 12:30:19 (년. 월. 일 시:분:초) // Date객체의 형변환 console.log(typeof myDate); // object console.log(Boolean(myDate)); // true console.log(Number(myDate)); // 1679456110776 (타임스탬프 값) // 두 객체 사이의 시간차이 확인도 가능 let myDate1 = new Date(1999, 8, 6); let myDate2 = new Date(2023, 3, 22); let timeDiff2 = myDate2 - myDate1; console.log(timeDiff2); // 745545600000 (ms) console.log(timeDiff2 / 1000); // 745545600 (sec) console.log(timeDiff2 / 1000 / 60) // 12425760 (min) console.log(timeDiff2 / 1000 / 60 / 60) // 207096 (hour) console.log(timeDiff2 / 1000 / 60 / 60 / 24) // 8629 (date) // 날짜를 표현하는 다양한 문자열 let date1 = new Date('8/6/1999 06:00:00'); let date2 = new Date('August 6, 1999 06:00:00'); let date3 = new Date('Aug 6 1999 06:00:00'); console.log(date1, date2, date3); // 1999-08-05T21:00:00.000Z * 3
배열 (Array)
랭킹처럼 순서가 있는 값을 만들때는 객체보다 배열을 활용하는것이 좋다.
▶배열은 객체다.
▶배열은 바뀔 수 있는 자료형, 문자열은 바뀔 수 없는 자료형
// 배열 (Array) let foodRanking = [ '짜장면', // 요소 '짬뽕', '돼지국밥', '한우' ]; // 인댁스 == 프로퍼티 이름 console.log(foodRanking[0]); // 인덱싱(Indexing) // 출력 : 짜장면 console.log(foodRanking[1 + 2]); // 한우 console.log(foodRanking.length); // 4 (배열의 요소 총개수) console.log(foodRanking['length']); // 4 (배열의 요소 총개수) console.log(foodRanking[foodRanking.length - 1]); // 한우 (배열의 마지막 요소) console.log(foodRanking[5]); // undefined foodRanking[5] = '순대국'; // 요소 값 수정 console.log(foodRanking[5]); // 순대국 foodRanking[7] = '카레'; console.log(foodRanking[6]); // 6번이 empty로 비어있음 foodRanking[2] = '초밥'; console.log(foodRanking[2]); // 돼지국밥에서 초밥으로 수정(덮어쓰기) console.log(foodRanking); // [ '짜장면', '짬뽕', '초밥', '한우', <1 empty item>, '순대국', <1 empty item>, '카레' ] delete foodRanking[3]; // 배열 삭제 console.log(foodRanking); // [ '짜장면', '짬뽕', '초밥', <2 empty items>, '순대국', <1 empty item>, '카레' ]
배열의 메소드
splice : 할당된 숫자 이후부터의 배열의 값을 완벽하게 삭제
// 배열 (Array) let foodRanking = [ '짜장면', // 요소 '짬뽕', '돼지국밥', '한우' ]; // splice (할당된 숫자 이후부터의 배열의 값을 완벽하게 삭제) foodRanking.splice(2); console.log(foodRanking); // [ '짜장면', '짬뽕' ] // splice(StartIndex, DeleteIndex) foodRanking.splice(2, 1); // 2번인덱스 부터 1개 완벽하게 삭제 console.log(foodRanking); // [ '짜장면', '짬뽕', '한우' ] // splice(StartIndex, DeleteIndex, Item) 삭제된 index값에 item 추가 foodRanking.splice(2, 1, 'hyogi'); // 2번인덱스 부터 1개 완벽하게 삭제 console.log(foodRanking); // [ '짜장면', '짬뽕', 'hyogi', '한우' ] // splice 활용 정리 // 배열의 첫 요소 삭제 foodRanking.splice(0, 1); // 배열의 마지막 요소 삭제 foodRanking.splice(foodRanking.length - 1, 1); // 배열의 첫 요소에 값 추가 foodRanking.splice(0, 0, 'hyogi'); // 배열의 마지막 요소에 값 추가 foodRanking.splice(foodRanking.length, 0, 'hyogi2'); // 배열의 첫 요소 삭제 foodRanking.shift(); // 배열의 마지막 요소 삭제 foodRanking.pop(); // 배열의 첫 요소에 값 추가 foodRanking.unshift(); // 배열의 마지막 요소에 값 추가 foodRanking.push(); // 배열의 특정 값 찾기 (포함되어 있다면 인덱스 위치가 리턴 없다면 -1) console.log(foodRanking.indexOf('짜장면')); //-1 // 배열의 특정 값 찾기를 뒤에서부터 탐색함. console.log(foodRanking.lastIndexOf('짜장면')); //-1 // 배열에 특정 값이 있는지 확인 (includes) 있으면 true 없으면 false console.log(foodRanking.includes('짜장면')); // false // 배열 뒤집기 (reverse) foodRanking.reverse();
for...of 반복문
// 배열 (Array) let foodRanking = [ '짜장면', // 요소 '짬뽕', '돼지국밥', '한우' ]; for (let element of foodRanking){ console.log(element); // 짜장면 짬뽕 돼지국밥 한우 } for (let index in foodRanking){ console.log(foodRanking[index]); // 짜장면 짬뽕 돼지국밥 한우 }
다차원 배열
// 다차원 배열 (multidimensional array) let foodRanking = [[1, 2], [3, 4], [4, 5]]; console.log(foodRanking[0]); // [ 1, 2 ] console.log(foodRanking[0][1]); // 2
다양한 숫자 표기법
// 숫자 표기법 let millionaire = 1000000000; let num = 1e9; // 지수 표기법 console.log(millionaire); // 1000000000 console.log(num); // 1000000000 console.log(millionaire === num); // true // 숫자 표기법 console.log(13e5 === 1300000); // true console.log(4.2e3 === 4200); // true console.log(-2.1e8 === -210000000); // true // 16진법 let hexOne = 0xff; let hexTwo = 0xFF; // 8진법 let oct = 0o377; // 2진법 let binary = 0b11111111; console.log(hexOne); // 255 console.log(hexTwo); // 255 console.log(oct); // 255 console.log(binary); // 255
숫자형 메소드
▶JS는 숫자도 객체
// number let num = 0.1234; // toFixed(0 ~ 100) console.log(num.toFixed(3)); // 소수를 다룰때 사용하는 메소드, 숫자만큼 소수점 아래 자리수를 고정해줌 string 0.123 console.log(+num.toFixed(2)); // 0.12 (+ 는 num으로 형변환해줌) // toString (2 ~ 36) 진법으로 숫자를 변환해줌 console.log(num.toString(2)); // 2진수 console.log(num.toString(8)); // 8진수 console.log(num.toString(16)); // 16진수 console.log(4..toString(2)); // 100 (4 숫자 그대로 2진법으로 변환) console.log((16).toString(8)); // 20
Math 객체
// 절댓값 (Absolute Number) console.log(Math.abs(-300)); // 300 // 최댓값 (Maximum) console.log(Math.max(3, 4, 5, 11, 7, 3, 9)); // 11 // 최솟값 (Minimum) console.log(Math.min(5, 6, 11, 32, 12, 1, 2)); // 1 // 거듭제곱 (Exponentiation) console.log(Math.pow(4, 2)); // 16 // 제곱근 (Square Root) console.log(Math.sqrt(81)); // 9 // 반올림 (Round) console.log(Math.round(5.7)); // 6 // 버림과 반올림 (Floor and Ceil) console.log(Math.floor(8.4)); // 8 (버림) console.log(Math.ceil(4.9)); // 5 (올림) // 난수 (Random) console.log(Math.random()); // 0.20732508994709398
미세한 값의 차이가 있는 JS
▶컴퓨터는 0과 1로 처리하다 보니까 가끔 오차가 있는 경우가 있는데
toFixed() 를 사용한뒤 형변환을 해주면 해결된다.
▶round() 사용한다.
문자열 심화
// String let hyogiString = 'hyogi'; // 문자열 길이 console.log(hyogiString.length); // 5 (공백 포함) // 요소 접근 console.log(hyogiString[2]); // o 대괄호 표기법 console.log(hyogiString.charAt(3)); // g charAt 메소드 // 요소 탐색 console.log(hyogiString.indexOf('h')); // 0 0번인댁스에 h가 존재함 (존재하지 않으면 -1 출력) console.log(hyogiString.lastIndexOf('y')); //1 뒤부터 접근 // 대문자 변환 console.log(hyogiString.toUpperCase()); // 대문자 HYOGI console.log(hyogiString.toLowerCase()); // 소문자 hyogi // 양 끝 공백 제거 console.log(hyogiString.trim()); // hyogi에 공백이 없으므로 hyogi 출력함 // 부분 문자열 접근 slice(start, end) console.log(hyogiString.slice(0, 3)); // hyo 0~2번 인덱스까지 출력 console.log(hyogiString.slice(2)); // ogi 2번 인덱스부터 출력 console.log(hyogiString.slice()); // hyogi 전부 출력
기본형과 참조형
기본형 : number, string, boolean, null, undefined ( 변수 = 값 )
참조형 : object ( 변수 = 주소값 )
참조형 복사하기
// 참조형 복사하기 let num1 = [1, 2, 3, 4, 5]; let num2 = num1.slice(); num2.push(6); console.log(num1); // [ 1, 2, 3, 4, 5 ] console.log(num2); // [ 1, 2, 3, 4, 5, 6 ] // 객체 let hyogi = { title: 'hyogi blog', language: 'Java' }; // <1> let hyogi2 = Object.assign({}, hyogi); hyogi2.title = 'hyogi it blog'; console.log(hyogi); // { title: 'hyogi it blog', language: 'Java' } console.log(hyogi2); // { title: 'hyogi it blog', language: 'Java' } // <2> for (let key in hyogi){ hyogi2[key] = hyogi[key]; } hyogi2.title = 'hyogi tistory blog'; console.log(hyogi); // { title: 'hyogi it blog', language: 'Java' } console.log(hyogi2); // { title: 'hyogi tistory blog', language: 'Java' } // <3> function hyogiObject(Object) { let temp = {}; for (let key in Object){ temp[key] = Object[key] } return temp; }; let hyogi1 = { title: 'hyogi it blog', language: 'python' } let hyogi3 = hyogiObject(hyogi1); hyogi3.title = 'hyogi tistory blog'; console.log(hyogi3); // { title: 'hyogi tistory blog', language: 'python' }
const, 변수와 상수 사이
가끔 변수를 상수로 쓰라는 경우도 있는데 그 이유는 변수는 언제 어디서나 변경될 수 있는 위험성이 있기 때문이다.
따라서 상수를 써서 변경 못하게 함으로써 안전성에 확보를 생각한 것이다.
변수 ( variable) : hyogiName
상수 (constant) : HYOGINAME
변수 더 나아가서
var : let과 const처럼 변수 선언할 수 있다.
▶중복된 변수값을 에러발생 시키지 않고 덮어써 버린다.
▶var변수는 scope가 function에서만 구분되어 있다. (전역번수 역할을 하게 된다)
▶끌어올림 : var 변수는 함수 스코프 기준으로 선언되기 이전에도 변수에 접근이 가능하다.
본 포스팅은 codeit; 스터디를 하며 요약했으며
강의에 있는 예제를 저자가 알아보기 쉽도록 변경하여 포스팅 했습니다.
블로그의 정보
감성 개발자 효기
효기’s