추가 - JeongWu/fe-javascript GitHub Wiki
- null 값 조건
(!a&&typeof a==="object");
- undefined "값이 없는" "선언되지 않는"
- 임의로 지정한 변수 에러 안나려면
if(DEBUG){}//에러
if(typeof DEBUG !== "undefined"){}
var atob//호이스팅 (전역 변수사용 할 때)-> window 객체
if(typeof atob !== "undefined"){}
- 문자배열-> 문자열:join
- 배열의 사본 : slice()
- 암시적 형변환
var a=42;
var b=a+"", //암시적 강제변환: 문자열이 우선순위가 더 높다
var c= String(a); //명시적
a.toString과 차이점: toString을 쓰면서 암시적으로 String 래퍼로 박싱한 후 메서드 호출됨!(암시적임)
- == === 차이점: ==는 강제변환 허용 /비허용
- 비교 할 때
if(a==true) //X
if(!!a) //o
- null undefined
if(a==null) //null과 undefined 모두 동일한 값으로 취급
- 연산자 우선순위 && > || > ?:
- {} 블록, 객체 리터럴, 해레 할당...
- LHS RHS LHS: 변수에 값을 대입
- RHS: 변수의 값을 얻어오는 것 -> 참조 대상을 찾지 못하면 ReferenceError 발생
- 함수 표현식 즉시 호출(IIFE)
var a=2;
(function foo(){
var a=3;
console.log(a); //3
})();
console.log(a); //2
- let : 호이스팅 X, const-> 고정
- join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열
- slice() 메서드는 어떤 배열의 begin부터 end까지에 대한 얕은 복사본을 새로운 배열 객체로 반환 -> slice(2)이면 앞에 2개 자름
- arguments는 함수에 들어온 인자를 배열형식으로 반환하는 유사 배열 -> 배열 메소드 사용 불가하기 때문에 call, apply로 조작
- call, apply의 첫번쨰 인자는 this
- call
function update(birthYear, occupation){
this.birthYear = birthYear;
this.occupation = occupation;
};
update.call(bruce, 1949, 'singer'); // bruce 변경
/*
bruce는 이제
{
name : 'Bruce',
birthYear : 1949,
occupation : 'singer'
}
로 변경됨
*/
update.call(madeline, 1942, 'actress'); // madeline 변경
/*
madeline은 이제
{
name : 'Madeline',
birthYear : 1942,
occupation : 'actress'
}
로 변경됨
*/
- apply
update.apply(bruce, [1955, 'actor']);
/*
bruce는 이제
{
name : 'Bruce',
birthYear : 1955,
occupation : 'actor'
}
로 변경됨
*/
update.apply(madeline, [1918, 'writer']);
/*
madeline은 이제
{
name : 'Madeline',
birthYear : 1918,
occupation : 'writer'
}
로 변경됨
*/
: apply는 배열 요소를 함수 매개변수로 사용해야 할 때 유용 ex) Math.min과 Math.max
const arr = [2,3,-5,15,7];
Math.min.apply(null, arr); // -5 //this와 관계 없이 동작하기 때문에 null넘겨줌
Math.max.apply(null, arr); // 15
- bind: bind를 사용하면 함수의 this값을 영구히 바꿀 수 있다. bind에 매개변수를 넘기면 항상 그 매개변수를 받으면서 호출되는 새 함수를 만드는 효과
- call, apply는 그냥 함수가 실행되도록 "도와"주는 것. bind는 "새로운 함수를 "만들어"쥼.
const updateBruce1949 = update.bind(bruce, 1949); updateBruce1949("singer, songwriter");
/*
bruce 는 이제 {
name: "Bruce",
birthYear: 1949,
occupation: "singer, songwriter"
}
*/
//bruce가 태어난 해를 항상 1949로 고정하지만, 직업은 자유롭게 바꿀 수 있는 업데이트 함수
- call은 함수를 빌려오거나 프로퍼티를 가져 올 수 있다
- Array.prototype.slice.calll/apply (obj/arguments)
- 일반 리터럴 객체/arguments에는 배열 메서드가 없다. 없는 것을 호출 할 수는 없다.
- Array.prototype을 호출(call)하면 Array Object에 접근할 수 있다. 이를 통해 배열 메서드를 사용 할수 있음
- callback 함수
var o = {
data : 'dummy',
time : function(){
window.setTimeout(function(){ //window. 생략 가능
console.log('this -->', this); // window 객체
console.log(this.data);}, 1000) // undefined
// callback 함수 setTimeout() 안에서의 this는 window 객체를 카르킨다.
}
}
o.time(); // window 객체, undefined
- callback 함수 내의 this가 window 객체를 가르키는 문제 해결방법 1)
var o = {
data : 'dummy',
time : function(){
var that = this;
window.setTimeout(function(){
console.log(that.data);}, 1000)
// scope로 인하여 that은 외부 변수 that을 가져온다.
}
}
o.time(); // 'dummy'
- callback 함수 내의 this가 window 객체를 가르키는 문제 해결방법 2)
bind 함수
var o = {
data : 'dummy',
time : function(){
window.setTimeout(function(){
console.log(this.data);
}.bind(this), 1000)}
// 니가 실행될 때, 니가 가르킬 this는 인자를 가르키도록 실행 해! (저장)
// bind()는 apply(), call()과는 다르게 바로 실행되지 않는다.
}
o.time(); // 'dummy'
- setTimeout()
- setTimeout(0)이라고 해서 즉시 실행되지 않음. 읽힌 후 다음 프레임에 실행됨
- setTimeout이 var i의 scope를 가져감 i를 바인딩하는 것이 아닌 var i를 참조
- let i로 하면 블록 안에서 바인딩이 됨.
for(var i=1;i<=5;i++){
setTimeout(function timer(){
console.log(i);
},i*1000);
}
- concat() 메서드는 인자로 주어진 배열이나 값들을 기존 배열에 합쳐서 새 배열을 반환
- literal: 코드상에서 데이터를 표현하는 방식 객체 리터럴:{} (new Object 사용하지 않고 정의) 배열 리터럴:[] (new Array 사용하지 않고 정의)
- this Java에서의 this는 인스턴스 자신(self)을 가리키는 참조변수 자바스크립트의 경우 함수 호출 방식에 의해 this에 바인딩할 어떤 객체가 동적으로 결정
- 함수 호출
: 일반 함수, 메소드, 콜백함수 어디에서 선언되었든 관게없이 this는 전역객체를 바인딩 - 메소드 호출
: 해당 메소드를 소유한 객체, 즉 해당 메소드를 호출한 객체에 바인딩 - 생성자 함수 호출
: new 연산자를 붙여서 호출하면 해당 함수는 생성자 함수로 동작 - {} 객체 리터럴 방식과 생성자 함수 차이
- 객체 리터럴 방식의 경우, 생성된 객체의 프로토타입 객체는 Object.prototype이다.
- 생성자 함수 방식의 경우, 생성된 객체의 프로토타입 객체는 Person.prototype이다
- apply/call/bind 호출 (명시적으로 바인딩) 내부함수는 일반 함수, 메소드, 콜백함수 어디에서 선언되었든 관게없이 this는 전역객체를 바인딩
- call, apply, bind
- apply() 메소드는 this를 특정 객체에 바인딩할 뿐 본질적인 기능은 함수 호출 callback.call(this);
- bind()는 함수를 실행하지 않기 때문에 명시적으로 함수를 호출할 필요 callback.bind(this)();
- React
const AOrDib=true?'a':'div'
export default ()=> <AOrDiv>안녕</AOrDiv>
- component가 render되는 때
- mount
- props/state 변경
- context 변경
- components
- $r 현재 접근
- $0 루트 접근(정보 받아올 수 있음)
- profiler 성능 추적
- react: virtual dom 기반
외부 library-> dom virtual dom은 변경인지하지 못함 -> ref 사용 - 내부적-> context API 사용
중앙에서 데이터 관리 useContext를 통해 피요한 부분 끌어다가 사용 . 그걸 사용하기 편하게 Redux, Mobx