Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.01.2014, 01:29
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Копирование строк (касательно памяти)
Всем привет!
Такой вот у меня вопрос. Искал, читал, но что-то внятного ничего не нашел. Интересует меня вот что...
Допустим есть у меня строка, скажем 5000 символов. Эту строку я выдираю из html документа и потом около 10 функций поочередно с ней работают. Вопрос в потреблении памяти. Как более рационально мне передавать эту строку между функциями. Код мой оформлен в таком виде:
var NewLib = (function(){

return{

data: {
	string: 'та самая строка'
}

func1: function(){
	
},

func2: function(){
	
},

..........

funcN: function(){
	
}

};
}());


В NewLib.data.string я записываю строку и нижеследующие функции должны с ней работать.
Как лучше:
1) передавать строку явно в параметры функций
2) пусть функции просто обновляют NewLib.data.string

Что происходит если делается так:

var str1 = 'длинная строка';
var str2 = str1;


Как я понимаю, переменная str1 при присваивании ей значения занимает определенное место в памяти. Если я переменной str2 присвою str1, то str2 займет еще столько же памяти... или нет?
Ответить с цитированием
  #2 (permalink)  
Старый 19.01.2014, 03:18
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от Hapson
Если я переменной str2 присвою str1, то str2 займет еще столько же памяти... или нет?
нет.
В JS (и ряде других языков) строка есть объект, только неизменяемый. str1 - лишь ссылка на данные. в str2 будет ссылка на те же данные.

а вот в случае, например, var str2 = str1 + "aaa", в str2 попадет ссылка уже на новый объект.
Ответить с цитированием
  #3 (permalink)  
Старый 19.01.2014, 04:14
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Яростный Меч,
Понятно.
Ну у меня получается как...
csx.data.code - это исходная строка.


В функции я ее не передаю, они сами ее берут так:

var csx = (function(){return {

data: {
    code: ''
}

func: function(){
    var code = csx.data.code;
    .........
    обработка строки (замена слов, символов...)
    .........
    csx.data.code = code;
}

};}())


То есть функция взяла строку извне и положида ее в свою локальную переменную. Обработала эту переменную и обновила ею внешнюю строку.
Как-то коряво, но иначе неудобно. В любом случае внутри каждой функции-обработчика будет создаваться новая строка на время работы функции.

PS неудобно использовать csx.data.code. Просто code короче, поэтому и перекладываю.

Последний раз редактировалось Hapson, 19.01.2014 в 04:16.
Ответить с цитированием
  #4 (permalink)  
Старый 19.01.2014, 06:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123


если сам обьект не менять ссылка останется прежней иначе ссылка ведёт на новый обьект
var obj1 = { a: 42 };
var obj2 = obj1;
obj1.b = 100500 ;
alert(JSON.stringify(obj2))
Ответить с цитированием
  #5 (permalink)  
Старый 19.01.2014, 12:42
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от Hapson
Как-то коряво, но иначе неудобно. В любом случае внутри каждой функции-обработчика будет создаваться новая строка на время работы функции.

обработка строки (замена слов, символов...)
ну тут другое дело - "замена" чего-то в строке всегда создает новую строку, поскольку сама строка неизменяема.

потому если можешь воспользоваться замененной строкой несколько раз - сохрани ее в другую переменную.
Ответить с цитированием
  #6 (permalink)  
Старый 19.01.2014, 13:18
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Сообщение от Яростный Меч Посмотреть сообщение
ну тут другое дело - "замена" чего-то в строке всегда создает новую строку, поскольку сама строка неизменяема.

потому если можешь воспользоваться замененной строкой несколько раз - сохрани ее в другую переменную.
Ну да, так я и делю. Я просто забыл, что при изменении строки фактически создается новая строка.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое удаление строк таблицы Tankist Events/DOM/Window 16 03.07.2013 16:42
Утечки памяти при использовании JSONP в IE 9 evgkar AJAX и COMET 3 28.12.2011 19:40
как посчитать количество строк niZE Общие вопросы Javascript 19 20.12.2011 13:25
Как удалить из памяти весь XML документ? EisBerg Events/DOM/Window 1 03.04.2010 14:45
Утечки памяти: как сделать ? Draeden Events/DOM/Window 10 30.08.2009 18:16