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 설명