자바스크립트로하는 자료구조와 알고리즘 - 배세민
1.scope
false | 0 | 빈 문자열('')("") | NaN | undefined | null |
true | 0이 아닌 다른 숫자 | 비어있지 않은 문자열 | 비어 있지 않은 객체 |
"5" == 5 // true
"5" === 5 // false
첫째 줄이 true인 이유는, ==연산자가 실행될 때 "5"가 숫자로 강제 형변환이 되기 때문이다.
const obj1 = {};
const obj2 = {};
obj1 == obj2 // false
obj1 === obj2 // false
꼭 빈 객체가 아니고, 두 객체가 같은 속성과 값을 가지고 있더라도 false를 반환한다. 두 변수의 메모리상 주소는 다르기 때문이다. (참조형 자료)
이런점 때문에, lodash나 underscore와 같은 유틸리티 라이브러리를 사용한다. 이 두 라이브러리에는 isEqual함수가 있는데, 두 객체, 혹은 두 값을 정확하게 확인하게 해준다.
function isEquivalent(a,b){
let aProps = Object.getOwnPropertyNames(a);
let bProps = Object.getOwnPropertyNames(b);
if(aProps.length != bProps.length) {
return false;
}
for(let i = 0; i < aProps.length; i++){
let propName = aProps[i];
if(a[propName] !== b[propName]){
return false;
}
}
return true;
}
isEquivalent({'hi':12},{'hi':12}); //output : true
const obj1 = {'prop1': 'test', 'prop2': function (){} };
const obj2 = {'prop1': 'test', 'prop2': function (){} };
isEquivalent(obj1,obj2) //output : false
- Object.getOwnPropertyNames() method.
Object.getOwnPropertyNames() 메서드는 전달된 객체의 모든 속성들을 [배열]로 반환한다.- 키 값은 '문자열'이다.
- 객체 프로퍼티에 접근할 때는 [ ] 를 이용할 수 있다. [ ] 안에는 문자열이 들어가야 한다.
이때 문자열을 값으로 가진 변수를 넣을 수 있다.
(let propname = aProps[i])
(aProps[i]와 bProps[i]가 같다는 점을 활용하여 키의 속성을 추출할 수 있다.)