开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
你好,我是知秋,本系列是对前端基础查漏补缺, 应对面试问题而学习系列文章,我将会整理面试中经常会被问到的问题,希望对你有帮助。
类型有哪些?
JavaScript的基本类型有 Number、String、Boolean、null、undefined、Symbol, 引用类型有 Object、Function、Array,以及两个特殊的 RegExp、Date
其中 null 和 undefined 有什么区别?
null 声明一个变量并且赋值为 null,表示准备用来保存对象还没真正保持对象,逻辑上来说是空对象指针
undefined 只是声明了一个变量没有赋值, 表示无或者缺省值
它们在全等模式下不相等但是相对相等
null === undefined //false
null == undefined //true
使用 typeof 来测试两个值的类型返回不一样
typeof null //object
typeof undefined //undefined
典型使用场景
- 调用的函数需要传递参数但是没有传递,参数值就是 undefined
- 函数没有指定返回值,默认为 undefined
- 声明了一个值没有赋值为 undefined
- 对象的属性没有赋值为 undefined
- 传递给函数的参数不为对象可以传 null
- 对象初始化前可以赋值为null
- 作为原型链的终点对象赋值为null
=== 和 ==的区别
=== 为等同符, 先会比较两个值的类型再比较值是不是一样, 如果类型不一样就直接返回 false,只有类型和值都相等才返回 true
==为等值符, 先比较两个值的类型如果不一样会做类型转换之后再比较值, 只要转换后的两个值一样就返回 true
什么情况下会返回 undefined?
- 访问声明了没有赋值的变量
- 访问赋值为 undefined 的变量
- 访问对象中不存在的属性
- 访问函数中没有传递的传输
- 函数中返回值没有显式的返回
- 函数中返回值什么也没返回
如何判断 JavaScript 的数据类型?
通过 typeof 可以区分除null 以外的基本类型(值类型),以及普通引用类型中的函数类型
typeof function(){} // function
typeof Symbol() //symbol
typeof NaN // number
instanceof 不能区分原始基本类型,可以区分具体的引用类型,它的返回值不一定可靠(Symbol.hasInstanceof 可以重置返回值)
3 instanceof Number //false
new String() instanceof String //true
Object.prototype.toString 可以区别大部分类型,但是不也能区分数字类型和数字的引用类型,字符串和布尔类型也是如此。(Symbol.toStringTag 可以覆盖默认返回)
Object.prototype.toString.call(null).slice(8,-1) //Null
Object.prototype.toString.call(new Date()).slice(8,-1) //Date
Object.prototype.toString.call(new String()).slice(8,-1) //String
Array.isArray() 可以判断当前的值是否是数组
Array.isArray([]) //true
typeof 和 instanceof 的区别
typeof 只能用来判断值类型, 无法判断具体是什么引用类型, 这样就可以用 instanceof 来判断某个对象是不是被另一个函数构造(是不是另一个函数的实例)
如何区分数组和对象?
通过Array.isArray 来区分
通过 Object.prototype.toString.call来区分
Object.prototype.toString.call(new Object).slice(8,-1) //'Object'
Object.prototype.toString.call(new Array).slice(8,-1) //'Array'
通过 instanceof 来区分
[] instanceof Array // true
{} instanceof Array //false
JS拥有动态的数据类型也就是弱类型比如可以把字符串赋值给存储数字的变量,这种方式更加灵活,也更加容易出错, 现在可以借助TypeScript对变量类型做约束, 不过JS类型相关的问题在面试中还是很容易被问到,上面几个问题可以自己测一测记一记哦