JavaScript 判断数据类型(typeof instanceof)

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”

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]

原文

猜你喜欢

转载自blog.csdn.net/weixin_42950052/article/details/81704574