The Miller Device on null and Other Lowly Un-values
null and undefined are weird. Normally, you would check for them directly by using x === null or typeof x === undefined, etc, but what if we use the Miller Device?
An example of usage:
var myArray = [];
if(Object.prototype.toString.apply(myArray) === '[object Array]') {
// do array operations
}
Every browser gives consistent results for JavaScript’s other top level objects:
object = [object Object]
array = [object Array]
string = [object String]
number = [object Number]
NaN = [object Number]
Infinity = [object Number]
function = [object Function]
boolean = [object Boolean]
date = [object Date]
regex = [object RegExp]
error = [object Error]
Testing for null and undefined is a bit more interesting:
Firefox, Opera:
null = [object Window]
undefined = [object Window]
IE 6-8:
null = [object Object]
undefined = [object Object]
Safari:
null = [object DOMWindow]
undefined = [object DOMWindow]
Chrome/V8:
null = [object builtins]
undefined = [object builtins]
Spidermonkey console:
null = [object global]
undefined = [object global]
In each case besides IE and Chrome, the string representation of the global object is being returned. IE returns the uninteresting [object Object] string, and Chrome hints again at why it should be distinguished from Safari, at least when testing JavaScript, by returning [object builtins].
If you were to use The Miller Device to detect null or undefined, you would simply use it on both the left and right sides of the comparison:
if( Object.prototype.toString.apply( MyObject ) ===
Object.prototype.toString.apply( null ) ) {
// FAIL
}