1. String
1 2 | String(s); //'s',不加new 就直接输出字符串 new String(s) //String{'s'},加new就输出一个对象 |
2. Number
1 2 3 4 5 | Number(sss) //报错,Error: sss is not defined Number('sss') //NaN,NaN也是一个数字 Number(1) //1 Number('1') //1 new Number(123) //Number{123},加new就变成对象 |
3. Boolean
1 2 3 4 5 6 7 8 9 | 六个false值 Boolean(false) //false Boolean(undefined) //false Boolean(null) //false Boolean(NaN) //false Boolean('') //false Boolean(0) //false 其他的全是true |
除了对象(包括数组、函数)是复杂类型,其他数据类型都是基础类型
5. Object
1 2 3 | Object(1); //Number{1},前加new 和不加new是一样的 Object('s') //String{'s'} Object() //{} |
6. Array
1. 用法
第一种用法: 1 2 3 4 5 6 7 8 9 10 | let a = ['a','b']; //['a','b'] let b = new Array('a','b'); //['a','b'] //上面两种写法效果一样 let a = Array(3) //创建了一个长度为3的空数组 a.length //3 a[0] //undefined 0 in a //false let a = new Array(3) //和上面一样 |
第二种用法:
1 2 | let a = Array(3,3); //[3,3],length为2 //这和第一种一样的写法,功能却不同,不一致性,JS的垃圾之处 |
数组的含义:
数组就是对象,是拥有特殊原型链的对象,有Array.prototype的就是数组,没有的就不是数组。
3. 伪数组 1 2 3 4 5 | let obj = { 0:'1', 1:'2', length:2; } //看起来像数组,但没有Array.prototype的,就是伪数组 |
arguments是伪数组
4. 数组的API
-
forEach
1 2 3 4 5 6 7 8
var a = ['a','b','c']; a.forEach(function(x,y){ console.log(y); //y是key console.log(x); //x是value }) //0 a //1 b //2 c
-
sort,这个API会改变原值!只有这一个API会改变原值
1 2 3 4 5 6 7 8 9 10
var l = [2,3,1]; l.sort(); //[1,2,3],从小到大排序 l.sort(function(a,b){return a-b}) //[1,2,3],从小到大排序 l.sort(function(a,b){return b-a}) //[3,2,1],从大到小排序 //按成绩高到低排名 var students = ['小a','小b','小c']; var scores = { 小a: 59, 小b: 99, 小c: 80 }; students.sort(function(x,y){return scores[y] - scores[x]}) // ["小b", "小c", "小a"]
-
join
1 2 3 4
var a = [1,2,3]; a.join('xx'); //'1xx2xx3' a.join(); //'1,2,3',默认是逗号
-
concat
1 2 3 4 5
var a = [1,2,3]; var b = [3,4,5]; var c = a.concat(b); //'1,2,3,3,4,5' var d = a.concat([]); //'1,2,3',d和a的值一样,但d和a是两个数组,所以concat可以用来深拷贝数组
-
map(映射)
1 2 3 4 5
var a = [1,2,3]; a.map(function(value,key){ return value * 2; }) //[2,4,6]; a.map(value => value * 2); //[2,4,6]
-
filter(过滤器)
1 2 3 4 5 6 7 8 9 10 11 12 13
var a = [1,2,3,4,5]; a.filter(function(value,key){ return value >= 3; }) //[3,4,5] a.filter(function(value,key){ return value % 2 === 0 ; }) //返回偶数,[2,4] a.filter(function(value,key){ return value % 2 === 0 ; }).map(function(value){ return value * value; }) //[4,16];
-
reduce
1 2 3 4 5 6
var a = [1,2,3]; a.reduce(function(sum,n){ return sum + n ; },0) //6,求和,0是初始值,第一次传给sum的就是0,sum是每次传进来的值,之后传给sum的是return里的值,n是遍历的数 a.reduce((sum,n) => sum + n ,0) //6,箭头函数的写法
map以用reduce表示:
1 2 3 4 | a.reduce(function(arr,n){ arr.push(n*2); return arr; },[]) //[2,4,6] |
filter也可用reduce表示:
1 2 3 4 5 6 | a.reduce(function(arr,n){ if(n % 2 === 0){ arr.push(n) } return arr; },[]) |
-
splice
1 2 3
array.splice(start) array.splice(start, deleteCount) array.splice(开始的位置, 删除的个数, 插入的对象1,插入的对象2, ...)
-
slice
1 2 3
array.slice() //保留完整数组 array.slice(4) //保留4到最后的数组 array.slice(4,8) //保留4到8以前的数组