Re: Are JavaScript strings mutable?
- From: RobG <rgqld@xxxxxxxxxxxx>
- Date: Wed, 19 Apr 2006 01:58:50 GMT
VK said on 19/04/2006 6:19 AM AEST:
Water Cooler v2 wrote:
Are JavaScript strings mutable? How're they implemented -
As a sequence of Unicode-16 characters. That also means that unlike in
low-level languages in JavaScript there is not direct relation byte <>
character. Also JavaScript doesn't have Char datatype (nor Byte for
this matter), it knows only strings containing single Unicode-16
character.
This is the max one can read out of specs IMHO because the internal
implementation was left totally up to engines' producers. So are they
mutable, immutable or carried by little green gnomes :-) depends I
guess on the particular browser.
Say in JScript and JScript.Net (IE) many parts are borrowed from the
system. In the particular JScript String object is layer on
System.String and it is immutable - as System.String itself.
So in the proposed case:
txt += "foo bar";
the engine creates anonymous string object for "foo bar", creates new
joined string, set the reference to this new string from txt and marks
both former txt and "foo bar" as GC ready.
if txt has not already been given a string value (say empty string "" or some other value), the result will be:
"undfinedfoo bar"
If you conclude from this that the string concatenations are relatively
slow in JScript - you are hundred times right :-)
You need to define relative to what. JavaScript is much slower than compiled languages, but it isn't built for speed. Consider:
Method 1: txt += 'more text';
Method 2: txt = txt + 'more text';
Method 3: txt = [txt, 'more text'].join('');
In Firefox, method 1 is fastest but all 3 methods take about the same time for say less than 10,000 concatenations.
In IE, method 3 is about as fast as Firefox method 3, but 1 takes 20 times longer than 3 and method 2 about 6 times longer than that. A test case is provided below (careful, IE takes over minute to run it, Firefox a couple of seconds).
<script type="text/javascript">
var ipsum = ['Facilisis ', 'illum ', 'et ', 'qui ', 'wisi ',
'nonummy ', 'sit, ', 'dolore ', 'delenit ', 'in ', 'ad ', 'at, ',
'vel ', 'wisi. ', 'Ut ', 'dolor ', 'nisl ', 'laoreet ', 'odio, ',
'delenit. ', 'Facilisi ', 'esse ', 'elit ', 'eu ', 'vel '];
function getRand(r){
return (Math.random()*r)|0;
}
var iterations = 30000;
var catString = '';
var catArray = [];
var j = ipsum.length;
var s = new Date();
var i = iterations;
while (i--){
catString += ipsum[getRand(j)];
}
var f = new Date();
var txt = 'Using += ' + (f-s);
s = new Date();
i = iterations;
while (i--){
catString = catString + ipsum[getRand(j)];
}
f = new Date();
txt += '<br>Using = + ' + (f-s);
s = new Date();
i = iterations;
while (i--){
catArray.push(ipsum[getRand(j)]);
}
var x = catArray.join('');
f = new Date();
txt += '<br>Using push/join ' + (f-s);
document.write(txt);
</script>
Incidentally, there is an impsum lorem generator here:
<URL:http://www.lindquist.dk/tools/LorumIpsumGenerator.asp>
--
Rob
Group FAQ: <URL:http://www.jibbering.com/FAQ>
.
- Follow-Ups:
- Re: Are JavaScript strings mutable?
- From: Dr John Stockton
- Re: Are JavaScript strings mutable?
- References:
- Are JavaScript strings mutable?
- From: Water Cooler v2
- Re: Are JavaScript strings mutable?
- From: VK
- Are JavaScript strings mutable?
- Prev by Date: Re: hidden/visible divs
- Next by Date: Re: Cross Browser Problem - IE can not find a dynamic form
- Previous by thread: Re: Are JavaScript strings mutable?
- Next by thread: Re: Are JavaScript strings mutable?
- Index(es):
Relevant Pages
|