자바스크립트의 동일 연산자에는 두 가지가 있다.

  • 관대한 동등/비동등 연산자 "==" "!="
  • 엄격한 일치/불일치 연산자 "===" "!=="

책에서는 동등 연산자는 너무 많은 값을 같다고 판단하므로, 일치 연산자를 사용할 것을 권장하고 있다.

그렇다면 어떤 값들을 동등 연산자로 비교했을 때, 기대한 것과 다르게 값이 나올까 궁금했다.

그리고 Stack Overflow에서 관련된 질문을 찾았고, 가장 많은 명성(?)을 얻은 답변은 다음과 같다.



 일치 연산자  ===  는 타입 변환이 안되는 것을 제외하고 동등 연산자  ==  와 동일하게 동작하며, 일치하는 것으로 간주되려면 타입이 항상 같아야 합니다.

 동등 연산자  ==  는 모든 필수적인 타입 변환을 한 후에 동등함을 비교할 것입니다. 일치 연산자  === 는 타입 변환을 하지 않기 때문에, 두 값이 같은 타입이 아니면  === 는 단순히 false를 반환합니다. 둘 다 속도는 같습니다.

 더글라스 크록포드(JSON의 아버지!)의 JavaScript: The Good Parts를 인용해보겠습니다.


 자바스크립트는 두 세트의 동일 연산자를 가집니다.  ===  와  !== , 그리고 그들의 나쁜 쌍둥이  ==  와  != . 좋은 것들은 당신이 예상하는대로 동작하는 것입니다. 만약 두 개의 피연산자가 동일한 타입, 동일한 값이면  ===  는 true를 만들고,  !== 는 false를 만듭니다. 나쁜 쌍둥이는 피연산자가 같은 타입일 때 올바르게 동작하지만, 다른 타입이라면 그들은 피연산자의 값을 마음대로 하려 할겁니다. 그들의 행동으로 형성된 법칙은 복잡하고 기억하기 어렵습니다. 여기에 몇 가지 흥미로운 케이스가 있습니다.


"" == '0' //false
0 == "" //true
0 == '0' //true

false == 'false' //false
false == '0' // true

false == undefined //false
false == null //false
null == undefined // true

'\t\r\n' == 0 // true

 타당성이 부족한 것이 놀랍습니다. 내 조언은 나쁜 쌍둥이들을 절대 사용하지 말라는 겁니다. 대신, 항상  ===  와  !== 를 사용하세요. 위의 모든 비교들은  ===  로 비교하면 false를 만듭니다.

 레퍼런스 타입에 대해서는  ==  와  ===  는 특별한 경우를 제외하고, 서로 일관성을 갖고 동작합니다.


var a = [1,2,3];
var b = [1,2,3];

var c = {x: 1, y: 2};
var d = {x: 1, y: 2};

var e = "text";
var f = "te" + "xt";

a == b // false
a === b // false

c == d // false
c === d // false

e == f // true
e === f // true


"abc" == new Striing("abc") // true
"abc" === new String("abc") // false

 여기  ==  연산자는 두 객체의 값을 검사하고, true를 반환하지만, 그들이 같은 타입인지 보는  ===  는 false를 반환합니다. 무엇이 맞을까요? 그것은 정말 당신이 비교하려는 것에 따라 달렸습니다. 나의 조언은, 질문을 완전히 돌아가서, String 생성자를 문자열 객체를 생성하는데 사용하지 말라는 것입니다.


'JavaScript' 카테고리의 다른 글

[JavaScript] Trailing Comma 번역자료  (0) 2017.10.02
[JavaScript] 변수 스코프  (0) 2017.04.13
[JavaScript] 생성자 함수  (0) 2017.02.27
[JavaScript] 배열 연결  (0) 2017.01.26

선형 자료구조의 한 종류인 리스트는 배열 리스트(Array List)와 연결 리스트(Linked List)로 나뉜다. 


# 배열 리스트 ( Array List ) 

배열 기반으로 구현된 리스트.

장점

- index를 이용한 랜덤 접근 지원

단점

- 처음에 길이를 정해줘야 하며 필요에 따라 길이를 변경할 수 없다. ( 고정 길이 )

- 추가/삭제 시 나머지 요소들의 이동이 필요하다.


# 연결 리스트 ( Linked List ) 

: 메모리에 동적할당된 공간에 데이터를 저장하고, 그 공간들을 연결해서 구현한 리스트다. 

장점

- 처음에 길이를 정할 필요가 없고 각 요소는 메모리에 동적할되므로 길이 제한에 자유롭다. ( 가변 길이 )

- 추가/삭제 시 나머지 요소들의 이동이 필요없다.

단점

- 순차 접근으로 시간 복잡도 증가.


# 자바의 Array List

: Java Collection에서도 Array List, Linked List같은 리스트 자료구조를 제공하는데, 이 중 Array List는 이름을 그대로 해석하면 "배열 리스트"지만 기존 배열기반 리스트의 단점을 보완한 특징을 가진다.

장점 

- 처음에 길이를 정할 필요가 없다. ( 가변 길이 )

- 랜덤 접근 지원.

단점

- 추가/삭제 시 나머지 요소들의 이동이 필요하다.

'Data Structure' 카테고리의 다른 글

번역] Inorder Successor in Binary Search Tree  (0) 2016.05.01


이진트리에서, 노드의 중위-후속자(Inorder successor)는  


이진트리의 중위-순회(Inorder traversal)시 다음으로 방문할 노드를 말한다. 


예를 들어 중위-순회에서 마지막 노드에 대한 중위-후속자는 NULL이다. 


이진검색 트리에서, 입력 노드의 중위 후속자는 입력 노드의 키보다 큰 노드 중 가장 작은 키를 가진 노드로 정의될 수 있다. 


따라서, 정렬된 순서에서 다음 노드를 찾는 것이 가끔 중요하다. 


 


위 그림에서 8의 중위-후속자는 10, 10의 중위-후속자는 12, 14의 중위-후속자는 20이다.




 출처 http://www.geeksforgeeks.org/inorder-successor-in-binary-search-tree/

 

 

'Data Structure' 카테고리의 다른 글

배열과 리스트  (0) 2016.08.28

Authentication

Authentication은 당신이 누군지 확인한다. 예를 들어서 당신은 SSH 클라이언트를 이용해 Unix 서버에 로그인할 수 있거나,  POP3, MTP 클라이언트를 이용해 당신의 이메일 서버에 접근할 수 있다. 

Authorization

Authorization은 당신이 작업을 하도록 허가됐는지 확인한다. 예로 당신은 ssh 클라이언트를 경유해 Unix Server로 로그인하는 것이 허용될 수 있지만 당신은 디렉터리 혹은 어떤 다른 파일 시스템을 탐색하는 것도 허용되지 않는다.

Authorization은 성공적인 Authentication후에 일어난다.


출처 http://www.cyberciti.biz/faq/authentication-vs-authorization/


'ETC' 카테고리의 다른 글

BOJ 9084 동전문제  (0) 2017.03.02

Ionic으로 개발하던 앱에서 Facebook 로그인을 추가하기로 했고,

구현을 위해 관련된 자료를 찾던 중에 ngCordovaOauth 플러그인을 찾았다.

Ionic 포럼에서는 이 플러그인을 소개하는 글이 있었고, 이 플러그인을 이용한 샘플 프로젝트도 안내하고 있었다.

참고로 개발 환경에서 테스트해보려면 브라우저말고 에뮬레이터를 써야 한다.


우선 페이스북 개발자센터의 상단 네비게이션 > MyApp에서 앱을 생성한다.


블러 처리된 부분의 App ID를 복사 한다. 

샘플 프로젝트의 www/js/app.js 파일에서 아래의 코드를 찾아 client_id를 복사해둔 APP ID로 바꾼다.

$cordovaOauth.facebook("client_id", ["email", "read_stream", "user_website", "user_location", "user_relationships"]).then(function(..){...});


그리고 에뮬레이터에서 테스트 해보면 에러가 난다.


다시 페이스북 개발자센터로 간다.


MyApp > Settings의 Advanced 탭으로 이동한다.

그림에 표시된 부분에 "http://localhost/callback"을 입력한 후 다시 실행한다.


로그인에 성공했다.

하지만 이 방법은 페이스북 개발자 센터에서 APP을 생성한 계정으로만 가능할 뿐, 다른 팀원의 계정으로 로그인을 시도하면 에러가 발생했다.


화면에 표시된 toggle 버튼을 클릭해서 Yes 상태로 만든다.

그럼 다른 계정으로도 테스트 가능.

+ Recent posts