1.typeof: 语法:typeof 对象 或者 typeof(对象)
返回对象的数据类型:只有原始数据类型:boolean number string undefined function object
因为最初的BUG致使null的数据类型成为了object,如今,null 被认为是对象的占位符,从而解释了这一矛盾。
缺陷:对于Array,null,Object对象和其余自定义对象使用typeof一概返回object;
console.log(typeof(x)); //未声明x,返回undefined var y = false; console.log(typeof y); //boolean var str = "字符串"; console.log(typeof str); //string var num = 5; console.log(typeof(num)); //number console.log(typeof NaN); //number NaN是一个特殊的数字---非数字 var f1 = function () { }; console.log(typeof f1); //function console.log(typeof null); //object var arr = [1, 2, 3]; console.log(typeof arr); //object var obj = {name: "小伟", age: 15}; console.log(typeof obj); //object var Person = function (name) { this.name = name }; var per = new Person("小王"); console.log(typeof per); //object
2.instanceof 用于测试构造函数的prototype属性是否出如今对象的原型链中的任何位置
解读:用于判断某个对象是否是某个构造函数的一个实例,或者是否是某个构造函数的一个后代实例
语法:对象 instanceof 数据类型(或者构造函数名):返回true/false
instanceof的原理:function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
即比较对象.__proto__和数据类型(构造函数).prototype,若是相等就为true,
不一样就继续跟着对象的原型链,比较对象隐式原型里的隐式原型与数据类型(构造函数).prototype
根据原型链的知识直到原型链的最终,指向Object.prototype.__proto__---为null
console.log(per instanceof Person); //true //per.__proto__指向其构造函数的原型对象Person.prototype,因此返回true console.log(f1 instanceof Function); //true console.log(arr instanceof Array); //true console.log(obj instanceof Object); //true //同理,这些引用类型:Function、Array、Object、均可以视为一个构造函数 //对于继承的数据类型:新的实例对象根据原型链,数据类型能够是其构造函数名,也能够是其祖辈的构造函数名 var Student = function (score) { this.score = score; } Student.prototype = new Person("小李"); var stu = new Student(100); console.log(stu instanceof Student); //true stu.__proto__ == Student.prototype很易理解 console.log(stu instanceof Person); //true /* * 根据原型链:stu.__proto__ == Student.prototype == new Person * stu.__proto__.__proto__ == new Person.__proto__ == Person.prototype * * * */
注意:函数
* 在JavaScript中,一切都是一个对象( 或者至少被视为一个对象) 。
* 惟一的non-objects是基本类型:布尔值,数字,字符串和undefined ,
* 直接声明的这几种类型的实例不是object对象,可是能够访问其做为对象的一些属性和方法?为何呢?
*
* 在访问基本类型数据的属性和方法时会临时出现一个包装对象:
* 自动建立基本包装类型的对象,只执行一行代码的瞬间以后就会当即销毁。
这意味着在运行时为基本包装类型值添加属性和方法是无效的。
* 好比只要引用了字符串s的属性,JavaScript就会将字符串值经过调用new String(s)的方式转换成对象,成为了基本包装类型,
* 这个对象继承了字符串(String)对象的方法,并被用来处理属性的引用。一旦属性引用结束,这个新建立的对象就会被销毁
*
* instanceof 运算符只对对象有效:因此对于上述的几个non-object无效,因此判断他们的数据类型时返回值会是false
*
* 另外:布尔,数字,字符串有其构造函数,若是用其构造函数实例化一个对象,则可使用instanceof判断其数据类型
*
var y = false; console.dir(y); //只是一个基本布尔值,没有内部结构 console.log(y instanceof Boolean); //false var z = new Boolean(false); console.dir(z); //利用构造函数建立布尔值,能够获得内部结构,具备对象的特征 console.log(z instanceof Boolean); //true console.log(y.__proto__); //因为基本包装类型的存在,能够临时访问其做为对象的属性, // 这样作时,会将y经过调用new Boolean获得一个临时的包装对象,具备对象特征,可是语句执行结束后就消失 y.name = "布尔false"; console.log(y.name); //undefined,没法对基本类型添加属性或方法 //没法对基元类型的数据声明属性和方法,由于他们不是对象, // 能够利用包装类型的原理访问基元类型数据的属性和方法(若是他们所对应的包装对象有这个属性和方法的话,若是没有,返回undefined很容易理解) console.log(str instanceof String); //false console.log(num instanceof Number); //false
3.借用Object原型里的一个方法 :Object.prototype.toString.call(对象)
能够获得对象的数据类型:包括:String、Number、Boolean、undefined、null、Object、function、Array、Date、Regexp
解决了typeof的缺陷
可是没法获得自定义构造函数实例化对象的数据类型(构造函数名),只能得到Object
注意:使用这个方法其实是用call()方法借用Object原型里的一个方法,不能直接使用对象.toString(),
由于对于一个对象,toString方法是被从新定义了的,是将obj转换为字符串的方法,
直接使用对象.toString()根据原型链,在访问到这个重写的方法时就调用了,不能访问到Object原型里的这个同名的方法
console.log(Object.prototype.toString.call(null));//[object Null] console.log(Object.prototype.toString.call(undefined)); //[object Undefined] console.log(Object.prototype.toString.call(y)); //[object Boolean] console.log(Object.prototype.toString.call(str));//[object String] console.log(Object.prototype.toString.call(num));//[object Number] console.log(Object.prototype.toString.call(f1));//[object Function] console.log(Object.prototype.toString.call(arr));//[object Array] console.log(Object.prototype.toString.call(obj));//[object Object] console.log(Object.prototype.toString.call(per));//[object Object] console.log(Object.prototype.toString.call(new Date));//[object Date]