Ответ 1
В эти дни (CF8 +) разница в скорости не так уж велика. Однако structKeyExists
действительно немного быстрее. Вот почему.
Когда вы используете isDefined
, строка, в которую вы проходите, выполняется поиск в качестве имени ключа в нескольких областях. Начиная с CF9, список областей в проверенном порядке: (источник)
- Локальные (только локальные функции, UDF и CFC)
- Аргументы
- Поток локальный (только внутри потоков)
- Запрос (не истинная область применения, применяется для переменных в циклах запросов)
- Тема
- Переменные
- CGI
- CFFile
- URL
- Форма
- Cookie
- Клиент
Даже если вы используете имя области с помощью isDefined
(например: if isDefined('variables.foo')
), список по-прежнему будет проверяться по порядку; и если определена переменная local.variables.foo
, она будет найдена до variables.foo
.
С другой стороны, structKeyExists
выполняет поиск только структуры, которую вы передаете, для существования имени ключа; поэтому их гораздо меньше, чем нужно.
Используя более явный код (structKeyExists
), вы не только получаете некоторую производительность, но и, по моему мнению, ваш код более читабельен и поддерживается.