Do Not Think!!!

Posted
Filed under 01010101
얼마 전에 phpschool에서 행복한고니 님의 특이한 javascript의 표현이라는 글을 보고 new Object()와 {}는 같다고 생각했습니다. 하지만, 이에 대해 숨어지내리 님은 반대 의견을 제기하셨고, 열띤 토론이 이루어지고 있습니다.


토론 내용만 봐서는 무엇이 사실인지 구분을 할 수 없어, 직접 rhino 소스를 분석해 보았습니다.


ScriptRuntime.java - new Object() 코드 (Language : java)
  1. public static Scriptable newObject(Context cx, Scriptable scope, String constructorName, Object[] args)
  2. {
  3.     scope = ScriptableObject.getTopLevelScope(scope);
  4.     Function ctor = getExistingCtor(cx, scope, constructorName);
  5.     if (args == null) { args = ScriptRuntime.emptyArgs; }
  6.     return ctor.construct(cx, scope, args);
  7. }

ScriptRuntime.java - literal {} 코드 (Language : java)
  1. public static Scriptable newObjectLiteral(Object[] propertyIds, Object[] propertyValues, Context cx, Scriptable scope)
  2. {
  3.     Scriptable object = cx.newObject(scope);
  4.     for (int i = 0, end = propertyIds.length; i != end; ++i) {
  5.         Object id = propertyIds[i];
  6.         Object value = propertyValues[i];
  7.         if (id instanceof String) {
  8.             ScriptableObject.putProperty(object, (String)id, value);
  9.         } else {
  10.             int index = ((Integer)id).intValue();
  11.             ScriptableObject.putProperty(object, index, value);
  12.         }
  13.     }
  14.     return object;
  15. }


코드를 간단하게 해석해 보면, new Object() 코드는 instance를 반환하고, literal {} 코드는 instance를 재가공해서 반환합니다.

즉, new Object() 와 literal {}는 같은 결과를 반환하기는 하지만, 내부적으로는 다르게 구현되어 있습니다.


어렵다. JavaScript

덧. JavaScript Literals 설명

흠.. 사실 나로써는 고민 거리로 생각 해 보지도 않은 부분에 대해 요렇게나 길게 논쟁을 벌일수 있다는 자체에서 박수를 보낸다..이래나 저래나 같다고 생각 했고.. 실제로 지금까지 내 경험..

종원

잠깐 그 논쟁이라는 걸 읽어봤는데, 말꼬리 잡기도 아니고...ㅉㅉ
각자의 입장이 생기는 순간 비아냥은 시작되고...

조영운

토론 자체만 보자면, 훌륭한 토론은 아닌 것 같지만... 그래도 그 내용은 그냥 지나칠 수 있을만큼 가벼운건 아닌것 같아요.

이우용

전 그 논쟁보고 결국 new Object와 {}가 똑같은건줄 알았는데 엄연히 말하면 다른거군요.

조영운

네... 같은 역활을 하지만, 엄밀하게 말하자면 다른거죠...