blob: 8240a504f35d278e15eb78b139e7bd8e89c51228 [file] [log] [blame]
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.provide("dojo.lang.type");
dojo.require("dojo.lang.common");
dojo.lang.whatAmI = function(value) {
dojo.deprecated("dojo.lang.whatAmI", "use dojo.lang.getType instead", "0.5");
return dojo.lang.getType(value);
}
dojo.lang.whatAmI.custom = {};
dojo.lang.getType = function(/* anything */ value){
// summary: Attempts to determine what type value is.
// value: Any literal value or object instance.
try{
if(dojo.lang.isArray(value)){
return "array"; // string
}
if(dojo.lang.isFunction(value)){
return "function"; // string
}
if(dojo.lang.isString(value)){
return "string"; // string
}
if(dojo.lang.isNumber(value)){
return "number"; // string
}
if(dojo.lang.isBoolean(value)){
return "boolean"; // string
}
if(dojo.lang.isAlien(value)){
return "alien"; // string
}
if(dojo.lang.isUndefined(value)){
return "undefined"; // string
}
// FIXME: should this go first?
for(var name in dojo.lang.whatAmI.custom){
if(dojo.lang.whatAmI.custom[name](value)){
return name; // string
}
}
if(dojo.lang.isObject(value)){
return "object"; // string
}
}catch(e){}
return "unknown"; // string
}
dojo.lang.isNumeric = function(/* anything */ value){
// summary:
// Returns true if value can be interpreted as a number
// value: Any literal value or object instance.
// examples:
// dojo.lang.isNumeric(3); // returns true
// dojo.lang.isNumeric("3"); // returns true
// dojo.lang.isNumeric(new Number(3)); // returns true
// dojo.lang.isNumeric(new String("3")); // returns true
//
// dojo.lang.isNumeric(3/0); // returns false
// dojo.lang.isNumeric("foo"); // returns false
// dojo.lang.isNumeric(new Number("foo")); // returns false
// dojo.lang.isNumeric(false); // returns false
// dojo.lang.isNumeric(true); // returns false
return (!isNaN(value)
&& isFinite(value)
&& (value != null)
&& !dojo.lang.isBoolean(value)
&& !dojo.lang.isArray(value)
&& !/^\s*$/.test(value)
); // boolean
}
dojo.lang.isBuiltIn = function(/* anything */ value){
// summary:
// Returns true if value is of a type provided by core JavaScript
// description:
// Returns true for any literal, and for any object that is an
// instance of a built-in type like String, Number, Boolean, Array,
// Function, or Error.
// value: Any literal value or object instance.
return (dojo.lang.isArray(value)
|| dojo.lang.isFunction(value)
|| dojo.lang.isString(value)
|| dojo.lang.isNumber(value)
|| dojo.lang.isBoolean(value)
|| (value == null)
|| (value instanceof Error)
|| (typeof value == "error")
); // boolean
}
dojo.lang.isPureObject = function(/* anything */ value){
// summary:
// Returns true for any value where the value of value.constructor ==
// Object
// description:
// Returns true for any literal, and for any object that is an
// instance of a built-in type like String, Number, Boolean, Array,
// Function, or Error.
// value:
// Any literal value or object instance.
// examples:
// dojo.lang.isPureObject(new Object()); // returns true
// dojo.lang.isPureObject({a: 1, b: 2}); // returns true
//
// dojo.lang.isPureObject(new Date()); // returns false
// dojo.lang.isPureObject([11, 2, 3]); // returns false
return ((value != null)
&& dojo.lang.isObject(value)
&& value.constructor == Object
); // boolean
}
dojo.lang.isOfType = function(/* anything */ value, /* function */ type, /* object? */ keywordParameters) {
/* summary:
* Returns true if 'value' is of type 'type'
* description:
* Given a value and a datatype, this method returns true if the
* type of the value matches the datatype. The datatype parameter
* can be an array of datatypes, in which case the method returns
* true if the type of the value matches any of the datatypes.
* value: Any literal value or object instance.
* type: A class of object, or a literal type, or the string name of a type, or an array with a list of types.
* keywordParameters: {optional: boolean}
*/
/* examples:
* dojo.lang.isOfType("foo", String); // returns true
* dojo.lang.isOfType(12345, Number); // returns true
* dojo.lang.isOfType(false, Boolean); // returns true
* dojo.lang.isOfType([6, 8], Array); // returns true
* dojo.lang.isOfType(dojo.lang.isOfType, Function); // returns true
* dojo.lang.isOfType({foo: "bar"}, Object); // returns true
* dojo.lang.isOfType(new Date(), Date); // returns true
*
* dojo.lang.isOfType("foo", "string"); // returns true
* dojo.lang.isOfType(12345, "number"); // returns true
* dojo.lang.isOfType(false, "boolean"); // returns true
* dojo.lang.isOfType([6, 8], "array"); // returns true
* dojo.lang.isOfType(dojo.lang.isOfType, "function"); // returns true
* dojo.lang.isOfType({foo: "bar"}, "object"); // returns true
* dojo.lang.isOfType(xxxxx, "undefined"); // returns true
* dojo.lang.isOfType(null, "null"); // returns true
*
* dojo.lang.isOfType("foo", [Number, String, Boolean]); // returns true
* dojo.lang.isOfType(12345, [Number, String, Boolean]); // returns true
* dojo.lang.isOfType(false, [Number, String, Boolean]); // returns true
*
* dojo.lang.isOfType(null, Date, {optional: true} ); // returns true // description:
*/
var optional = false;
if(keywordParameters){
optional = keywordParameters["optional"];
}
if(optional && ((value === null) || dojo.lang.isUndefined(value))){
return true; // boolean
}
if(dojo.lang.isArray(type)){
var arrayOfTypes = type;
for(var i in arrayOfTypes){
var aType = arrayOfTypes[i];
if(dojo.lang.isOfType(value, aType)){
return true; // boolean
}
}
return false; // boolean
}else{
if(dojo.lang.isString(type)){
type = type.toLowerCase();
}
switch (type) {
case Array:
case "array":
return dojo.lang.isArray(value); // boolean
case Function:
case "function":
return dojo.lang.isFunction(value); // boolean
case String:
case "string":
return dojo.lang.isString(value); // boolean
case Number:
case "number":
return dojo.lang.isNumber(value); // boolean
case "numeric":
return dojo.lang.isNumeric(value); // boolean
case Boolean:
case "boolean":
return dojo.lang.isBoolean(value); // boolean
case Object:
case "object":
return dojo.lang.isObject(value); // boolean
case "pureobject":
return dojo.lang.isPureObject(value); // boolean
case "builtin":
return dojo.lang.isBuiltIn(value); // boolean
case "alien":
return dojo.lang.isAlien(value); // boolean
case "undefined":
return dojo.lang.isUndefined(value); // boolean
case null:
case "null":
return (value === null); // boolean
case "optional":
dojo.deprecated('dojo.lang.isOfType(value, [type, "optional"])', 'use dojo.lang.isOfType(value, type, {optional: true} ) instead', "0.5");
return ((value === null) || dojo.lang.isUndefined(value)); // boolean
default:
if(dojo.lang.isFunction(type)){
return (value instanceof type); // boolean
}else{
dojo.raise("dojo.lang.isOfType() was passed an invalid type");
}
}
}
dojo.raise("If we get here, it means a bug was introduced above.");
}
dojo.lang.getObject=function(/* String */ str){
// summary:
// Will return an object, if it exists, based on the name in the passed string.
var parts=str.split("."), i=0, obj=dj_global;
do{
obj=obj[parts[i++]];
}while(i<parts.length&&obj);
return (obj!=dj_global)?obj:null; // Object
}
dojo.lang.doesObjectExist=function(/* String */ str){
// summary:
// Check to see if object [str] exists, based on the passed string.
var parts=str.split("."), i=0, obj=dj_global;
do{
obj=obj[parts[i++]];
}while(i<parts.length&&obj);
return (obj&&obj!=dj_global); // boolean
}