面试之:判断js类型的方式总结
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>判断js类型的方式</title>
</head>
<body>
<script type="text/javascript">
// 先引出2个概念
/*
1、基本数据类型(存放在栈中):Undefined、Null、Boolean、Number、String、Symbol (ES6新增)
2、引用数据类型(存放在堆内存中的对象,每个空间大小不一样,要根据情况进行特定的配置):Object 类型 【Object类型、Array类型、Date类型、RegExp类型、Function类型】
引用类型的值是保存在 堆内存(Heap)中的对象(Object)
与其他编程语言不同,JavaScript 不能直接操作对象的内存空间(堆内存)
*/
// 1、typeof
let a = [1,2,3,4],
b = 5,
c = 'test',
d = function() {
console.log('我是函数')
},
e = true,
f = null,
g;
h = Symbol(42);
j = new Date()
console.log(typeof(a)); // object
console.log(typeof(b)); // number
console.log(typeof(c)); // string
console.log(typeof(d)); // function
console.log(typeof(e)); // boolean
console.log(typeof(f)); // object
console.log(typeof(g)); // undefined
console.log(typeof(h)); // symbol
console.log(typeof(j)); // object
// 2、instanceof 判断该对象是谁的实例;内部机制是通过判断对象的原型链上是否能找到对象的proptype;
// object instanceof constructor
console.log({} instanceof Object) // true
console.log([] instanceof Array) // true
console.log(/aa/g instanceof RegExp) // true
console.log(function(){} instanceof Function) // true
// 3、 js原生方法 Object.prototype.toString.call()常用于判断浏览器内置对象 它可以给出数据的确切类型,相比typeof要精确
// 面试点:实现一个函数clone,可以对js中的5种主要的数据类型(包括number string object array Boolean)进行值复制
console.log(Object.prototype.toString.call(a)) // [object Array]
console.log(Object.prototype.toString.call(b)) // [object Number]
console.log(Object.prototype.toString.call(c)) // [object String]
console.log(Object.prototype.toString.call(d)) // [object Function]
console.log(Object.prototype.toString.call(e)) // [object Boolean]
console.log(Object.prototype.toString.call(f)) // [object Null]
console.log(Object.prototype.toString.call(g)) // [object Undefined]
console.log(Object.prototype.toString.call(h)) // [object Symbol]
console.log(Object.prototype.toString.call(j)) // [object Date]
// 4.判断是否为数组 Array.isArray() [IE8及以下版本不支持此API] 还需要用到 Object.prototype.toString.call(arr) === "[object Array]";
</script>
</body>
</html>