面试官:怎么准确判断JS的数据类型?

简介: 面试官:怎么准确判断JS的数据类型?

640.jpg

1、typeof

检测方法:

1、console.log(typeof 1) // number
2、console.log(typeof 'str') // string
3、console.log(typeof true) // boolean
4、console.log(typeof undefined) // undefined
5、console.log(typeof {}) // object
6、console.log(typeof []) // object
7、console.log(typeof null) // object
8、console.log(typeof function() {}) // object
9、console.log(type typeof new RegExp()) // object

结论:

  • 1、typeof 只能准确的检测数一些基本类型
  • 2、正则、null、对象、数组检测出来的都是是对象,并不是十分准确

2、instanceof

instanceof 方法用来检测 某函数/某类是否为某实例对象构造器

检测方法:

console.log({} instanceof Object) // true
console.log([] instanceof Array) // true
console.log(new Date() instanceof Date) // true
console.log(1 instanceof Number) // false
console.log('str' instanceof String) // false
console.log(null instanceof Object) // false

结论:

  • 1、instanceof可以判断这个变量是否为某个函数的实例,而typeof不能
  • 2、instanceof只能通过true或者false来判断,不能直接看出来是什么类型
  • 3、基本类型的判断是错误的

3、constructor构造函数

检测方法:

function Father(){}
function Sun(){}
Sun.prototype = new Father();
Sun.prototype.constructor = Sun;
let sun = new Sun();
sun.constructor === Sun    // true
sun.constructor === Sun  // false
sun.constructor === Object 

结论:1、constructor容易被修改

4、终极大法 Object.portotype.toString.call()

获取Object.portotype上的toString方法,让方法的this变为需要检测的数据类型值

检测方法:

 Object.prototype.toString.call(true) //[object Boolean]
 Object.prototype.toString.call(1) //"[object Number]"
 Object.prototype.toString.call('str') //"[object String]"
 Object.prototype.toString.call({}) //"[object Object]"
 Object.prototype.toString.call(function () {}) //"[object Function]"
 Object.prototype.toString.call(Undefined) //"[object Undefined]"
 Object.prototype.toString.call(Null) //"[object Null]"
 Object.prototype.toString.call(new RegExp()) //"[object RegExp]"
  等等

总结:

  • 1、基本上所有类型都可以判断
  • 2、Object.prototype.toString执行的时候返回当前方法中的this的所属类信息
  • 3、不能精准判断自定义对象,对于自定义对象只会返回[object Object],但是instanceof 可以弥补这个缺点

总结不到位的,希望各位大大多多交流指正~~

往期

面试官:浅拷贝和深拷贝的区别?怎么实现一个深拷贝?

面试官:能写一个new 操作符吗?

面试官:你会手写bind apply 和bind吗?

面试官:JS判断对象为空有几种方法?

面试官:判断数组的方式有哪些

相关文章
|
14天前
|
JavaScript 前端开发
js变量的作用域、作用域链、数据类型和转换应用案例
【4月更文挑战第27天】JavaScript 中变量有全局和局部作用域,全局变量在所有地方可访问,局部变量只限其定义的代码块。作用域链允许变量在当前块未定义时向上搜索父级作用域。语言支持多种数据类型,如字符串、数字、布尔值,可通过 `typeof` 检查类型。转换数据类型用 `parseInt` 或 `parseFloat`,将字符串转为数值。
18 1
|
1月前
|
JavaScript
JS 获取对象数据类型的键值对的键与值
JS 获取对象数据类型的键值对的键与值
|
1月前
|
存储 JavaScript 前端开发
JavaScript数据类型详解
【4月更文挑战第4天】JavaScript有七种基本数据类型(Number, String, Boolean, Null, Undefined, Symbol, BigInt)和一种复杂数据类型(Object)。Number用于数字,String是不可变的文本,Boolean表示逻辑值,Null为空,Undefined表示未赋值,Symbol是唯一标识,BigInt处理大整数。Object用于复杂数据结构,如数组和函数。此外,`typeof`操作符检测数据类型,但有特殊行为,如`typeof null === "object"`。
21 2
|
1月前
|
JavaScript
typeof 和 instanceofJS数据类型(js的问题)
typeof 和 instanceofJS数据类型(js的问题)
|
2月前
|
JavaScript 前端开发
JavaScript 中有哪些数据类型?
JavaScript 中有哪些数据类型?
19 3
|
2月前
|
JavaScript
JS常用数据类型转换
JS常用数据类型转换
13 1
|
1月前
|
JavaScript
数据类型转换(js的问题)
数据类型转换(js的问题)
|
10天前
|
存储 JavaScript 前端开发
【JavaScript技术专栏】JavaScript基础入门:变量、数据类型与运算符
【4月更文挑战第30天】本文介绍了JavaScript的基础知识,包括变量(var、let、const)、数据类型(Number、String、Boolean、Undefined、Null及Object、Array)和运算符(算术、赋值、比较、逻辑)。通过实例展示了如何声明变量、操作数据类型以及使用运算符执行数学和逻辑运算。了解这些基础知识对初学者至关重要,是进阶学习JavaScript的关键。
|
11天前
|
存储 JavaScript 前端开发
JavaScript引用数据类型
JavaScript引用数据类型
|
11天前
|
JavaScript 前端开发
JavaScript 基本数据类型
JavaScript 基本数据类型