一、数组Array
1.1.数组length属性
获取数组长度:
var names = ["abc", "cba", "bac", "nba"]
console.log(names.length)
//length属性可写
names.length = 10//扩容为10,其他为empty
name.length = 2//截取为2
清空数组的最简单方法为:arr.length = 0
1.2.数组的遍历
-
普通for循环
-
for(var i=0; i < names.length; i++) { clg(names[i]) }
-
-
for...in...遍历
-
//可迭代:String/数组/元素列表(对象) for (var index in names) { clg(index, names[index]) }//拿到的是索引
-
-
for...of..
-
for (var item of names) { clg(item) }//拿不到索引
-
-
forEach函数(高阶函数)
names.forEach(function(item, index, arr)) { clg(item, index, arr) } -
手动实现高阶函数
Array.prototype.hforEach = function(fn) { for (var i = 0; i < this.length; i++) { fn(this[i], i, this) } } names.hforEach(function(item, index, names) { clg(item, index, names) })
1.3.数组的其他方法
-
arr.slice 方法//用于数组的截取(类似于字符串的slice方法)
-
slice方法不会修改原数组(splice直接修改)
-
var neWNames = names.slice(start, end)//不包含end clg(newNames)
-
-
arr.concat方法//创建一个新数组,其中包含来自其他数组和其他项的值
-
var newNames = [] newNames.push(...names1)//...展开运算符 var newNames = names1.concat(names2, names3)
-
-
join方法---split(切割)
-
clg(names.join("-"))//为字符串
-
1.4.数组中查找元素
-
1.数组中存放的是原始类型
-
names.indexOf("nba","start") 找到返回对应的索引,未找到返回-1
-
-
2.数组中存放的是对象类型
-
var students = [ {id:100}, {id:101}, {id:102}, {id:103} ] //查找id为101的学生 //for循环 for(var i =0; i < students.length; i++) { if (students[i].id === 101) { clg(students[i]) break } } //find方法:高阶函数 //函数内部多次(数组元素个数)调用 var stu = students.find(function(item) { if (item.id === 101) return ture }) //includes方法 clg(names.includes("bac")) //findIndex方法:查找元素索引 names.findIndex(function(item, index, arr) { return item === "nba" })
-
1.5.数组的排序和反转
- 排序
//sort方法
var nums = [20, 4, 10, 15, 100, 88]
nums.sort(function(item1, item2) {
//item1与item2进行比较
//谁小谁在前
return item1 - item2
})
//想要升序:
//reverse进行反转
clg(nums.reverse())
//return item2 - item1
//复杂类型排序
var students = [
{age: 18},
{age: 25},
{age: 17},
{age: 28}
]
students.sort(function(item1, item2) {
return item1.age - item2.age
})
1.6.函数的其他方法
//filter函数:过滤
//拿到偶数
var nums = [10, 12, 20, 7, 9, 14]
var newNum = nums.filter(function(item) {
return item % 2 === 0
})
//map函数:映射
var newNum = nums.map(function(item) {
return item * item
})
//reduce函数:累加
//如果initialValue没有传入,那么将直接进行第二次计算
var result = nums.reduce(function(preValue, item) {
return preValue + item
},initialValue)
//综合
var total = nums.filter(function(item) {
return item % 2
}).map(function(item) {
return item * item
}).reduce(function(preValue, item) {
return preValue + item
}, 0)
二、日期Date
2.1.创建Date对象
-
new Date(); new Date(value); new Date(dateString); new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milloseconds]]]]]);
2.2.Date方式
-
目前表示方式有两种: RFC 2822 标准 或者 ISO 8601 标准(默认打印时间格式是RFC 2822标准)
-
转为 ISO 8601标准
var date = new Date()
clg(date.toISOString)
-
获取想要信息
date.getFullYear() date.getMonth()//得到的数据为0-11 date.getDate() date.getHours() date.getMinutes() date.getSeconds() //手动修改:set方法 date.setFullYear() //set方法会自动校验 如果月份与日期不符,自动修正 //String方法:个位时补0 //第一个参数为补齐时的位数,第二个为补齐所用string var str = "4" clg(str.padStart(2, "0")) clg(str.padEng(2, "0"))
2.3.Date获取Unix时间戳
-
var date = new Date(时间戳) //当前时间的时间戳 var timestamp = Date.now() //将Date转成时间戳 var timestamp = date.getTime() var timestamp = date.valueOf() clg(+date0) //计算一个操作所需要的时间 var startTime = Date.now() for (var i = 0; i < 10000; i++) { clg(i) } var endTime = Date.now() clg(endTime - startTime)
2.4.将字符串时间转为时间戳
-
var timeString = "2033-03-23" //方法一: var date = new Date(timeString) var timeStamp = date.getTime() //方法二: var timestamp = Date.parse(timeString) //str需要符合 RFC 2822 或 ISO 8601标准 //其他格式也许支持,但结果不一定正确 //如果输入的格式不能被解析,那么就会返回NAN
三、DOM
3.1.了解API/DOM/BOM
-
API(application programming interfance):应用程序编程接口
-
DOM(Document Object Model):文档对象模型
-
BOM(Browser Object Model):浏览器对象模型
3.2.document对象
-
Document节点表示的整个载入的网页,对DOM的操作都是从document对象开始的
-
var htmlEl = document.documentElement var bodyEl = document.body var headEl = document.head var doctype = document.doctype
3.3.节点(Node)之间的导航(navigator)
-
获取所有的节点(Node)的导航:包括文本/注释
-
var bodyEl = document.body //获取body所有的子节点 clg(bodyEl.childNodes) //获取body的第一个子节点,最后一个(last) var bodyElFirstchild = clg(bodyEl.firstChild) //获取下一个节点,前一个(previous) clg(bodyElFirstchild.nextSibling) //获取父节点 clg(bodyEl.parentNode)
3.4.元素(element)之间的导航(navigator)
-
var bodyEl = document.body //根据body元素获取子元素(element) var childElements = bodyEl.children //获取第一个元素 var childElement1 = bodyEl.firstElementChild var childElement1 = bodyEl.child[0] //获取下一个元素(上一个:previous) var childElement2 = childElement1.nextElementSibling
3.5.table和form元素之间的导航
-
var tableEl = documtnt.body.children[0] //通过table元素获取内部的后代元素 clg(tableEl.thead, tableEl.tBodies, tableEl.tFoot) //tr元素集合--tbody.rows //定tr内的td和th集合--tr.cells //form之间的导航 var formEl = document.forms[0] var formEl = document.body.firstElementChild //获取form中的子元素 var inputEl = formEl.elements[0]//独有 var inputEl = formEl.elements.name属性
3.6.获取任何元素的方法
-
//方法一:用导航一步一步获取 //方法二:通过classname获取元素 var keywordEls = document.getElementsByClassname("keyword") //修改第一个 keywordEls[0].style.color = "red" //修改所有 for (var i = 0; i < keywordEls.length; i++) { keywordEls[i].style.color = "red" } //方法三:通过id获取元素 var titleEl = document.getElementById("title") //方法四:通过选择器查询 var keywordEl = document.querySelector(".keyword")//传入选择器,只找一个 var keywordEls = document.querySelectorAll(".keyword")//找全部,可迭代对象 for (var el of keywordEls) { clg(el) } var titleEl = document.querySelector("#title")
3.7.DOM-Node常见属性
-
// , 注释,文本,div.box //1.获取三个节点 var bodyChildNodes = document.body.childNodes var commentNode = bodyChildNodes[1] var textNode = bodyChildNodes[2] var divNode = bodyChildNodes[3] //1.nodeType:节点类型 clg(commentNode.nodeType, textNode.nodeType, divNode.nodeType) //2.nodeName:节点名称 clg(commentNode.nodeName, textNode.nodeName, divNode.nodeName) //3.tagName:针对元素获取名称 clg(commentNode.tagName, divNode.tagName) //4.data:针对非元素节点获取数据 clg(commentNode.data, textNode.data, divNode.data) //5.innerHTML:针对元素节点获取数据(带其内部的标签) clg(divNode.innerHTML) //6.textContent:针对元素节点获取数据(只显示内容) clg(divNode.textComtent) 设置时包含元素内容,那么innerHTML浏览器会解析, textComtent会当成文本的一部分 divNode.innerHTML = "<h2>嘿嘿</h2>" divNode.textContent = "<h2>嘿嘿</h2>" //7.outerHTML:带有div标签 clg(divNode.outerHTML)
3.8.元素的特性attribute
-
1.如果时HTML标准指定的attribute, 称之为标准Attribute(id, class, href, value等)
-
2.自定义的Attribute, 称之为非标准Attribute(只能通过getAttribute去获取)
<div id="abc" class="box" title="box" age="18" height="1.88"> 我是box </div>//attribute不严格区分大小写,且他们的值总是字符串类型 var boxEl = document.querySelector(".box") //1.所有attribute都支持的操作 clg(boxEl.hasAttribute("age"))//判断是否有这个特性 clg(boxEl.getAttribute("age"))//获取特性 boxEl.setAttribute("id", "cba")//将abc-->cba boxEl.removeAttribute("id")//移除特性 var boxAttributes = boxEl.attributes//拿到所有特性 for (var attr of boxAttributes) { clg(attr.name, attr.value) } ```
3.9.元素的属性property
-
对象内的属性称为property, 元素内的属性称为attribute
-
标准的attribute在对应的对象模型中都有对应的property
-
attribute和property之间是相互影响的
-
除非特殊情况,大多数情况下设置、获取attribute,推荐使用property的方式(默认情况下有类型)
3.10.DOM-Element元素的class和style
-
<div class="box" style=""> 我是box </div> -
//1.获取box var boxEl = document.querySelector(".box") //2.监听点击 boxEl.onclick = function() { boxEl.style.color = "red"//直接修改style //动态添加class boxEl.className = "active" } //class操作方式 //方式一:className boxEl.className = "abc"(缺点是会替换掉原有的class) //方式二:classList(操作对象) boxEl.classList.add("abc")//添加class boxEl.classList.remove("abc")//移除class boxEl.classList.toggle("active")//如果类不存在就添加,如果存在就移除 -
//style用法 //1.多词属性使用小驼峰:backgroundColor //2.如果将一个属性的值设置为空的字符串,那么使用默认值 //3.设置多个样式(会覆盖,不推荐) boxEl.style.cssText = "font-size: 30px; color: red;" //style的读取:getComputedStyle(全局函数) clg(getComputedStyle(boxEl).fontSize)
3.11.date-属性
-
<div id="abc" class="box" title="box" data-age="18" data-height="1.88"> 我是box </div> -
var boxEl = document.querySelector(".box") clg(boxEl.dataset.age) clg(boxEl.dataset.height)
3.12.创建元素
-
<div class="box"> <span>呵呵呵</span> <p>哈哈哈</p> </div> -
var boxEl = document.querySelector(".box") //1.通过innerHTML(不推荐) boxEl.innerHTML = ` <h2 class="title">我是标题</h2> ` //2.创建DOM对象 var h2El = document.creatElement("h2") //将元素插入boxEl(在box的最后) boxEl.append(h2El) //最前面(prepend) boxEl.prepend(haEl) //和box为兄弟元素且在其后面:after boxEl.after(h2El) //box前面:before boxEl.before(h2El) //替换box boxEl.replaceWith(h2El)
3.13.移除---克隆元素
-
<button class="remove">移除box</button> <button class="clone">复制box</button> <div class="box"> <span>呵呵呵</span> <p>哈哈哈</p> </div> -
var boxEl = document.querySelector(".box") var remove = document.querySelector(".remove") var clone = document.querySelector(".clone") remove.onclick = function() { boxEl.remove() } //不加true不会克隆子元素,加了会深克隆 clone.onclick = function() { var newNode = boxEl.cloneNode(true) newNode.children[0].textContent ="我也是标题" //插入 boxEl.after(newNode) }
四、事件
4.1.认识事件(Event)
- 用户点击某个按钮,用户在输入框里面输入某个文本,鼠标经过某个位置
- 浏览器需要搭建一条JavaScript代码和事件之间的桥梁
- 当某个事件发生时,让JavaScript发生响应,所以我们需要针对事件编写处理程序
4.2.事件处理三种方案
-
<button onclick="clg('按钮一发生了点击')">按钮一</button> <button class="btn2">按钮二</button> <button class="btn3">按钮三</button>//1.直接在html中编写JavaScript代码(不推荐) var btn2El = document.querySelector(".btn2") var btn2El = document.querySelector(".btn3") //2.onclick属性 box2El.onclick = function() { clg("按钮二发生了点击") } //3.addEventListener(点击一次可以执行多个函数) btn3El.addEventListener("click", fn1) btn3El.addEventListener("click", fn2)
4.3.事件流--事件冒泡--事件捕获
-
<div class="box"> <span></span> </div>//1.事件流 //当我们对span进行点击的时候,点击的不仅仅是这个元素本身 //这是因为我们的HTML元素存在父子元素叠加层级 //当span元素发生点击,div及body也会发生点击 //2.事件冒泡 //事件流的顺序从内到外,这被称为事件冒泡 //3.事件捕获 //事件流的顺序从外到内,这称之为事件捕获 //传入第三个参数:true, 监听事件捕获 span.addEventListener("click", function() { clg(span发生点击) }, true) div.addEventListener("click", function() { clg(div发生点击) }, true) body.addEventListener("click", function() { clg(body发生点击) }, true) //都监听的话顺序为:捕获阶段--> 目标阶段 --> 冒泡阶段
4.4.事件对象
-
<div class="box"> <span> <button>按钮</button> </span> </div>//少用属性 divEl.onclick = function(event) { clg("div发生了点击", event.type)//事件类型 clg(event.eventPhase)//事件所处阶段 clg(event.OffsetX, event.OffsetY)//事件在元素内的位置 clg(event.clientX, event.clientY)//事件发生在客户端的位置 clg(event.pageX, event.pageY)//事件发生在客户端的位置(包括滚动上去的距离) clg(event.screenX, event.screenY)//事件发生相对于屏幕的位置 } //常用属性 //当点击对象和监听对象为同一个时,这两没有区别 clg(event.target)//事件发生的元素 clg(event.currentTarget)//当前处理事件的元素 clg(event.target === event.currentTarget) //常用方法 //阻止默认行为 var aEl = document.querySelector("a") aEl.onclick = function(event) { event.preventDefault()//阻止默认行为 } //阻止事件传递 var btnEl = document.querySelector("button") var spanEl = document.querySelector("span") var divEl = document.querySelector("div") divEl.addEventListener("click", function(event) { clg("div的事件捕获监听") event.stopPropagation()//阻止下一步传递 },true) spanEl.addEventListener("click", function() { clg("span的事件捕获监听") },true) btnEl.addEventListener("click", function() { clg("btn的事件捕获监听") },true) divEl.addEventListener("click", function() { clg("div的事件冒泡监听") }) spanEl.addEventListener("click", function() { clg("span的事件冒泡监听") }) btnEl.addEventListener("click", function() { clg("btn的事件冒泡监听") })
4.5.EventTarget类
-
所有节点,元素都继承自EventTarget
-
EventTarget是一个DOM接口,主要用于添加,删除,派发Event事件
-
//1.addEventListener var btnEl = document.querySelector("button") var foo = function() { clg("按钮被点击") } btnEl.addEventListener("click", foo) //2.removeEventListener //过5s将事件监听移除 setTimeout(function() { btnEl.removeEventListener("click", foo)//foo为需要移除的函数 }, 5000) //3.dispatchEvent(派发事件) window.dispatchEvent(new Event("事件类型"))
4.6.鼠标事件
-
//1.click:当用户点击某个对象时 //2.contentmenu:当用户点击鼠标右键打开菜单时 //3.dbclick:双击某个对象时 //4.mousedown:鼠标按钮被按下 //5.mouseup:鼠标按钮松开 //6.mouseover:鼠标移到某个元素之上(支持冒泡) //7.mouseout:鼠标从某个元素移开(支持冒泡) //8.mouseenter:当鼠标指针移动到元素上时触发(不支持冒泡) //9.mouseleave:当鼠标移出元素时触发(不支持冒泡) //10.mousemove:鼠标被移动
4.7.键盘事件
-
//1.onkeydown:某个键盘按键被按下时 //2.onkeypress:某个按键被按下时 //3.onkeyup:某个按键被松开 //down事件先发生,press发生在文本被输入,up发生在文本输入完成
4.8.表单事件
-
//1.onchange:该事件在表单内容改变时触发 //2.oninput:元素获取用户输入时触发 //3.onfocus:元素获取焦点时触发 //4.onblur:元素失去焦点的时候触发 //5.onreset:表单重置时触发(监听form) //6.onsubmit:表单提交时触发(监听form)
4.9.文档加载事件
-
//文档加载完成时,浏览器进行回调执行函数 <script> window.onload = function() { var boxEl = document.querySelector(".box") boxEl.style.backgroundColor = "orange" } </script> <div class = "box"></div> //浏览器已完全加载HTML,并且构建了DOM树,但<img>和样式表之类的外部资源可能未加载完成 //DOMContentLoaded
4.10.其他事件
-
http://developer.mozilla.org/zh-CN/docs/Web/Events
五、BOM
5.1.认识BOM
- BOM:浏览器对象模型(Browser Object Model )
- 由浏览器提供的用于处理文档之外的所有内容的其他对象(navigator, location, history)
5.2.window对象的使用
-
//视角一:全局对象 //视角二:浏览器窗口对象 -
//方法一:window.open window.open("http://www.baidu.com", "_self") //方法二:关闭窗口 window.close()
5.3.location对象
-
//location对象用于表示window上当前链接到的URL信息 //常见属性 //1.href(完整链接) clg(location.href) //2.hostname(主机地址) clg(location.hostname) //3.host(主机地址+端口号) clg(location.host) //4.protocol(获取协议) clg(location.protocol) //5.port(端口) clg(location.port) //6.pathname(路径) clg(location.pathname) //7.search(查询字符串) clg(location.search) //8.hash(哈希值) clg(location.hash) //location方法 location.assign()(打开一个新的网页) location.replace()(替换该网页) location.reload()(刷新网页)
5.6.history对象
-
修改history和hash值页面不刷新
-
//修改history history.pushState({ name: "6", age: 18}, "", "/6") //返回上一级 histo.back() //前进一级 histo.forward() //go history.go(前进后返回的层级) //replaceState(替换,不能返回) history.replaceState
六、JSON
6.1.JSON的由来
- 1.在目前的开发中,JSON是一种非常重要的数据格式,它不是编程语言,而是一种可以在服务器和客户端之间传输的数据格式
- JSON全称为:JavaScript Object Notation(JavaScript对象符号)
6.2.JSON序列化和反序列化
-
var obj = { name: "d", age: 18, height: 1.88, friend: { name: "p" } } //1.将obj对象进行序列化 var objJSONString = JSON.stringfy(obj) //2.将对象储存到LocalStorage localStorage.setItem("info", objJSONString) var item = localStorage.getItem("info") //3.将字符串转回到对象(反序列化) var newObj = JSON.parse(item) clg(newObj )