본 과정은 내일배움캠프 웹개발 사전캠프로 지급받은 강의의 내용을 바탕으로 정리한 글입니다.
데이터 타입에는 기본형과 참조형이 있음
'값의 저장방식'과 '불변성 여부'로 판단함
복제의 방식
불변성의 여부
메모리
모든 데이터는 바이트의 식별자인 메모리 주소값을 통해 구분함
자바스크립트와 자바의 메모리 관리방식
1) 자바스크립트 : let a = 8(8byte)
2) 자바
☞ 자바스크립트는 데이터타입을 크기에 따라 지정해줘야하는데 자바스크립트는 8바이트로 통일이여서 메모리 이슈를 고민하지 않아도 되어서 편리함
var testValue = 3
☞ testValue는 식별자(변수명)이고 3은 변수(데이터)라고 보면 됨
/** 선언과 할당을 풀어 쓴 방식 */
var str;
str = 'test!';
/** 선언과 할당을 붙여 쓴 방식 */
var str = 'test!';
자유롭게 데이터를 할당할 수 있다.
만약 변수영역에 데이터를 한번에 할당한다면 데이터 길이가 길어진다면 다음영역의 데이터를 오른쪽으로 다 밀어야하기 때문에 비효율적임
메모리를 효율적으로 관리할 수 있음
똑같은 데이터를 여러 변수에 저장해야한다면 공간차지가 같이 할당하는것에 비해서 별도 저장이 굉장히 효율적임
변수와 상수
변수 : 변수영역 메모리 변경 가능
상수 : 변수영역 메모리 변경 불가
불변하다와 불변하지 않다
불변하다 : 데이터 영역 변경 불가
불변하지 않다 : 데이터 영역 변경 가능
처음으로, 솔직히 태어나서 코딩공부하면서, 처음으로 겪은 벽..
대학다닐때도 이론이 약했지만 실전은 잘했었는데..
자바스크립트 3주차 강의 3-3, 3-4 다시 회독하기
완벽하게 이해를 못했던 챕터라서, 다시 봐야할것 같다.
스스로 이해를 못하는 무능함을 느끼는건 참 치욕적이다.
선언은 했지만 할당되지 않는걸 underfined라고 함
var a;
console.log(a); // (1) 값을 대입하지 않은 변수에 접근
var obj = { a: 1 };
console.log(obj.a); // 1
console.log(obj.b); // (2) 존재하지 않는 property에 접근
// console.log(b); // 오류 발생
var func = function() { };
var c = func(); // (3) 반환 값이 없는 function
console.log(c); // undefined
없다는 표현을 하기 위해 underfined는 사용하지 않기! null 사용
#null
‘없다’를 명시적으로 표현할 때
!주의
typeof null이 object인 것은 유명한 javascript 자체 버그임
var n = null;
console.log(typeof n); // object라고 나오는데 이게 버그라는 뜻
//동등연산자(equality operator)
console.log(n == undefined); // true
console.log(n == null); // true
//일치연산자(identity operator)
console.log(n === undefined); //false
console.log(n === null); //true
실행할 코드에 제공할 환경 정보를 모은 객체
4번부터 1번까지 순차적으로 실행하면서 사라짐
☞ 코드의 환경과 순서를 보장할 수 있음.
VariableEnvironment(VE)와 LexicalEnvironment(LE)는 똑같다.
변경사항이 실시간으로 반영되는지 여부가 다름
2) 외부 환경 정보를 갖고 있음
3) 변경사항이 반영안되고 처음상태 그대로임
2.LexicalEnvironment
1) 현재 컨텍스트 내 식별자 정보를 가지고 있음
var a = 3 의 경우 var a를 말함
2) 외부 환경 정보를 갖고 있음
3)변경사항이 실시간 업데이트가 됨
☞ 실행 컨텍스트를 생성할 때, VE에 정보를 먼저 담은 다음, 그대로 복사해서 LE를 만들고 이후에는 주로 LE를 활용함
1) 호이스팅 법칙 ♣♣♣
매개변수 및 변수는 선언부를 호이스팅 함
//적용 전
function a (x) {
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a(1);
//적용 후
function b () {
var y;
var y;
var y;
y = 1;
console.log(y);
console.log(y);
y = 2;
console.log(y);
}
b(1);
2) 함수 선언 전체를 호이스팅한다.
function a () {
console.log(b);
var b = 'bbb';
console.log(b);
function b() { }
console.log(b);
}
a();
console.log('************');
function a () {
var b;
function b() { }
console.log(b);
b = 'bbb';
console.log(b);
console.log(b);
}
a();
//함수선언문_선언만 하고 할당을 안함
function a(){
}
a();
//함수 표현식_선언한 function을 변수에 할당한 경우
var b = function(){
}
b();
//기명함수_ 잘 안씀. 변수명 : c / 함수명 : d
var c = function d(){
}
c();
d(); //에러뜸
현재 호출된 함수가 선언 될 당시의 LexicalEnvironment를 참조함
실행 컨텍스트가 만들어질때의 환경정보를 갖고 있음
둘다 비슷해보이나 다름
함수 : 독립적으로 사용가능 → 함수명();
메소드 : 자신을 호출한 대상 객체에 대해서 동작 수행 → 객체.메소드명()
var obj = {
method: function (x) { console.log(this, x) }
};
obj.method(1); // { method: f } 1
obj['method'](2); // { method: f } 2
☞ .점이나 [대괄호]로 호출하면 메소드임
호출 주체가 있기때문에 내부에 있어도 함수로서 호출하면 this는 전역객체임
var obj1 = {
outer: function() {
console.log('첫번째',this); // (1)
var innerFunc = function() {
console.log('두번째',this); // (2), (3)
}
innerFunc();
var obj2 = {
innerMethod: innerFunc
};
obj2.innerMethod();
}
};
obj1.outer();
오늘의 한줄평 : 와, 코딩 배우면서 하면서, 처음으로 벽을 만났다.
오히려 좋아 :] 내가.. 불태울게 또 생겼구나 :]