Javascript.RU

Голосование: var1 = var1; // переприсвоение
Открытый опрос: другие пользователи будут видеть, кто как проголосовал.
Опции опроса
var1 = var1; // переприсвоение

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 16.02.2018, 12:57
Новичок на форуме
Отправить личное сообщение для Михаил Хе Посмотреть профиль Найти все сообщения от Михаил Хе
 
Регистрация: 27.03.2017
Сообщений: 9

Сообщение от Dilettante_Pro Посмотреть сообщение
Михаил Хе,
Он делает то, что написано в операторе - берет значение переменной var1 и присваивает его переменной var1.
Да, делает, но по факту (как мне вы все тут вразумили) никаких изменений в памяти, в указателях не должно происходить, как-будто строки вообще не было.

Пример

arg1 = arg1 || '';


аналогичный, при условии, что arg1 истина - тоже ничего не должно происходить (по факту состояния среды всего и всея движка).
Ответить с цитированием
  #12 (permalink)  
Старый 16.02.2018, 12:59
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,707

Вероятно после оптимизации строка "arg1 = arg1" вообще будет удалена, т.к. смысла в ней нет.
Ответить с цитированием
  #13 (permalink)  
Старый 16.02.2018, 13:05
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

Сообщение от Nexus Посмотреть сообщение
Вероятно после оптимизации строка "arg1 = arg1" вообще будет удалена, т.к. смысла в ней нет.
если она записана именно как "arg1 = arg1", то конечно будет выкинута.
в случае "arg1 = arg1 || '...'", возможно, компилятор переосмыслит её как
if (!arg1) {
 arg1 = '...';
}
Ответить с цитированием
  #14 (permalink)  
Старый 16.02.2018, 13:06
Новичок на форуме
Отправить личное сообщение для Михаил Хе Посмотреть профиль Найти все сообщения от Михаил Хе
 
Регистрация: 27.03.2017
Сообщений: 9

Сообщение от Alexandroppolus Посмотреть сообщение

Если arg1 не пустое, до операции со строкой дело не дойдет, остается arg1 = arg1.
здесь память тоже не выделяется, она уже выделена на стеке, arg1 обычная стековая переменная, просто записываются данные в ячейку памяти.
Т.е. у переменной перезапишется указатель на значение
Ответить с цитированием
  #15 (permalink)  
Старый 16.02.2018, 13:12
Новичок на форуме
Отправить личное сообщение для Михаил Хе Посмотреть профиль Найти все сообщения от Михаил Хе
 
Регистрация: 27.03.2017
Сообщений: 9

Сообщение от Nexus Посмотреть сообщение
Вероятно после оптимизации строка "arg1 = arg1" вообще будет удалена, т.к. смысла в ней нет.
Я привел усугубленный пример, допустим:

function foo(arg){ ...; return arg;}
var var1 = {};
var1 = foo(var1);
Ответить с цитированием
  #16 (permalink)  
Старый 16.02.2018, 13:18
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от Михаил Хе
Давайте вникать.
Было бы во что...
Ответить с цитированием
  #17 (permalink)  
Старый 16.02.2018, 13:20
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от Михаил Хе
допустим:

function foo(arg){ ...; return arg;}
var var1 = {};
var1 = foo(var1);
Да хоть, что допускай. Это все основы языка. Они работают беспроблемно не только в JS, а вообще в любом ЯП.
Ответить с цитированием
  #18 (permalink)  
Старый 18.02.2018, 00:55
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,126

Что за гадания на кофейной гуще. Все исходники в открытом доступе.
https://github.com/v8/v8/tree/f165df...rc/interpreter
Код не сложный и ни сказать что бы слишком большой. вполне по силам среднему разработчику.

Первое что делает интерпретатор строит лексическое дерево и на основании него генерирует байткод.
Никаких оптимизаций в этот момент не производится. Байткод сразу же готов к работе в своей вм.
Лексическое дерево разбивается на области видимости. Константы и логика в виде байт кода хранится отдельно а переменные параметры возвращаемое значение ссылки на другие области видимости хранятся в отдельной таблице ключ значение дальше в куче. смещение на эту кучу передается блоку кода при вызове ( Именно по этому работает такое понятие как поднятие переменных т.к. на момент исполнения блока кода имя переменной уже есть в таблице ключ значение для этого блока кода.). Данные хранятся отдельно от блока кода для того что бы работали такие вещи как замыкания и рекурсия.

т.е. под каждое имя в данной области видимости есть только одно место в таблице ключ значение (хеш таблица).
При интерпретации в виртуальной машине операторы строки выполняются согласно своим приоритетам каждый раз когда встречается идентификатор "arg1" идет обращение к одному и тому же месту в таблице.

Если блок кода (функция) вызывается часто или выполняется долго (интерпретатор считает время исполнения) то этот блок передается оптимизатору а там все сложно =).
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вернуть имя переменной Йакуд Общие вопросы Javascript 21 18.05.2014 10:10
посылка переменной kent0026 jQuery 5 04.01.2014 17:34
Как значение переменной вставить в имя переменной? jsgogo Общие вопросы Javascript 3 02.06.2013 12:11
Передать значение этой переменной скрипту пхп не обновляя страницы jei Общие вопросы Javascript 10 01.03.2013 18:14
Создание переменной по значению другой переменной bahek2462774 Общие вопросы Javascript 2 09.10.2011 10:11