最近在夯实基础,做一些笔记。
JS是一种弱类型语言,它的变量类型可以随时改变;JS共有六种数据类型(算上ES6新增的symbol共有七种,目前还没用到,先不讨论),分别为:
数值型(如:1,21.2,0.02,0.2e);
字符型(如:"aaa","1.2.3");
布尔型(true,false);
null(表示空值);
undefined(表示“未定义”或不存在);
对象(Object)。
其中,数值型,字符型和布尔型属于“原始类型”,表示它们是最基本的类型,不能再细分了
null和undefined属于特殊值
对象则可以细分为:函数(function),狭义上的对象(object),数组(array)
这里有一个比较坑的点是,null也是属于object,这就涉及到了js的历史,因为js最初是只有五种类型,null被归为object的一种特殊值,后来null独立了(freedom!!),但是已经被用的时间很长了,为了广大程序员们的头发,所以也就将错就错用到现在:)
与之相关的,就是如何判断数据类型了:
主流的共有两种:typeof, instanceof,
特殊情况有两种:对象的constructor属性,Object.protoType.toString()
1.typeof 基础用法:typeof xxx; 返回的是一个字符串,值一般为“string”,"boolean","number","object","function","undefined"
这是最简单也最常用的方法,缺点是第一无法分辨object和array,判断结果均为object,第二当array为[]或object为{}时,判断仍为object
小技巧:由于typeof判断未定义的值不会报错,所以可以用来进行判断值是否被定义,如:
if(aa == "undefined")//由于aa未定义,所以会报错;
换成这样:if(typeof aa =="undefined")//这样就不会报错了。
2.instanceof 用来检测一个构造函数的prototype属性所指的对象是否存在于另一个对象的原型链上,涉及到原型链总感觉有点复杂,但是由于这个常被用来给typeof补漏,所以常用的还比较简单:),返回值只有true和false
基础用法:a instanceof Array //返回true or false
复杂用法:1.可以用来判断a是否为b的实例;2.最重要的是可以判断a是否为b的继承者【简单说一下,详细的以后再补充】
3.constructor属性 返回对创建此对象的数组函数的引用。
用法:a constructor //返回引用类型,如Array
原理后续补充
4.Object.protoType.toString()
用于检测在跨框架页面中的数组。原理就是在不同框架中创建的数组不会相互共享其prototype属性
用法:Object.prototype.toString.call([]); // 返回 “[object Array]”