Function,Arrayd其实也是object,部分文章会把Function也归为基本数据类型。ES6里添加了symbol,是基本数据类型javascript
typeof操做符返回一个字符串,表示未经计算的操做数的类型java
| 对应表 |git
typeof好玩的就是何时是object何时是function(此问题面试一问估计会问倒一批人哈哈)。毕竟function自己也是object,如Specification所示,function实现了call方法。仔细一想,call貌似也只能在function中起做用。好比用call来实现继承(虽然看起来略显丑陋)github
双等不判断类型,三等判断类型。这种机制会有一些骚操做。 好比0 == ''为true, [0] == false为true等。
以前有个特别火的问题,if(a==1 & a==2 & a== 3)可否断定为true?。
答:双等时若是左右类型不一样,会调用valueOf,若是valueOf仍是类型不一样再调用toString。因此解决上面的问题,重写对象的valueOf或者toString方法便可。下面两段代码面试
const a = {
i: 1,
valueOf: function () {
return a.i++;
},
//toString: function () { 重写valueOf和toString均可以
// return a.i++;
//}
}
if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}
复制代码
对于if(a==1 & a==2 & a== 3)为true这个问题,我也有一个另类的实现思路,即经过运算符重载实现。能够经过babel来实现运算符重载,令a的==操做符永远返回true。有兴趣能够搜一下运算符重载的babel插件,在此就不赘述。bash
原文连接(github.com/sparkxxxxxx…)babel