2017-01-19 5 views
0

Прошу прощения, я не могу быть очень конкретным для измерения того, что происходит со сценарием. Я написал этот фрагмент скрипта, чтобы понять модификацию свойства в javascripit. У меня есть переменная ctx и она имеет два свойства: ctx.exports и ctx.module.exports. Поскольку вы можете увидеть код int eh ниже, я установил отношение , поэтому, когда изменяется ctx.exports, значение ctx.module.exports имеет такое же значение. , но нижеприведенный сценарий предлагает иное.Что происходит в этом скрипте

var ctx = {}; 
 
ctx.exports = {}; 
 
ctx.module = { 
 
    exports: ctx.exports 
 
} 
 

 
ctx.exports = { 
 
    h: "hello" 
 
} 
 

 

 
if (ctx.exports == ctx.module.exports) { 
 
    console.log("hi"); 
 
} else { 
 
    console.log("hey"); 
 
}

Однако, когда я хранить значение ctx.exports локальной переменной exports в этом случае. exports становится равным ctx.module.exports на модификации ctx.exports

var ctx = {}; 
 
ctx.exports = {}; 
 
ctx.module = { 
 
    exports: ctx.exports 
 
} 
 

 
var exports = ctx.exports; 
 
ctx.exports = { 
 
    h: "hello" 
 
} 
 

 

 
if (exports == ctx.module.exports) { 
 
    console.log("hi"); 
 
} else { 
 
    console.log("hey"); 
 
}

сп кто-нибудь объяснить мне, что происходит в этом случае? это тип обзора в java-скрипте. имеет ли это собственное имя?

редактировать

в expllained первым ответе ctx.module.exports проходит проверку против {}, поэтому это совпадение. но в таком случае, почему эта неспособность

var ctx = {}; 
 
ctx.exports = {}; 
 
ctx.module = { 
 
    exports: ctx.exports 
 
} 
 

 
var exports = ctx.exports; 
 
ctx.exports = { 
 
    h: "hello" 
 
} 
 

 
if ({} == ctx.module.exports) { 
 
    console.log("hi"); 
 
} else { 
 
    console.log("hey"); 
 
}

ответ

1

Посмотрите на то, что сравнивается. В первом примере вы установили ctx.module.exports на ссылку ctx.exports, который был пустым объектом: {}. Затем вы перезаписали ctx.exports с новым значением: { h: "hello" }. ctx.module.exports сохранил ссылку на исходный объект, а ctx.exports теперь ссылается на другой объект: вы сравниваете {} с { h: "hello" }.

Во втором примере, вы снова перезапись ctx.exports с новым объектом, но вы сравниваете две ссылки на исходный объект: {} в {}. Это матч.

EDIT - для большей ясности Когда вы устанавливаете значение переменной, вы связываете имя с ссылкой. Переписывание этой переменной создает новую ссылку с тем же именем, но не изменяет ссылку, поэтому перезапись ctx.exports не повлияла ни на другую ссылку.

ИЗМЕНИТЬ ОТВЕТ НА ВОПРОСЫ ВОПРОСА Вы не можете сравнивать подобные объекты. {} !== {}, потому что каждое объявление литерала объекта создает новый экземпляр объекта. Причина, по которой ваши ссылки могут сравниваться, заключается в том, что они являются ссылками на один и тот же объект, т. Е. Тот, который создан ctx.exports = {}.

БОЛЬШЕ РЕДАКТОРОВ! Это можно увидеть, сравнивая значение JSON каждого объекта: JSON.stringify({}) == JSON.stringify(ctx.module.exports) истинно, потому что он сравнивает одинаковые строки; {} == ctx.module.exports является ложным, потому что он сравнивает разные объекты, хотя два объекта конструктивно идентичны.

+0

я отправил правку. пожалуйста, проверь это –

1

Я думаю, ваша проблема заключается не в сравнении, но с назначениями:

ctx.module = { 
    exports: ctx.exports 
} 

Это создает «звено» ctx.exports к ctx.module.exports, а сам объект не дублируется, но только это ссылка назначается до ctx.module.exports.

Но после присвоения

ctx.exports = { 
    h: "hello" 
} 

одну часть ссылки перезаписывается.

Если вы хотите добавить новое значение в sys.exports, не разрушая ссылку, вы можете использовать это:

ctx.exports.h = "hello";