Mam kodu javascript, który wygląda tak:Jak zmusić JavaScript do głębokiego kopiowania ciągu znaków?
var myClass = {
ids: {}
myFunc: function(huge_string) {
var id = huge_string.substr(0,2);
ids[id] = true;
}
}
Później funkcja jest wywoływana z niektórych dużych ciągów (100 MB +). Chcę tylko zapisać krótki identyfikator, który znajduję w każdym ciągu. Jednak funkcja podłańcuchowa Google Chrome (w rzeczywistości regex w moim kodzie) zwraca tylko obiekt "plasterki", który odwołuje się do oryginału. Więc po serii wywołań do myFunc
, na mojej zakładce chrome zabraknie pamięci, ponieważ tymczasowe obiekty huge_string
nie mogą być zbędne.
Jak utworzyć kopię ciągu id
, aby nie utracić odniesienia do huge_string
, a huge_string
może zostać zbuforowany?
' "" + slice' nie wydaje się do pracy, ani nie' "" + plaster + "" '. Próbuję innych podejść. – AffluentOwl
* "Funkcja podłańcuchowa (w rzeczywistości regex w moim kodzie) zwraca jedynie obiekt" plasterki ", który odwołuje się do oryginału" * - Huh? '.substr()', '.substring()', '.slice()', a wszystkie odpowiednie funkcje regex zwracają * nowy * ciąg znaków. Czy drugi kod wywołuje funkcję "myClass.myFunc()", zachowując odwołanie do Twojego ogromnego ciągu? Jeśli twój prawdziwy kod jest bardziej złożony, czy przypadkiem nie trzyma wielkich łańcuchów w zamknięciach? – nnnnnn
@nnnnnn Nie można stwierdzić, czy jest to "nowy" ciąg znaków * dane * z JavaScript; implementacje * mogą * udostępniać podstawowe dane bez naruszania jakiejkolwiek części ECMAScript. Firefox ma pół tuzina [różnych implementacji ciągów] (https://blog.mozilla.org/ejpbruel/2012/02/06/how-strings-are-implemented-in-spidermonkey-2/) (zobacz w szczególności JSDependentString) i nie jestem zaskoczony, jeśli Chrome ma podobne optymalizacje (które mogą działać niepożądanie w niektórych skrajnych przypadkach). Biorąc to pod uwagę ... nie byłbym strasznie zaskoczony, gdyby to był czerwony śledź. – user2864740