1、数据类型
js中数据类型主要有Number类型,字符串类型,布尔类型,数组类型,对象类型。
其中Number类型有整形,浮点型,负数型,科学计数法型.
还有一个NaN,它表示某个对象不是一个Number,这在无法计算结果的时候会出现,比如你用一个字符串去除以一个数字,那结果就是NaN,我们可以用Number.isNaN()函数来判断一个对象是否是NaN的。
还要记住:
console.log(typeof NaN === "number"); // logs "true"
console.log(NaN === NaN); // logs "false"
然后还有一个Infinity,表示数无限大,也就是超过了js设置的Number的最大值。
其中字符串可以用单引号或者双引号括起来,但在json文件中必须用双引号。
布尔值就是true或者false,它们之间可以用&&,||进行组合
undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。
null的类型被定义为object。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
js 代码
- var oValue;
- alert(oValue == undefined); //output "true"
这段代码显示为true,代表oVlaue的值即为undefined,因为我们没有初始化它。
js 代码
- alert(null == document.getElementById('notExistElement'));
当页面上不存在id为"notExistElement"的DOM节点时,这段代码显示为"true",因为我们尝试获取一个不存在的对象。
js 代码
- alert(typeof undefined); //output "undefined"
- alert(typeof null); //output "object"
第一行代码很容易理解,undefined的类型为Undefined;第二行代码却让人疑惑,为什么null的类型又是Object了呢?其实这是JavaScript最初实现的一个错误,后来被ECMAScript沿用下来。在今天我们可以解释为,null即是一个不存在的对象的占位符,但是在实际编码时还是要注意这一特性。
js 代码
- alert(null == undefined); //output "true"
ECMAScript认为undefined是从null派生出来的,所以把它们的值定义为相等的,也即是用两个=会是返回true的。但是,如果在一些情况下,我们一定要区分这两个值,那应该怎么办呢?可以使用下面的两种方法。
js 代码
- alert(null === undefined); //output "false"
- alert(typeof null == typeof undefined); //output "false"
使用typeof方法在前面已经讲过,null与undefined的类型是不一样的,所以输出"false"。而===代表绝对等于,在这里null === undefined输出false。
以上关于null和undefined的知识是引用的别人的内容。
2、数组类型
数组类型是js中的非常重要的一个类型,数组类型用[]表示,它的里面的对象的类别没有要求,可以一样,也可以不一样。
首先讲一下几个数组类型的基本函数:
这些函数分别是indexOf,slice,push,pop,unshift,shift,reverse,splice,concat,join,下面一一进行介绍。
indexOf,就是取出数组中的某个元素的第一个index的值
slice中文翻译为切片,它相当于string的substring函数,slice(start,end)就是将从start开始到end但不包括end的数组中的元素取出来放置在一个新的数组中进行返回。
push,就是往数组的末尾添加若干个元素,而pop则是将数组末尾的元素删除掉,这两个函数都是直接对数组本体进行操作的。
unshift则是往数组头部添加元素,而shift则是把数组中的第一个元素给删掉,这两个函数也都是对数组本体进行操作的。
reverse就是将数组进行倒置,它是直接对原来的数组进行操作,即原数组会被更改。
splice函数是万都能的,它将从索引开始,先删除几个元素,再添加几个元素。它是直接对原数组进行操作的。
concat是将一个数组和另外一个数组连接起来,形成一个新的数组并返回。注意它返回的是一个新的数组,而原来的老数组是没有变化的。
join是将数组中的每一个元素都用指定的字符连接起来,最后返回的是一个字符串,它对数组本身没有任何更改。
现在要讲一下数组类型中非常重要的几个高阶函数:
第一个函数是map,通过arr.map(callback(x))来调用,它返回的是一个新的数组,老的数组arr不变。这个map的作用是使得arr中的每一个元素都会作为参数x传入callback进行计算,然后返回的内容称为返回的新数组中的一个元素。
第二个函数是reduce,通过arr.reduce(callback(x,y))来调用,它返回的是一个值而不是一个数组。它必须传入两个参数,第一个参数是第一次使用callback函数返回的结果,第二个参数就是下一个arr元素,利用这个reduce,可以非常方便地做累加或者累乘的运算。
第三个函数是filter,就是通过arr.filter(callback(x)),它返回的也是一个新的数组。这个filter的作用是对arr中的每一个元素都进行判断,如果返回的是true,则这个元素或添加到结果中,否则就剔除。
第四个函数是sort,通过arr.sort()调用,它是直接对原理的数组进行更改。默认的排序规则按照升序排序,但是要注意有坑,那就是,sort在排序的时候,会将所有的数字转换成字符串,然后按照字符串的顺序进行排序,这就会导致10排在2的前面,因为'10'的顺序是要小于‘2’的字符串顺序的。这是一个大坑。
所以我们也可以通过arr.sort(callback(x,y))添加一个比较函数来设置自己的排序规则。其中return -1表示x<y,return 1表示x>y,return 0表示x==y。
第五个函数是every(),通过arr.every(callback(x))来使用,其中callback函数是一个判断函数,它来对arr中的函数进行判断,如果符合则返回true,否则返回false,利用every()就实现了对数组中的每一个元素都进行判断,当所有的结果都是true的时候,every函数会返回true,当有一个不是true的时候,就直接返回false,后面的判断也不再执行了。
第五个函数是some(),通过arr.some(callback(x))来使用,其中callback函数是一个判断函数,它来对arr中的函数进行判断,如果符合则返回true,否则返回false。利用some就实现了对数组中的每一个元素进行判断,当有一个结果是true的时候,就直接返回true,后面的也不再判断了。
第六个函数是find(),它用来查找数组中符合条件的第一个元素,如果找到了,就返回这个元素,否则则返回undefined。
第七个函数是findIndex(),它用来查找数组中符合条件的第一个元素,如果找到了,就返回这个元素的索引,否则则返回-1。
第八个函数是forEach(),它和map类似,但它的回调函数不返回内容,它本身也不返回任何内容,它的一个好处就是方便我们进行遍历数组。比如通过arr.forEach(console.log)就可以直接依次打印数组中的每一个元素。