2016-09-16 4 views
2

Будет ли JavaScript оптимизировать литерал объекта, определенный в методе? Предположим, у меня есть простая функция просмотра, который привыкает широко:Будут ли оптимизированы литералы объектов JS, определенные в функции?

function lookup(value) { 
    return { 
     "A": "a", 
     "B": "b", 
     "C": "c" 
    }[value]; 
} 

Есть ли польза для определения объекта вне функции для повторного использования, или будут двигатель оптимизирует, что далеко для меня?

+5

Первый вопрос, который приходит на ум: Какой двигатель? V8? SpiderMonkey? JScript? Какая * версия * этих двигателей? –

+0

Если функция вызывается только тогда, когда любая внутренняя memoization будет противоположной оптимизации. Объедините оба подхода, инкапсулируя таблицу в объект LookupHelper, который конструирует объект только один раз. –

+0

Никакого конкретного двигателя, просто в общем. –

ответ

-1

var object = { 
 
\t "A": "a", 
 
\t "B": "b", 
 
\t "C": "c" 
 
}; 
 

 
function lookup1(value) { 
 
    return object[value]; 
 
} 
 

 
function lookup2(value) { 
 
    return { 
 
\t \t "A": "a", 
 
\t \t "B": "b", 
 
\t \t "C": "c" 
 
\t }[value]; 
 
} 
 

 
var dateBefore = new Date().getTime(); 
 
for (var i = 0; i < 100000000; i++) { 
 
\t var a = lookup2('A'); 
 
} 
 
var dateAfter = new Date().getTime(); 
 

 
console.log(dateAfter - dateBefore); 
 

 
var dateBefore = new Date().getTime(); 
 
for (var i = 0; i < 100000000; i++) { 
 
\t var a = lookup1('A'); 
 
} 
 
var dateAfter = new Date().getTime(); 
 

 
console.log(dateAfter - dateBefore);

+1

«Есть ли какая-либо польза для определения объекта за пределами функции для повторного использования, или двигатель оптимизирует это для меня?» Первый ответ. И я показал вам. – Laurianti

+1

Спасибо за это. Не большая разница, но он отвечает на мой вопрос, что есть разница и, по крайней мере, двигатель, который использует этот тест, не оптимизирует меня. –

+0

@MichaelPayne, может быть, вы посмотрите на прямой звонок, на мой пост. –