1.typeof
- 主要用于判断基本数据类型:string,number,boolean,object,function,undefined.
- 从技术角度讲,函数在ECMAScript中是对象,不是一种数据类型。然而函数确实有一些特殊的属性,因此通过typeof操作符来区分函数和其他对象是有必要对的。
- 对尚未声明的变量,只能进行一项操作,即使用typeof操作符检测其数据类型,(对未经声明的变量调用delete不会导致错误,但这样做没有什么实际意义,而且在严格模式下确实会导致错误。)
- 判断变量是否存在
//直接判断会报错。
if(typeof array!='undefined'){//变量存在}
数据 | typeof操作结果 |
---|---|
“JavaScript” | “string” |
new String(“JavaScript”) | “object” |
1.2 | “number” |
new Number(1.2) | “object” |
true | “boolean” |
function(){}; | “function” |
new Boolean(true) | “object” |
new Function(“”) | “function” |
/abc/g | “object” |
[1,2,3] | “object” |
Symbol (new in ECMAScript 2015) | “symbol” |
Host object (provided by the JS environment) | Implementation-dependent |
2.instanceof
- instanceof 左操作数是一个类,右操作数是标识对象的类。如果左侧的对象是右侧类的实例,则返回true.
- 而js中对象的类是通过初始化它们的构造函数来定义的。即instanceof的右操作数应当是一个函数。所有的对象都是object的实例。如果左操作数不是对象,则返回false,如果右操作数不是函数,则抛出typeError。
- instanceof 运算符是用来测试一个对象是否在其原型链原型构造函数的属性。其语法是object instanceof constructor
- instanceof 操作符用来比较两个操作数的构造函数。只有在比较自定义的对象时才有意义。 如果用来比较内置类型,将会和 typeof 操作符 一样用处不大。
- 有一点需要注意,instanceof 用来比较属于不同 JavaScript 上下文的对象(比如,浏览器中不同的文档结构)时将会出错, 因为它们的构造函数不会是同一个对象。
结论:instanceof 操作符应该仅仅用来比较来自同一个 JavaScript 上下文的自定义对象。 正如 typeof 操作符一样,任何其它的用法都应该是避免的。
function C() { } // defining a constructor
function D() { } // defining another constructor
var o = new C();
o instanceof C; // true, because: Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false, because D.prototype is nowhere in o's prototype chain
o instanceof Object; // true, because:
C.prototype instanceof Object // true
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false, because C.prototype is nowhere in o's prototype chain anymore
D.prototype = new C(); // use inheritance
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true
var myString = new String();
var myDate = new Date();
myString instanceof String; // returns true
myString instanceof Object; // returns true
myString instanceof Date; // returns false
myDate instanceof Date; // returns true
myDate instanceof Object; // returns true
myDate instanceof String; // returns false
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var mycar = new Car("Honda", "Accord", 1998);
var a = mycar instanceof Car; // returns true
var b = mycar instanceof Object; // returns true
3.判断数组的类型
var arr = [1,2,3,4];
var arr2 = new Array(1,2,3,4);
console.log(arr instanceof Array); //true
console.log(Array.isArray(arr)); //true
console.log(Object.prototype.toString.call(arr)); //[object Array]
console.log(arr2 instanceof Array); //true
console.log(Array.isArray(arr2)); //true
console.log(Object.prototype.toString.call(arr2)); //[object Array]
4.判断是不是Object类型
typeof "dfdf"; //返回的是 "string"
typeof new String("dfdf"); //返回的是 "object"
Object.prototype.toString.call("dfdsf");
Object.prototype.toString.call(new String("dfdf"));
//所以应该使用此方法