JS中的变量是松散类型(即弱类型)的,可以用来保存任何类型的数据。
typeof 可以用来检测给定变量的数据类型,可能的返回值:document.write("typeof(1): " + typeof(1) + "
");
document.write("typeof(NaN): " + typeof(NaN) + "
");
document.write("typeof(Number.MIN_VALUE): " + typeof(Number.MIN_VALUE) + "
")
document.write("typeof(Infinity): " + typeof(Infinity) + "
")
document.write("typeof(\"123\"): " + typeof("123") + "
")
document.write("typeof(true): " + typeof(true) + "
")
document.write("typeof(window): " + typeof(window) + "
")
document.write("typeof(document): " + typeof(document) + "
")
document.write("typeof(null): " + typeof(null) + "
")
document.write("typeof(eval): " + typeof(eval) + "
")
document.write("typeof(Date): " + typeof(Date) + "
")
document.write("typeof(sss): " + typeof(sss) + "
")
document.write("typeof(undefined): " + typeof(undefined) + "
")
测试结果:
在 JavaScript 中,判断一个变量的类型常常会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。这就需要用到instanceof来检测某个对象是不是另一个对象的实例。
通常来讲,使用 instanceof 就是判断一个实例是否属于某种类型。instanceof 检测一个对象A是不是另一个对象B的实例的原理是:查看对象B的prototype指向的对象是否在对象A的[[prototype]]链上。如果在,则返回true,如果不在则返回false。不过有一个特殊的情况,当对象B的prototype为null将会报错(类似于空指针异常)。
测试:
function Foo(){}
Foo.prototype = new Aoo();//JavaScript 原型继承
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true
console.log(Object instanceof Object);//true
console.log(Function instanceof Function);//true
console.log(Number instanceof Number);//false
console.log(String instanceof String);//false
console.log(Function instanceof Object);//true
console.log(Foo instanceof Function);//true
console.log(Foo instanceof Foo);//false
参考资料
Object.prototype.toString().call(param) 返回param的类型(string,格式是[object class]) 。
toString() 方法可把一个逻辑值转换为字符串,并返回结果,语法为:booleanObject.toString()。刚才我说了,js中的对象都是继承的Object,这些对象都自定义的有函数或者重构了Object的部分函数,而且它们都对toString()函数进行了重写。所以我们不能像1中直接写param.prototype.toString()这样就执行的是param自己重写后的toString()函数了。最后的最后提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以都转换成小写,以防出错,Object.prototype.toString().call(param).toLowerCase()即可。
测试:
document.write("{}.toString.call(1): " + {}.toString.call(1) + "
");
document.write("{}.toString.call(NaN): " + {}.toString.call(NaN) + "
");
document.write("{}.toString.call(Number.MIN_VALUE): " + {}.toString.call(Number.MIN_VALUE) + "
")
document.write("{}.toString.call(Infinity): " + {}.toString.call(Infinity) + "
")
document.write("{}.toString.call(\"123\"): " + {}.toString.call("123") + "
")
document.write("{}.toString.call(true): " + {}.toString.call(true) + "
")
document.write("{}.toString.call(window): " + {}.toString.call(window) + "
")
document.write("{}.toString.call(document): " + {}.toString.call(document) + "
")
document.write("{}.toString.call(null): " + {}.toString.call(null) + "
")
document.write("{}.toString.call(eval): " + {}.toString.call(eval) + "
")
document.write("{}.toString.call(Date): " + {}.toString.call(Date) + "
")
document.write("{}.toString.call(undefined): " + {}.toString.call(undefined) + "
")
document.write("{}.toString.call({}): " + {}.toString.call({}) + "
")
document.write("{}.toString.call(sss): " + {}.toString.call(sss) + "
")
测试结果:
{}.toString.call(1): [object Number]
{}.toString.call(NaN): [object Number]
{}.toString.call(Number.MIN_VALUE): [object Number]
{}.toString.call(Infinity): [object Number]
{}.toString.call("123"): [object String]
{}.toString.call(true): [object Boolean]
{}.toString.call(window): [object global]
{}.toString.call(document): [object HTMLDocument]
{}.toString.call(null): [object Null]
{}.toString.call(eval): [object Function]
{}.toString.call(Date): [object Function]
{}.toString.call(undefined): [object Undefined]
{}.toString.call({}): [object Object]
参考资料:
http://www.jb51.net/article/42864.htm在W3C定义中的定义:constructor 属性返回对创建此对象的数组函数的引用。
就是返回对象相对应的构造函数。从定义上来说跟instanceof不太一致,但效果都是一样的function A(){};
function B(){};
A.prototype = new B(); //A继承自B
var aObj = new A();
alert(aobj.constructor === B)// -----------> true;
alert(aobj.constructor === A) //-----------> false;
而instanceof方法不会出现该问题,对象直接继承和间接继承的都会报true:
alert(aobj instanceof B) //----------------> true;
alert(aobj instanceof B) //----------------> true;
言归正传,解决construtor的问题通常是让对象的constructor手动指向自己:
aobj.constructor = A; //将自己的类赋值给对象的constructor属性
alert(aobj.constructor === A) //-----------> true;
alert(aobj.constructor === B) //-----------> false; //基类不会报true了;
测试:
console.log([].constructor == Array); // true
console.log({}.constructor == Object); // true
console.log("string".constructor == String); // true
console.log((123).constructor == Number); // true
console.log(true.constructor == Boolean); // true
console.log((new Date()).constructor == Date);//true
参考资料:http://blog.sina.com.cn/s/blog_51048da70101grz6.html
type()方法
type: function( obj ) {
if ( obj == null ) {
return String( obj );
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[ core_toString.call(obj) ] || "object" :
typeof obj;
},