Object(window)
никогда не будет клонировать window
, но new Object(window)
может. Все текущие - потенциально все известные - реализации просто возвращают одну и ту же ссылку, хотя спецификация допускает поведение, определяемое реализацией.
Шаги для 15.2.1.1 говорят:
blockquote>
- Если значение равно null, неопределенному или не предоставленному, создайте и верните новый объект Object точно так же, как если бы был вызван стандартный встроенный конструктор Object с теми же аргументами
- Return ToObject (значение) .
В определении
ToObject
(9.9) перечислены несколько типов, которые будут пойманы на шаге 1 (в таблице 14), но дляObject
имеется очень простое определение:Результат - входной аргумент (без преобразования).
blockquote>В нем явно указано, что входной аргумент будет возвращен как есть, поэтому они должны быть равными ссылками (
===
).Определение для
new Object
(15.2.2.1) имеет аналогичную цепочку проверок типов на шаге 1, но шаг для объектов (1.a ):i. Если значение является родным объектом ECMAScript, не создавайте новый объект, а просто возвращайте значение.
ii. Если значение является объектом-хозяином, тогда предпринимаются действия, и результат возвращается зависимым от реализации образом, который может зависеть от объекта-хоста.
blockquote>То есть для любого объекта-хоста
foo
, то вызовObject(foo)
должен=== foo
, ноnew Object(foo)
может=== foo
.Объекты хоста определены в 4.3.8 как
в среде хоста для завершения среды выполнения ECMAScript.
blockquote>В этом ответе перечислены несколько объектов-хостов, которые включают в себя
window
,history
и т. д. Запуск те, которые черезnew Object(foo)
должны (но не должны) возвращать другой объект.В любом случае передача , но объекта хоста,
new Object(foo)
представляется более сложной цепью, которая отклоняется наToObject
почти так же, какObject(foo)
.К сожалению, в 15.2.2.1.1.a.ii указано, что результат возвращается в зависимости от реализации »и не имеет каких-либо особенностей в отношении« действий [которые] приняты », и похоже, что Chrome вернет то же самое bject (равные ссылки) для всех перечисленных «объектов хоста».
Использование этого скрипта для проверки:
var objects = [ /* Native objects */ 'Object', 'Date', 'Math', 'parseInt', 'eval', /* Host objects */ 'window', 'document', 'location', 'history', 'XMLHttpRequest', 'setTimeout' ]; function getDefinedReference(name) { if (eval('typeof ' + name) !== 'undefined') { return eval(name); } else { throw new Error('' + name + ' is not defined.'); } } function checkIdentity(name) { try { var ref = getDefinedReference(name); var no = new Object(ref); var o = Object(ref); console.log(name, ref === no, ref === o, no === o); if (ref === o && no !== o) { // Make sure ref === Object(ref) but not new Object(ref) console.log(name, 'returns different references.'); } } catch (e) { console.warn(e); } } objects.forEach(checkIdentity); if (typeof window !== 'undefined') { for (var f in window) { checkIdentity(f); } }
не находит объектов, где
Object
иnew Object
ведут себя по-разному. @ Xotic750 кажется правильным, что он может быть зависимым от реализации, но никто его не использует.
Вы ищете call
функция .
compile = \
if [ $(UNAME) = $(1) ]; then \
$(MAKE) FC=$(2) FFLAGS=$(3) PETSC_FFLAGS="..." \
TARGET=$@ LEXT="$(4)_$(UNAME)" -e syst; \
else \
echo $(err_arch); \
exit 1; \
fi
debug_ifort_Linux:
$(call compile,Linux,ifort,$(difort),ifort)
, Если можно реструктурировать Ваш Makefile
немного, тем не менее, необходимо видеть, можно ли использовать make
условные выражения вместо sh
.