说到《JavaScript高级程序设计(第3版)》,相信很多人都看过,包括我自己,先说一下这本书,它可以说是是JavaScript超级畅销书,我第一次被安利这本书是我还在上学,接触了一段时间JavaScript后,我的一个技术比我厉害的多的同学给我推荐的。
就在前两天,我准备带着自己一些关于JavaScript的疑问,重新阅读一下这本书给自己解惑,也准备把这些都记录下来让自己加深记忆,持续更新。
我不知道有没有人像我一样,刚开始买到这本书时第一感觉:🥴...厚得跟砖一样...
如何阅读???
我的建议是大致看一遍,在日常工作中发现自己对JavaScript有疑惑的地方再重新翻看这本书并 加以自己的理解。
类型判断
JavaScript的类型判断始终是我存在疑惑的地方,或许这本身就是Javascript存在疑惑的地方,JavaScript内置的类型检测机制并非完全可靠,以下是Javascript判断类型的方法,有遗漏的可以评论探讨。
1.instanceof
var isArray = (value) => value instanceof Array;
var isObject = (value) => value instanceof Object;
var isFunction = (value) => value instanceof Function;
我们都知道Array,Object,Function这些都是window下的属性,而当我们的web页面使用了frame,那如果在frame中使用Array,Object,Function,自然是frame下的window下的Array,Object,Function,这就造成了一个问题,当你在frameA中想判断frameB中的变量类型,就不能使用instanceof了,因为由于window不同,frameA的Array,Object,Function和frameB的Array,Object,Function并不是同一个,这就导致了frameB中的变量在除frameB之外的frame中使用instanceof判断类型始终返回false;
即使抛开frane的问题,instanceof返回的也不一定准确,函数在instanceof Object中始终返回true,例如:
function func(){};
isObject(func); //true
2.使用原型链判断
var isArray = (value) => value.__proto__ === Array.prototype;
var isObject = (value) => value.__proto__ === Object.prototype;
var isFunction = (value) => value.__proto__ === Function.prototype;
这个方法我尝试过并未发现有什么不妥,(当然,这建立在变量的proto和函数对象的prototype没有手动修改的情况下)😅
3.使用Object的toString判断
这个是在高程中看到的。
var isArray = (value) => Object.prototype.toString.call(value) === "[object Array]";
var isObject = (value) => Object.prototype.toString.call(value) === "[object Object]";
var isFunction = (value) => Object.prototype.toString.call(value) === "[object Function]";
这个方法我试了一下也没发现有什么不妥,从这么看它比方法2要安全一点,毕竟它只需要保证Object.prototype.toString没有被修改过。
😑那么问题就来了,我们要如何判断Object.prototype.toString没有被修改过???
我们都知道原生函数调用toString会返回'function funcName() { [native code] }',我们可以利用这个判断Object.prototype.toString是否是原生函数。
var isNativeObjectToString = Object.prototype.toString.toString() === 'function toString() { [native code] }';
👏以上就介绍完了JavaScript中类型判断的三个方法
最后
这只是高程解读的一部分,我会持续更新,有想法的朋友可在评论区留言。