1. typeof操作符
typeof 返回的都是字符串,它是一个操作符,而不是函数,所以typeof()和typeof都可以。用typeof来确定是一个字符串,数值,布尔值,还是undefined。而如果用来检测null和对象的话,都会返回object。
使用typeof可能返回几种字符串
"undefined"——值未定义
"boolean"——值是布尔值
"string"——值是字符串
"number"——值是数值
"object"——值是对象或者null
"function"——值是函数
操作符的操作数可以是变量
或者字面量
看下面的栗子
var a;
var b = true;
var c = 'hello';
var d = 123;
var e = {}
function f(){
alert("");
}
console.log(typeof a); // undefined
console.log(typeof b); // boolean
console.log(typeof c); // string
console.log(typeof d); // number
console.log(typeof e); // object
console.log(typeof f); // function,函数在ECMAScript中也是对象,而不是一种数据类型。而函数有一些特殊的属性。所以要用typeof来区分函数和对象(一个返回function,一个返回object)
console.log(typeof null);// object,因为null被认为是一个空对象引用
2. instanceof操作符用来检验引用类型
instanceof只能用来判断对象和函数,不能用来判断基本类型,因为基本类型不是对象,所以instanceof判断基本类型会返回false
var a = new Array();
var b = {};
console.log(a instanceof Array); // true
console.log(b instanceof Object); // true
console.log(new Date() instanceof Date);// true
console.log(123 instanceof Number); // false
是否存在于原型链上
function Person(){}
var p = new Person();
console.log(p instanceof Person); // true
实例是否属于他的父类
function Person(){}
function Student(){}
var p = new Person();
Student.prototype = p; // 继承原型
var s = new Student();
console.log(s instanceof Person); // true
console.log(s instanceof Student); // true
基本类型不是对象,所以instanceof返回false
var a = '123';
console.log(a instanceof String); // false
console.log(typeof a); // string
var b = new String('123');
console.log(b instanceof String); // true
console.log(typeof b); // object
因为所有引用类型都是Object的实例,所以任何引用类型值和Object构造函数都返回true
console.log([] instanceof Array); // true
console.log([] instanceof Object); // true
判断数组方法:constructor是系统默认加上的
var arr = [1,2,3];
console.log(arr.constructor === Array); // true
// instanceof 是检测对象的原型链是否指向构造函数的prototype对象
3. Object.prototype.toString.call(value)精确判断对象的数据类型
- 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串。每个类在内部都有一个class属性,这个属性中就指定了上述字符串的构造函数名。
-
由于原生数组的构造函数名与全局作用域无关,因此使用toString()方法就能保证返回一样的值。这就解决了上述instanceof操作符的不足。而其他类型的值也一样能正确返回
var a = 1;
console.log(Object.prototype.toString.call(a)); // [object Number]var b = undefined;
console.log(Object.prototype.toString.call(b)); // [object Undefined]console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(true)); // [object Boolean]var c = [1,2];
console.log(Object.prototype.toString.call(c)); // [object Array]这一技巧也广泛应用于检测原生Json对象
var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON) == '[object JSON]'
这里解释一点 : 为什么返回的都是对象形式
原因是call(value)在绑定作用域时,传入的value如果不是Objrct而是原始值,比如字符串,布尔值等,这个原始值会被转化成它的对象形式。
具体参见,你不知道的JavaScript上卷88页。
object的toString()方法不能检测非原生构造函数的构造函数名·,所以开发人员自定义的任何构造函数都将返回[object Object]。所以在web开发中能区分原生和非原生的JavaScript对象是非常重要的,只有这样才能知道某个对象到底有哪些功能。
不过Object.prototype.toString()本身也可能被修改,我们假定的是Object.prototype.toString()未被修改的情况
网友评论