http://perfectionkills.com/javascript-quiz/
perfectionkills 블로그에 있는 자바스크립트 퀴즈 14개를 나름대로 풀어봤습니다.(블로그에 가면 채점도 가능)
답은 검증했는데, 문제가 좀 어려워서 풀이가 틀린 부분도 있을것 같습니다.
1.
(function(){
return typeof arguments;
})();
- 2.
var f = function g(){ return 23; };
typeof g();
- 3.
(function(x){
delete x;
return x;
})(1);
- 4.
var y = 1, x = y = typeof x;
x;
- 5.
(function f(f){
return typeof f();
})(function(){ return 1; });
- 6.
var foo = {
bar: function() { return this.baz; },
baz: 1
};
(function(){
return typeof arguments[0]();
})(foo.bar);
- 7.
var foo = {
bar: function(){ return this.baz; },
baz: 1
}
typeof (f = foo.bar)();
- 8.
var f = (function f(){ return "1"; }, function g(){ return 2; })();
typeof f;
- 9.
var x = 1;
if (function f(){}) {
x += typeof f;
}
x;
- 10.
var x = [typeof x, typeof y][1];
typeof typeof x;
- 11.
(function(foo){
return typeof foo.bar;
})({ foo: { bar: 1 } });
- 12.
(function f(){
function f(){ return 1; }
return f();
function f(){ return 2; }
})();
- 13.
function f(){ return f; }
new f() instanceof f;
- 14.
with (function(x, undefined){}) length;
1) arguments 타입은 object 입니다.
답: object
2) g()는 외부에서 사용할 수 없는 f의 프로퍼티 이고, g 함수 내부에서는 사용 가능합니다.
답: Error
3) IIFE 사용, 내부 선언된 변수는 삭제가 불가능합니다. delete x(= false)
답: 1
4) 콤마는 개행과 같고, 나머지는 오른쪽에서 왼쪽으로 연산이 수행됩니다.
최초 x는 값이 없으므로 typeof 반환 값은 "undefined" 입니다.
따라서 y, x 순서로 "undefined" 라는 문자열이 들어갑니다.
답: "undefined"
여기서 undefined와 "undefined"의 차이는?
undefined는 windows.undefined로 전역에 선언된 기본 자료형입니다.
typeof는 문자열로 값의 유형을 반환하는 연산자입니다.
5) IIFE 사용, function() {return 1;} object가 생성되어 f 변수로 전달되고,
내부에서 f()를 호출하고 f()는 반환값 1을 반환하고 typeof는 1의 타입을 반환합니다.
답: "number"
6) IIFE 사용, foo의 bar 프로퍼티를 파라메터로 전달하므로 arguments[0] 은 bar 입니다.
bar는 function() {return this.baz ; }를 가진 object 인데, bar 함수가 this를 사용합니다.
bar를 호출한 함수의 context 체인에는 baz 프로퍼티가 없습니다.
(프로퍼티로 실행되는게 아니니까 메서드가 아니라 함수로 지칭)
답: "undefined"
7) foo.bar 프로퍼티의 함수를 f에 대입해서 호출하는데 f의 리턴이 this를 사용합니다.
하지만 6번 문제와 마찬가지로 f를 호출한 context 체인에는 baz가 없습니다.
답: "undefined"
8) f(), g() 함수가 순차적으로 호출되고 마지막 리턴값인 g()의 반환값인 2를 f에 대입합니다.
답: "number"
9) if 구문에 상태값은 ture, false로 평가되는 표현식이므로 function f(){}는 function으로 평가되므로 ture 입니다.
하지만 f가 사용가능한 범위는 if() 괄호 안으로 한정되므로 그 범위를 벗어난 f는 존재하지 않습니다.
답: "1undefined"
10) ["undefined", "undefind"] object를 생성하고 [1] 프로퍼티를 접근한 값을 x에 대입했습니다.
[0] = ["undefined"] // typeof x;
[1] = ["undefined"] // typeof y;
x의 값은 "undefind" 이고 typeof 반환값은 "string" 입니다.
한번더 typeof를 해도 "string" 입니다.
답: "string"
11) {foo: {bar: 1}} object를 foo에 파라메터로 전달했습니다.
bar에 접근하기 위해서는 foo = {foo: {bar:1}}가 되므로 bar에 접근하기 위해서는 foo.foo.bar가 되어야 합니다.
답: "undefined"
12) 함수 스코프 내에서 선언된 함수는 인터프리터가 동작할 때 함수 끌어올림(function hoisting)에 의해서 상단으로 끌어올려집니다.
자바스크립트는 함수 오버로딩이 지원되지 않기 때문에 같은 이름을 가진 함수를 두번 선언 경우 마지막 선언된 함수로 덮어씌워집니다.
따라서, 마지막에 선언된 f()가 리턴하는 값이 출력됩니다.
답: 2
13) f()와 f 둘 다 "function" 타입인데, f()의 prototype 체인에 f가 존재하지 않습니다.
false
14) with를 사용하면 with의 괄호 안은 표현식의 실행 context가 됩니다.
즉 with의 {} 범위 안은 function(x, undefined){}의 실행 context로 변경되므로
이름 없는 함수의 프로퍼티를 사용할 수 있게 됩니다. (caller, name, length, arguments)
length는 함수의 파라메터 개수를 가지고 있으므로 답은 2입니다.
답: 2
#4, #10 Thanks to
http://stackoverflow.com/questions/5663277/what-is-the-difference-between-undefined-and-undefined
quiz.pdf