Running the Memory tests in other browsers revealed problems with `toString.call()`. In Firefox, it ends up returning `"Window"` in all cases and ignores the argument you pass it. It looks like the most reliable method is `Object.prototype.toString.call()`:

    Object.prototype.toString.call(/ /)
    "[object RegExp]"
    Object.prototype.toString.call('')
    "[object String]"
    Object.prototype.toString.call([])
    "[object Array]"
    Object.prototype.toString.call({})
    "[object Object]"

I'm unfortunately not able to verify that the results are the same in IE6+ as they are in Chrome, Firefox, Safari and Opera.

An alternative approach would be to store the master queries in an array with references to the original `query` and `options` objects. The `materialize()` method would then iterate over the array and perform a deep comparison on both objects to determine if the queries are the same. This approach breaks down once you have a large number queries and relies on a stable deep comparison algorithm (which I believe is not provided in the Dojo core). Either way we end up writing some kind of recursive method for analyzing the `query` and `options` objects. The benefit of the hashing approach is a faster lookup and comparison time, assuming you can avoid collisions when converting to a string across different browsers.