2016-02-21 6 views
0

Большинство времени я использую что-то вроде этого:Как лучше проверить параметры объекта в javascript?

function(obj) { 
    obj = obj || {}; 
    // do stuff 
    var foo = obj.foo; 
} 

Но мои коллеги немного поиграл с console.time/timeEnd и обеспечил мне, что

if (obj) 
    var foo = obj.foo; 

быстрее (код может быть более сложным, , это только пример).

Но, как для меня, 1-й вариант выглядит лучше. Но мы каждый раз создавали дополнительный пустой объект (когда параметры не передавались). Я хотел бы услышать, что вы думаете, ребята. Какой метод вы используете?

+0

Ничего? Что делать, если 'obj === 1'? – theonlygusti

+0

Зависит от того, что вы хотите «obj» удерживать после утверждения. – Bergi

+1

Не выполнять [преждевременно оптимизировать] (https://en.wikipedia.org/wiki/Premature_optimisation). Любая разница, если вообще будет, будет незначительной. Используйте стандартные идиомы и сосредоточьтесь на удобочитаемости. – Bergi

ответ

1

Первый метод подходит, когда вам нужен действительный объект в obj для остальной части вашего кода, и вы хотите убедиться, что есть действительный объект только в одном месте в коде.

Второй способ подходит, если вы просто хотите проверить, прошел ли obj или нет, и что-то другое в вашем коде в зависимости от этого условия. Более надежная проверка будет:

if (typeof obj === "object") 

Таким образом, эти различные методы, которые выполняют различные цели и в основном используются в различных обстоятельствах.

Итак, ответ заключается в том, что «это зависит от того, что делает остальная часть вашего кода, и от того, что вы действительно пытаетесь выполнить в своем коде». Нет никакого ответа, который всегда правильный.

Общий шаблон дизайна для вашего первого метода используется, когда у вас есть дополнительный объект с дополнительными свойствами, и вы хотите, чтобы заполнить значения по умолчанию для отсутствующих свойств или даже если весь объект не был принят:

function doSomething(obj) { 
    var defaults = {timeout: 2000, caseSensitive: false, waitTime: 400}; 
    var options = Object.assign({}, defaults, obj); 

    // safely use options object in the rest of this function 
} 

Этот метод также безопасно работает с копией переданного объекта, поэтому объект вызывающего абонента никогда не изменяется.

0

Я бы рекомендовал использовать второй метод для проверки того, был ли объект определен или нет. Лучше всего было бы проверить на предмет, который я считаю

if(typeof object !== undefined) 

, поскольку это дает четкое понимание того, что мы пытаемся делать в случае блок

1

Первый медленнее, потому что если obj отсутствует он будет заниматься созданием объекта. Второй - это проверка и назначение, поэтому это будет быстрее, но у вас не будет obj. Если вы когда-либо зависели от присутствия obj, то используйте первый, если вы просто обратитесь к foo, а затем используйте второй.

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

Смежные вопросы