Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Копирование строк (касательно памяти) (https://javascript.ru/forum/misc/44422-kopirovanie-strok-kasatelno-pamyati.html)

Hapson 19.01.2014 01:29

Копирование строк (касательно памяти)
 
Всем привет!
Такой вот у меня вопрос. Искал, читал, но что-то внятного ничего не нашел. Интересует меня вот что...
Допустим есть у меня строка, скажем 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 займет еще столько же памяти... или нет?

Яростный Меч 19.01.2014 03:18

Цитата:

Сообщение от Hapson
Если я переменной str2 присвою str1, то str2 займет еще столько же памяти... или нет?

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

а вот в случае, например, var str2 = str1 + "aaa", в str2 попадет ссылка уже на новый объект.

Hapson 19.01.2014 04:14

Яростный Меч,
Понятно.
Ну у меня получается как...
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 короче, поэтому и перекладываю.

рони 19.01.2014 06:02

:write:
если сам обьект не менять ссылка останется прежней иначе ссылка ведёт на новый обьект
var obj1 = { a: 42 };
var obj2 = obj1;
obj1.b = 100500 ;
alert(JSON.stringify(obj2))

Яростный Меч 19.01.2014 12:42

Цитата:

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

обработка строки (замена слов, символов...)

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

потому если можешь воспользоваться замененной строкой несколько раз - сохрани ее в другую переменную.

Hapson 19.01.2014 13:18

Цитата:

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

потому если можешь воспользоваться замененной строкой несколько раз - сохрани ее в другую переменную.

Ну да, так я и делю. Я просто забыл, что при изменении строки фактически создается новая строка.


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