Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.08.2023, 11:53
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

странная ситуация
Доброго дня!
Вот примерно такая ситуация, имеем (для простоты сокращаю текст):
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'] нет
Ответить с цитированием
  #2 (permalink)  
Старый 20.08.2023, 12:49
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Почитайте: https://learn.javascript.ru/object-copy
Ответить с цитированием
  #3 (permalink)  
Старый 20.08.2023, 13:13
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

разницу работы с переменными по ссылкам и работа с переменными созданными на стеке или в памяти я понимаю.
поясню вопрос.
1 передаем в функцию переменную (по ссылке)
2 код еще не дошел до строки в которой происходит модификация данной переменной, а переменная уже изменилась в соответствии со строкой кода
мы еще не дошли до строки в которой модифицируется код!!!
Ответить с цитированием
  #4 (permalink)  
Старый 20.08.2023, 14:01
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

переделал логику и забил.
вдогонку вот такой еще момент:
это код процедуры
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
Ответить с цитированием
  #5 (permalink)  
Старый 20.08.2023, 17:33
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переменная в селекторе Jquery - странная ошибка kapustnik jQuery 11 17.10.2013 10:13
Странная ситуациЯ с оперой VIP-club Opera, Safari и др. 9 11.05.2011 17:27
Странная работа в Хроме и Сафари Flake jQuery 1 08.09.2010 10:28
Странная ситуация. igsavenko Общие вопросы Javascript 5 23.02.2010 10:04
Странная ошибка в jquery-1.2.6.js (я в ступоре) mindwork jQuery 15 15.05.2009 17:27