
Advanced Javascript tips and tricks - ck2
http://code.google.com/p/jslibs/wiki/JavascriptTips#language_advanced_Tips_&_Tricks
======
tomstuart

      list = list.sort(function() Math.random() - 0.5);
    

Please don't shuffle an array like this. Array.prototype.sort requires the
comparison function to be referentially transparent (i.e. to always return the
same result when given the same two elements to compare), otherwise the sort
order is undefined. For example, imagine how far from "shuffled" the resulting
array will be if a bubble sort is used with a randomised comparison function.

Use a Fisher-Yates shuffle instead.

~~~
yid
While I agree in principle, there are many cases where you don't care about
the statistical quality of a random shuffle, where brevity has its benefit.

~~~
photon_off
I think there's also an issue of performance -- it's possible, though
unlikely, that the sort could take forever to complete.

~~~
yid
Unlikely is an understatement -- the probability of an infinite sequence of
PRNG outputs that prevents any sort algorithm from terminating is negligible.

~~~
wlievens
What about 'taking too much time' though?

~~~
yid
Touche...

------
ErikCorry
Lots of the stuff in this list is only available in Mozilla browsers. It's not
part of the ECMAScript standard:

yield

Optional named function arguments

let (in the 'remove an object from an array' example)

"Convert a string into a charcode list" (both methods)

toSource method on an array ("Array iteration pitfall")

etc.

------
ck2
BTW I also just noticed Resig's next advanced JS book is almost done
(finally!)

<http://www.manning.com/resig/>

and there is a 50% off code that is working for July 4th - _july450_

which makes it $16 for the early-edition PDF-only version

(or $20+$5 shipping for dead-tree version but it's $25 on amazon anyway)

If I learn just one new trick for $16 it's probably worth it.

~~~
thomas11
I'm not sure if it's "almost done". I bought the MEAP (early access) a long
time ago, and for months nothing happened at all. Then a second author came on
board to get things moving.

A few days ago I got an update from Manning:

    
    
        "What's new?
        Chapter 2, "Testing and Debugging" has been added.
        Chapter 3, "Functions are fundamental" has been revised.
    
        What's next?
        Our next update will be coming quickly, with revised versions of Chapter 4 on closures and Chapter 5 on object-orientation with prototypes.
    

I haven't bothered yet to actually look at the PDF, it sounds like it's still
in a rather early stage.

~~~
niels
Ha ha, yep I bought the MEAP version of this book almost three years ago.
Can't believe it's not finished yet.

~~~
gcb
inb4 duke nuken forever jokes

------
ck2
Some more goodies here:

[http://stackoverflow.com/questions/724826/javascript-tips-
an...](http://stackoverflow.com/questions/724826/javascript-tips-and-tricks-
javascript-best-practices)

[http://stackoverflow.com/questions/61088/hidden-features-
of-...](http://stackoverflow.com/questions/61088/hidden-features-of-
javascript)

------
yid
Wow, I'm seriously overjoyed to discover the "yield" operator, which I did not
know existed (it barely shows up anywhere!). No more hackishly using
_window.setTimeout()_ to yield in JS pseudo-thread simulations!

~~~
ck2
Just note the small print that _yield_ is JS 1.7

Firefox 2 was the first to have JS 1.7 but I dunno if any version of IE has
yield, maybe IE9 ?

~~~
masklinn
Javascript 1.x where x > 5 are proprietary extensions of Mozilla.

Some of those extensions (e.g. Array Extras) trickled into the wider language,
but as far as I know most of them (including let and generators) are confined
to Gecko-based browsers still.

------
ck2
There is a handy index of them all near the bottom:

[http://code.google.com/p/jslibs/wiki/JavascriptTips#delete_a...](http://code.google.com/p/jslibs/wiki/JavascriptTips#delete_array_element)

------
IanDrake
I use the pattern listed under "Objects private and public members" frequently
and feel they missed an important point.

They really should add something like:

function MyConstructor( pub, priv ) {

    
    
      var thisMyConstructor = this; //**Copy the 'this' variable**
    
      var privateVariable = priv;
    
      this.publicVariable = pub;
    
    

Otherwise "public" variables can't be accessed in private functions because
"this" no longer references the object. So, from what I've learned it's always
best to copy "this" to a private variable and use the private variable for
consistency.

------
tlrobinson
Most of these tricks involve non-standard features of Mozilla's dialect of
JavaScript.

------
Yansky
I don't understand the need for the first example:
Array.prototype.push.apply(a, b);

Isn't that what the concat() method is for?

~~~
tomstuart
Array.prototype.push.apply(a, b) modifies _a_ in-place; a.concat(b) returns a
copy of _a_ with _b_ appended to it.

------
perlgeek
I find some of them horribly obscure

    
    
         +new Date() // 1259359833574
    

Oh come on, magic constants? How do you check if that's the right number?

    
    
        function PrefixInteger(num, length) {
    
            return (num / Math.pow(10, length)).toFixed(length).substr(2);
         }
    

Is there no sprintf in Javascript? Or did I misunderstand what the function
does?

~~~
walrus
"1259359833574" isn't a magic constant. JavaScript uses // for comments. The
number is just an example of the possible output of the expression "+new
Date()" (specifically, it was the time at which the author of that page
evaluated the expression).

~~~
altano
Right, and it's equivalent to the more readable

    
    
        Number(new Date())
    

or more simply

    
    
        Date.now()
    

if you don't need IE8 support.

