자바스크립트의 함정 중에 하나는 객체 비교 연산자가 ==와 === 두 가지 버전으로 있다는 점입니다.

Operator (==)
Tests for equality in value between two operands.

Operator (===)
Tests for equality between two operands both in terms of value and type. Supported in JavaScript 1.3+


==는 자동으로 변환을 수행하여 비교 연산을 하기 때문에 a = 1과 b = "1"을 비교했을 때 a == b는 true를 리턴하게 됩니다. 반면에 ===는 타입과 값을 모두 비교하기 때문에 서로 다른 타입인 a와 b를 비교하는 a === b는 false를 리턴합니다.

다음은 자바로 작성된 자바스크립트 엔진인 Rhino1.6 R5에서 ==와 ===를 수행한 결과입니다.

$ java -jar js.jar
Rhino 1.6 release 5 2006 11 18
js> a = 1
1
js> b = "1"
1
js> a  == b
true
js> a === b
false







자바 스크립트는 함수형 언어들과 마찬가지로 클로저(closure)를 지원한다.

function sayHello(name) {
  var text = 'Hello ' + name; // local variable
  var sayAlert = function() { alert(text); }
  return sayAlert;
}

위 함수 sayHello()의 리턴 값은 또 다른 함수인 function() { alert(text); }이다. 이렇게 얻은 함수는 다음과 같이 호출할 수도 있다.

var fun = sayHello('Jane')
fun();


함수 안에 함수를 정의하는 중첩 함수(nested function)의 개념은 어렵지 않지만, 클로저는 중첩 함수에 대한 단순 함수 포인터만은 아니다. sayHello() 함수에서 text는 지역 변수이므로 스택에 할당하는 구조를 따른다면 sayHello() 함수가 리턴된 후에는 더 이상 text 변수의 값을 읽을 수 없어야 한다. 자바스크립트에서 function() { alert(text); } 같이 클로저를 선언하면 클로저 내부에서 참조하는 지역 변수인 text를 마치 힙에 할당한 것처럼 보존한다. (즉 클로저에 대한 감춰진 포인터가 하나 더 있는 셈이다.) 따라서 sayHello() 함수가 리턴된 후에도 클로저를 호출했을 때 text 변수의 값을 읽을 수 있는 것이다.

자세한 내용은 참고 문서를 참조하기 바란다.


참고 문서
[1] JavaScript Closures 101- they're not magic
http://www.javascriptkit.com/javatutors/closures.shtml

[2] More closure examples
http://www.javascriptkit.com/javatutors/closures2.shtml

이전에 메릴랜드 있을 때 참석하던 Software Chat에서 "Enforcing and Validating Programmer-Defined Type System"라는 주제의 강연 메일을 받았다.

프로그램의 중요한 속성(well-formedness properties)을 보장하는 데 타입 시스템이 자연스러운 접근 방법인 것은 사실이다. 하지만 프로그래머마다 원하는 속성이 다르고, 언어 설계자가 이 모든 요구사항을 언어 타입 시스템에 모두 녹여 넣을 수 없다. 따라서 UCLA의 Todd Millstein의 아이디어는 언어 타입 시스템 자체를 확장성 있게 만들어 프로그래머가 필요한 속성을 체크할 수 있도록 타입 시스템을 확장할 수 있게 해주자는 것이다.

Clarity 프레임워크의 경우 C의 타입 시스템을 확장해서 nonnull, positive, tained 같은 타입 한정자(type qualifier)를 손쉽게 추가할 수 있게 해준다. JavaCOP은 이 아이디어를 자바 쪽으로 확장하여 객체 한정(object confinement)나 레이스 컨디션 검사 등을 자동화하는 것이다.

스크립트 언어를 위시한 한 쪽에서는 그나마 있던 컴파일 타임 검사도 안 하는 판인데, 학계에서는 각종 검사를 컴파일 타임에 조금이라도 더할 수 있게 만들고, 또 언어 사용자가 이런 검사를 추가할 수 있는 프레임워크를 만들고 있다는 게 참 재미난 현상이다.

« PREV : 1 : ··· : 46 : 47 : 48 : 49 : 50 : 51 : 52 : ··· : 82 : NEXT »