数组引用类型分析
利用console.table()
可以在控制台以表格的形式打印出数组
1 2 3 4 5 6 7 8 9 10
| let a = [ { title: "标题1", name: "数氺哦速度符合速度符合哦" }, { title: "天文一号上天", name: "数氺哦速度符合速度符合哦" }, { title: "杭州赖女士失踪", name: "数氺哦速度符合速度符合哦" }, { title: "牛市来临", name: "数氺哦速度符合速度符合哦" }, { title: "中美关系紧张", name: "数氺哦速度符合速度符合哦" }, ]; console.log(a);
console.table(a);
|
数组的创建
new Array(6)
是往一个数组中放进 6 个空值,数组的长度变成 6,Array.of(6)
是将数字 6 放进数组中,数字的长度是 1。
1 2 3 4 5 6 7
| const newdate = new Array(6); console.log(newdate); console.log(newdate.length);
const data = Array.of(6); console.log(data); console.log(data.length);
|
类型检测和转换
obj instanceof Array
判断一个数据是否是数组
join(",")
将一个数组以某个字符串拼接
toString()
将数组转为字符串
split("/")
以某个字符分隔字符串使之变成数组
Array.from(str)
Array.from 只能将有 length 属性的元素转为数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| let obj = [1, 2, 3]; console.log(obj);
console.log(obj instanceof Array);
console.log(obj.join(""));
console.log(obj.toString());
let str = "songzheng";
console.log(str.split(""));
console.log(Array.from(str));
let objs = { 0: "张三", 1: "6", length: 2, }; console.log(Array.from(objs));
|
展开语法
展开语法以...
的形式使用。效果是将一个数组展开放进一个新的数组中,如果在一个字符串前加上展开语法,可以将这个字符串变成同等长度的数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| let arr1 = [45, 65, 84]; let arr2 = ["song", "zheng"];
console.log([...arr1, ...arr2]);
function count(...arguments) { console.log(arguments); return arguments.reduce((s, v) => { return (s += v); }, 0); } console.log(count(15, 46, 78, 98, 87, 65));
|
点语法操作 DOM 节点
document.querySelector()
获取单个元素
document.querySelectorAll()
获取全部的某个元素
1 2
| <div>song</div> <div>zheng</div>
|
1 2 3 4 5 6
| const divs = document.querySelectorAll("div"); console.log(...divs);
Array.from(divs).map(function(item) { item.style.fontSize = "50px"; });
|
解构语法
destructuring:百度百科的意思是结构分解,ES6 中允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| let a = 1; let b = 2; [b, a] = [a, b]; console.log(a); console.log(b);
let [, wname] = ["李四", "王五"]; console.log(wname);
let [_name, year] = ["song", 2020]; console.log(_name, year);
let [user, ...args] = ["song", 2020, "zheng"]; console.log(user); console.log(args);
let [name1, name2, ...str] = "xiang"; console.log(name1, name2, str);
|
添加元素的多种操作技巧
push()
,往数组里面追加元素,追加的元素排在最后一位
pop()
,删除数组最后一个元素
unshift()
,从数组开始处添加元素,效果与 push 相反
shift()
,删除数组第一个元素
fill(val,startindex,endindex)
,使数组内容都变成某个值。这个方法接收三个参数,val
:替换的内容;startindex
:从哪个下标开始;endindex
:截止到哪个下标,结束下标不替换
splice(delindex,delnumber,updateval)
,删除元素。这个方法接收三个参数,delindex
:要删除元素的下标;delnumber
:删除的个数;updateval(可选)
:删除后替换的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| arr.push(15); console.log(arr);
arr.pop(); console.log(arr);
arr.unshift("从第一个添加"); console.log(arr);
arr.shift(); console.log(arr);
let filldata = [1, 2, 3, 4, 5, 6, 7, 8];
filldata.fill("5", 1, 4); console.log(filldata);
let splicedata = [1, 2, 3, 4, 5, 6, 7, 8];
splicedata.splice(0, 1, "开始"); console.log(splicedata);
|
数组移动示例
splice
如果删除的个数为 0 时,并且有替换的元素则会在这个位置新增数据,数组长度加 1,原有数据保留。
1 2 3 4 5 6 7 8 9 10 11 12
| let arr = [1, 2, 3, 4]; function move(arr, from, to) { const newarr = [...arr]; let item = newarr.splice(from, 1); console.log(newarr); newarr.splice(to, 0, ...item); return newarr; }
console.table(move(arr, 1, 2));
|
清空数组的多个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
let arr = [1, 2, 3, 4, 5]; let newarr = arr; arr = []; console.log(arr); console.log(newarr);
let len = [1, 2, 3, 4, 5]; let newlen = len; newlen.length = 0; console.log(len); console.log(newlen);
|
includes 判断元素是否在数组内
indexOf()
,查找到元素后返回元素的下标,否则返回-1
includes()
,如果元素在数组内就返回 true,不在返回 false
1 2 3 4 5 6
| let arr = [1, 2, 3, 4, 5];
console.log(arr.indexOf(2));
console.log(arr.includes(2));
|
find 查找元素
find()
,返回找到的元素本身,找到就不会继续往下找,找不到返回[]
findIndex()
,返回要找元素的下标,找到就不会继续往下找,找不到返回-1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| let findarr = [ { name: "css", money: "999", }, { name: "js", money: "899", }, { name: "html", money: "699", }, ];
let data = findarr.find((item) => { return item.name == "js"; });
let dataidnex = findarr.findIndex((item) => { return item.name == "jssss"; }); console.log(data); console.log(dataidnex);
|
数组排序的方法
sort()
,a -b 从小到大, b -a 从大到小
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| let arr = [ { name: "小米10", money: 3999, }, { name: "小米10青春版", money: 2399, }, { name: "小米9", money: 2999, }, ];
arr.sort((a, b) => { return a.money - b.money; }); console.table(arr);
|
sort 实现原理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| let arr = [4, 3, 6, 9, 4, 2, 0];
function sorts(array, callback) { let arrlength = array.length; for (let i = 0; i < arrlength; i++) { for (let m = 0; m < arrlength; m++) { if (callback(array[i], array[m]) > 0) { let temp = array[i]; array[i] = array[m]; array[m] = temp; } } } return array; } arr = sorts(arr, function(a, b) { return b - a; }); console.table(arr);
|
for of 和 for in 循环
for of
如果数组内是数值类型,fon of 不能改变原数组。
- 如果数组内元素是引用类型是 for of 可以改变原数组
for in
利用 for in 遍历下标,通过下标可以直接改变原数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| let arr = [1, 2, 3, 4, 5];
for (let newarr of arr) { newarr++; } console.table(arr);
for (let newarr in arr) { arr[newarr]++; } console.table(arr);
let yinyongarr = [ { name: "小米10", money: 3999, }, { name: "小米10青春版", money: 2399, }, { name: "小米9", money: 2999, }, ];
for (let newarr of yinyongarr) { newarr.name = `XiaoMi${newarr.name}`; } console.table(yinyongarr);
for (let [key, val] of array.entries()) { console.log(key, val); }
|
forEach 操作 DOM 元素
element.addEventListener("click",()=>{})
可以给某个元素添加不同事件
1 2 3 4 5 6 7 8
| ul { list-style: none; }
.tagglecolor { color: rgb(218, 20, 20); text-decoration: line-through; }
|
1 2 3 4
| <ul> <li>css</li> <li>js</li> </ul>
|
1 2 3 4 5 6 7 8
| let lis = document.querySelectorAll("li"); lis.forEach((item) => { console.log(item); item.style.fontSize = "30px"; item.addEventListener("click", function() { this.classList.toggle("tagglecolor"); }); });
|
every 和 some 的用法
some
,只要有一个或者多个满足条件就返回 true,否则返回 false
every
,必须所有的都满足条件才会返回 true,否则返回 false
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| let arr = [ { name: "张三", fraction: 56, }, { name: "李四", fraction: 79, }, { name: "王五", fraction: 89, }, ];
let someres = arr.some((item) => { return item.fraction > 60; }); console.log(someres);
let everyres = arr.every((item) => { return item.fraction > 60; }); console.log(everyres);
|
filter 过滤函数
filter
筛选出满足条件的数据返回一个新数组,没有的话返回 []
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| let arr = [ { name: "小米10", money: 3999, }, { name: "小米10青春版", money: 2399, }, { name: "小米9", money: 2999, }, ];
let newarr = arr.filter((item) => { return item.money < 3000; }); console.table(newarr);
function filter(array, callback) { let newarr = []; for (let val of array) { if (callback(val)) { newarr.push(val); } } return newarr; }
let newfilter = filter(arr, (val) => { return val.money < 3000; }); console.table(newfilter);
|
map 映射数组与引用类型处理技巧
map
会改变原来的数组,如果数组里面的元素是数值类型通过 map 处理不会改变原数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| let arr = [ { name: "小米10", money: 3999, }, { name: "小米10青春版", money: 2399, }, { name: "小米9", money: 2999, }, ];
console.table(arr);
let newarr = arr.map((item) => { return Object.assign(item, { money: (item.money -= 200) }); }); console.table(newarr);
let numdata = [1, 2, 3, 4, 5]; let newnumdata = numdata.map((item) => { return item * 5; }); console.table(numdata); console.table(newnumdata);
|
reduce 函数的妙用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| let arr = [1, 2, 1, 1, 5, 6, 1, 6];
function total(array, val) { return array.reduce((count, value) => { count += value == val ? 1 : 0; return count; }, 0); } console.log(total(arr, 6));
let maxarr = [1, 45, 2, 98, 65, 45]; function countMaxArr(arr) { return arr.reduce((pre, val) => { pre = pre > val ? pre : val; return pre; }); } console.log(countMaxArr(maxarr)); console.log(Math.max(...maxarr));
let cart = [ { name: "miaomi10", price: 3999, }, { name: "miaomi9", price: 3799, }, { name: "miaomi10", price: 3999, }, { name: "miaomi8", price: 2799, }, ]; function filtercart(arr) { return arr.reduce((pre, val) => { let finds = pre.find((item) => { return item.name == val.name; }); if (!finds) { pre.push(val); } return pre; }, []); } console.log(filtercart(cart));
|