•作者:陈大鱼头•github: KRISACHAN[1]
虽然 2020 的今天,各种前端框架、工具林立,而这些框架跟工具也帮我们提前解决了不少麻烦的问题,但是工具始终是工具,扎实的基本功才是最核心的,现在一起来通过几个实际的代码片段来提高我们原生 JS 的编码水平。
判断数据类型
首先来提问一个:typeof
是否能正确判断类型?
答案是:不可以,因为由于历史原因,在判断原始类型时,typeof null
会等于object
。而且对于对象来说,除了函数,都会转换成object
。例子如下:
typeof 1; // 'number'typeof "1"; // 'string'typeof null; //typeof []; // 'object'typeof {}; // 'object'typeof window.alert; // 'function'
再来提问一个,instanceof
是否能正确判断类型?
答案是:还是不可以,虽然instanceof
是通过原型链来判断的,但是对于对象来说,Array
也会被转换成Object
,而且也不能区分基本类型string
和boolean
。例如:
function Func() {}const func = new Func();console.log(func instanceof Func); // trueconst obj = {};const arr = [];obj instanceof Object; // truearr instanceof Object; // truearr instanceof Array; // trueconst str = "abc";const str2 = new String("abc");str instanceof String; // falsestr2 instanceof String; // true
所以该怎么办呢?
这时候我们可以使用:Object.prototype.toString.call()
所以为什么?
因为每个对象都有一个toString()
方法,当要将对象表示为文本值或以预期字符串的方式引用对象时,会自动调用该方法。默认情况下,从Object
派生的每个对象都会继承toString()
方法。如果此方法未在自定义对象中被覆盖,则toString()
返回[Object type]
,其中type