提及面试,作技术的人应该都有一种感受,那就是工做的时候用到的东西均可以去查,可是当别人直接问一个问题时,让你在不去查询的状况下,立即作回答,仍是有必定难度的。尤为是面试的时候,不少程序员能力不缺,可是让你立即说出来或者当场手写代码的时候,每每容易卡壳。笔者也有相似的经历,遂决定从今天起,写一些面试题总结以及对面试的思考。欢迎对面试有兴趣的同行一块儿来探讨,共同进步。javascript
JavaScript中的数据类型一共有两类:一类是基本数据类型,一类是引用数据类型。html
Undefined
, Null
, String
, Number
, Boolean
, Symbol
Object
判断数据类型的方法常见的有如下几个,下面一一来讲:java
// typeof xxx;程序员
typeof
方法判断数据类型的时候,常见于判断上面提到的基本数据类型。而当使用 typeof
判断引用数据类型的时候,typeof
只会返回 function
和 object
两种数据类型,这显然不是咱们想要的更加精准的类型判断。因此,判断基本数据类型时,typeof
能够用;判断引用数据类型时,typeof
不建议使用;typeof
对于基本类型,除了 null
均可以显示正确的类型 (typeof
判断null
时,返回的是 object
);typeof
对于对象,除了函数都会显示 object
;null
来讲,type
会返回object
,这是一个存在了好久的Bug。// A instanceof B;instanceof
一般用来判断 A
是不是 B
的实例,若是 A
是 B
的实例,那么 A instanceof B
返回 true
; 不然,返回 false
。面试
instanceof
的原理或者说内部机制是:经过判断对象的原型链中是否是能找到类型的 prototype
。数组
例如:app
var a = {}; a instanceof Object; // true var b = []; b instanceof Array; // true
到这里的时候,看似都是正常的,没有什么问题。那么若是发挥孔乙己”四个回字“的想法呢? 好比:函数
var c = {}; c instanceof Array; // false var d = []; d instanceof Object; // true
这个时候,发现数组在使用 instanceof
的时候,既有属于数组的状况,又有属于对象的状况。虽然,咱们能够仅仅使用 A instanceof Array
来判断 A
究竟是不是数组,可是当数组也能够被 instanceof Object
为 true
时,心理多多少少有些以为不够干脆利索。那么继续看看有没有更高效的判断引用数据类型的方法呢?答案是确定的。请看下面:性能
// Object.prototype.toString.call( xxx );
其中 "xxx" 就是咱们想要判断的数据类型。ui
这里的toString()
是Object
的原型方法,调用该方法后,会返回当前对象的 [[class]]
属性,这是一个内部属性,其格式为 [object Xxx]
, 其中 "Xxx"
就是对象的类型。
对于 Object
对象而言,直接调用 toString()
方法便可返回 [object Object]
;而对于其余对象而言,须要经过调用call() / apply()
方法才能返回正确的类型信息。好比:
Object.prototype.toString.call('') ; // [object String] Object.prototype.toString.call(1) ; // [object Number] Object.prototype.toString.call(true) ; // [object Boolean] Object.prototype.toString.call(Symbol()); //[object Symbol] Object.prototype.toString.call(undefined) ; // [object Undefined] Object.prototype.toString.call(null) ; // [object Null] Object.prototype.toString.call(new Function()) ; // [object Function] Object.prototype.toString.call(new Date()) ; // [object Date] Object.prototype.toString.call([]) ; // [object Array] Object.prototype.toString.call(new RegExp()) ; // [object RegExp] Object.prototype.toString.call(new Error()) ; // [object Error] Object.prototype.toString.call(document) ; // [object HTMLDocument] Object.prototype.toString.call(window) ; //[object global] window 是全局对象global的引用
Undefined
:表示不存在这个值,“缺乏值”,就是此处应该有一个值,可是尚未定义,当尝试去读取的时候,返回undefined
。Null
: 表示一个对象被定义了,值为“空值”,它是一个对象,可是是一个空对象,没有属性和方法。在验证Null
的时候,必定要使用 ===
,由于 ==
没法分辨 null
和 undefined
。1.对于 ==
来讲,若是双方类型相同的话,直接比大小;若是双方的类型不同的话,就会进行类型的转换。
2.它会先判断是否在对比 null
和 undefined
, 是的话返回true
;
3.判断二者是否为 string
和 number
,是的话将字符串转为Number
;
4.判断其中一方是否为Boolean
,是的话将boolean
转为数字再比较;
5.判断其中一方是否为object
, 且另外一方为 string
, number
, 或者 symbol
,是的话将object
转为原始类型再进行判断。
直接判断二者类型和值是否相同。
Boolean
undefined
, null
, false
, NaN
, ""
, 0
, -0
,其余全部的值都会转为 true
,包括全部对象。对象在转换为基本类型时,首先会调用 valueOf
,而后调用 toString
,而且这两个方法也是能够重写的。
1.只有当使用加法运算时,其中一方是字符串类型,就会把另外一方也转为字符串类型;
2.其余运算,只要有一方是数字,那么另外一方就转化为数字;
3.加法运算会出发三种类型转换:将值转换为原始值、转换为数字、转换为字符串。
(本节完)
参考连接:
https://www.cnblogs.com/yan-y...
https://www.cnblogs.com/M-rig...
https://blog.csdn.net/m0_3768...
https://www.cnblogs.com/echol...