1.typeof
typeof方法返回一个字符串,来表示数据的类型。 我们先看看各个数据类型对应typeof的值见下表: |数据类型|Type| |-|-| |Undefined|“undefined”| |Null|“object”| |布尔值|“boolean”| |数值|“number”| |字符串|“string”| |Symbol (ECMAScript 6 新增)|“symbol”| |函数对象|“function”| |任何其他对象|“object”|
实例:
<script>
function Person(name,age){
this.name = name;
this.age = age;
}
let p = new Person('zhangsna',20);
let d = new Date();
let arr = new Array();
let num = new Number(100);
console.log(typeof(undefined));
console.log(typeof(null));
console.log(typeof(100));
console.log(typeof(true));
console.log(typeof("hello"));
console.log(typeof({}));
console.log(typeof(Person));
console.log(typeof(p));
console.log(typeof(d));
console.log(typeof(arr));
console.log(typeof(num));
</script>
运行结果:
undefined
object
number
boolean
string
object
function
object
object
object
object
在 JavaScript 中,判断一个变量的类型通常会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。这就需要用到instanceof来检测某个对象是不是另一个对象的实例。
2.instanceof
instanceof的简单理解可以用于判断一个对象是否是某个构造函数的实例。因此instanceof通常用来判断引用类型。
Javascript常见的引用类型见下表: |数据|引用类型| |-|-| |new String(“foo”)|String| |new Number(1.2)|Number| |new Boolean(true)|Boolean| |new Date()|Date| |new Error()|Error| |new Array(1, 2, 3)|Array| |new RegExp(“meow”)|RegExp| |new Object()|Object| |new Person()|Person(用户自定义类型)|
直接量不能使用instanceof的。instanceof的用途是判断一个对象是否在某个对象原型链上。或者说判断一个对象是某个对象的实例。
例如:
let num = 100;
console.log(num instanceof Number);
num = new Number(num);
console.log(num instanceof Number);
运行结果:
false
true
例如:
let p1 = {
name : 'zhangsan',
age : 18
}
function Person(name,age){
this.name = name;
this.age = age;
}
let p2 = new Person('lisi',18);
console.log(p1 instanceof Object);
console.log(p1 instanceof Person);
console.log(p2 instanceof Object);
console.log(p2 instanceof Person);
运行结果:
true
false
true
true
但是instanceof更准确的解释是:判断一个构造函数的prototype属性所指向的对象是否在另一个被检测对象的原型链上。
上例改写如下:
let p1 = {
name : 'zhangsan',
age : 18
}
function Person(name,age){
this.name = name;
this.age = age;
}
let p2 = new Person('lisi',18);
Person.prototype = p1;
console.log(p1 instanceof Object);
console.log(p1 instanceof Person);
console.log(p2 instanceof Object);
console.log(p2 instanceof Person);
运行结果:
true
false
true
false
3.typeof与instanceof区别
1). typeof会返回一个变量的基本类型(字符串),instanceof返回的是一个布尔值。 2). instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型。 3). typeof也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了function 类型以外,其他的也无法判断。
可以看出,上述两种方法都有弊端,并不能满足所有场景的需求。