Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   странная ситуация (https://javascript.ru/forum/node-js-io-js/85432-strannaya-situaciya.html)

fxobject 20.08.2023 11:53

странная ситуация
 
Доброго дня!
Вот примерно такая ситуация, имеем (для простоты сокращаю текст):
let logInfo = { queryVAR : { abonent: false }.......};
return __this.addRecordInUserLog( options,logInfo ) - это promise
ниже представлена цепочка вызовов
addRecordInUserLog
readAbonentRecord
initSQLVAR
и вот в послледней процедуре initSQLVAR стоит строка
...... код initSQLVAR ......
argument.queryVAR['abonent'] = true;
т.е. меняется базовое (начальное) значение параметра.
так вот что получается (смотрим отладчиком)
уже на первой строке функции readAbonentRecord этот параметр уже установлен в true!!!!
т.е. перед заходом в функцию - false, только зашли - сразу true
меняем присвоение в функции initSQLVAR
например argument.queryVAR['abonent'] = 'hello world'
теперь сразу как только заходим в функцию readAbonentRecord - получаем 'hello world'
И последнее
если иницциализируем переменную как строку:
let logInfo = { queryVAR : { abonent: "false" }.......};
то таких замещений не происходит

help me!!!!!
p.s.
- в других местах присвоения argument.queryVAR['abonent'] нет

Nexus 20.08.2023 12:49

Почитайте: https://learn.javascript.ru/object-copy

fxobject 20.08.2023 13:13

разницу работы с переменными по ссылкам и работа с переменными созданными на стеке или в памяти я понимаю.
поясню вопрос.
1 передаем в функцию переменную (по ссылке)
2 код еще не дошел до строки в которой происходит модификация данной переменной, а переменная уже изменилась в соответствии со строкой кода
мы еще не дошли до строки в которой модифицируется код!!!

fxobject 20.08.2023 14:01

переделал логику и забил.
вдогонку вот такой еще момент:
это код процедуры
initSQLVAR(argument){
    let queryVAR  = '';
    let queryText = '';
    if( argument.queryVAR === undefined ) argument.queryVAR = {}
    else{ if(argument.queryVAR[argument.table] === true ) return ''; }
    //--- перебираем поля таблицы базы данных -----------------------------------------------------
    for (let item in global.system.schemaSQL[argument.table]){
      let varSQL = '@'+argument.table+'_'+item;
      if( argument.queryVAR[argument.table] ){
        queryVAR  += 'DECLARE '+varSQL+' '+global.system.schemaSQL[argument.table][item].typeData+';\n' }
      queryText += (queryText.length === 0 ? '' : ',') + varSQL+'='+item;
    }
    //---
    if( queryVAR.length > 0) queryVAR = "/*   декларация переменных*/\n"+queryVAR
    //--- присоединение к описанию переменных текста запроса --------------------------------------
    queryVAR += '/*   запрос инициализации декларированных переменных*/\nselect '+ queryText+' from [dbo].'+ argument.table
    if( argument.ROWID !== undefined ) queryVAR += ' where ROWID='+ argument.ROWID;
    argument.queryVAR[argument.table] = 'world';
    return queryVAR+';\n'
  }

в таком варианте когда заходим (глубоко вверху по иерархии ) переменная проинициализированная в false сразу после вызова следующего уровня иерархии принимает значение
argument.queryVAR[argument.table] = 'world';
но если в этом процедуре строку
if( argument.queryVAR[argument.table] ){
заменить на
if( argument.queryVAR[argument.table] === undefined ){
все работает как надо.
понимаю что какой то глюк в коде, но очень странное поведение JS
вопрос снят, thanks

Aetae 20.08.2023 17:33

fxobject, в консоли тоже объекты по ссылке. Т.е. в консоли ты видишь последнее состояние объекта, а не то что было при console.log. Если тебе важно узнать точное состояние - используй JSON.stringify и т.п.


Часовой пояс GMT +3, время: 20:05.