Tuesday, January 7, 2014

javascript의 for와 C#의 foreach를 구분하기

js의 for는 마치 foreach처럼 쓸 수 있지만 for 내에서 선언한 variable이(이걸 뭐라고 불러야 하는 거지? iteration 계의 this 같은 그 무언가...)이 key-value pair의 value가 아니라 key라는 점이 C#과 다르다. 즉,

in C#,
foreach (var item in container) {
   item.DoSomething();
}

in js,
for(var property in obj) {
   var item = obj[property];
   item.doSomething();
}

PHP가 출동하면 어떨까?

meanwhile in PHP,
foreach($container as $item) {
    $item.doSomething();
}

아오 이색휘는 왜 순서가 반대여...
하지만 여기에도 나름의 장점이 있으니...

foreach($container as $key=>$value) {
    echo $key . ': ' . $value.toString();
}

이런 무시무시한 문법이 가능하다.

그러면 이들 중에서 C#이 제일 나쁜가하면 그건 아니다. 취존이겠지만 C#이 가장 좋아 보인다.
일단 PHP 문법은 영어 어순에 안 맞는다. For each item in container라고 하지 For each container xxx라고는 안 한다. (For each item in container as (k, v)라고 할 수는 있으려나...)
다음으로 index가 필요한 경우에는 foreach가 아니라 그냥 for를 쓰면 된다. foreach를 그냥 유지하면서 index도 쓰고 싶으면 변수를 하나 선언하고 foreach 안에서 increment/decrement하면 된다. Scope 때문에 귀찮아질 수도 있지만.
마지막으로 dictionary인 경우에는 key 필요 여부에 따라 달리 쓰면 된다.
var output="";
foreach(var key in dic.Keys) {
   output+=key + ": ";  // key1: value1, ...
   output+=dic[keys];
}
foreach(var value in dic.Values) {
   output+=value;
}
C++와 비교해도, C#은 key set을 바로 얻을 수 있어서 좋다.

js의 for는 그것 나름으로는 괜찮은 것 같지만 C#을 먼저 배운 사람에게는 가장 헷갈리는 것 종류가 될 것 같다.
게다가 for loop을 돌리는 대상이 Array 또는 객체 모두가 되기 때문에 혼란이 가중된다. 즉 object인줄 알았는데 array인  경우 기대했던 값이 안 나오고 죄다 undefined가 뜬다든가...

No comments:

Post a Comment

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...