-
ES5:提供了一些新的API 1.保护对象:波阿虎对象的属性和方法 1.四大特性可以波阿虎对象: 1.对象的每一个属性都要四大属性,三个开关默认为true { value:1001//保存实际值的地方 writable:true//开关:控制属性是否可以被修改 enumerale:true//开关:控制属性是否可以被for in循环遍历 configurable:false//开关:控制属性是否可以被删除。总开关 } 2.修改对象的某个属性的四大属性特征: Object.defineProperties(obj,{ "属性名":{四大属性},
)} 2.三个级别: 1.防扩展:防添加 Object.preventExtensions(obj); 2.密封:防添加,防删除 Object.seal(obj) 3.冻结:防添加防修改防删除 2.数组新的API:三组6个 1.判断:判断数组中元素是否满足我们的条件 1.every:判断数组中的元素是否[都]满足我们的条件类似于&& 2.some:判断数组中的元素是否[包含]满足我们的条件类似于|| 语法:arr.every/some(function(val,i,arr){ val//当前值 //i当前值的下标 //arr数组本身 //虽然提供了三个形参,但是到底要用几个看我们自己 return 判断条件 }) 2.遍历:把数组中每个元素取出来执行相同或相似的操作 1.foreach:直接修改原数组 arr.for(function(val,i,arr){ 直接操作;
})2.map:不修改原数组,直接返回新的数组 var new=arr.map(function(){ return 直接写操作;
})3.汇总和过滤: 1.过滤:筛选出符合条件的元素,-不会修改原数组 var substr=arr.filter(function(val,i,arr){ var subArr=arr.filter(function(val,i,arr){ return 判断条件; }) 2.汇总:将所有的数组的元素进行+-*/ var sum=arr.reduce(function(prev,val,i,arr){ return prev+val;
},base)
以上6个API简化了for循环 3.var 子对象=Object.create(父对象,{ "属性名":{四大特征},
})根据一个父元素创建一个子对象并且继承已经设置完毕,提前保护对象
4.call/apply/bind:替换函数中的this
1.call/apply:临时替换函数中this-借
差别:call要求传入的实参必须单独传入
apply:要求传入的实参必须整理为一个数组,只能传入一个数组参数
强调:call和apply相当于立刻调用函数
用法:方法名.call(借用的队形,实参,..)
方法名:apply:(借用的队形[实参1,实参])-apply自动打散这个数组
固定套路:
Object.prototype.tostring().call/apply(数组)
Math.max/min.apply(Math,arr)
关键点:将数组转为普通数组
lis=Array.protptype.slice.call(lis);
bind:永久替换了函数中的this-买
三件事:
1.创建了一个函数功能和原函数完全一样
2.将函数的this永久绑定为了你指向的对象
3.将信函书中的部分固定参数提前永久绑定
用法:var 新方法=方法名.bind(永久绑定的对象,永久绑定的参数,..)
不会立刻执行,需要我们手动调用
个人建议:如果你的方法经常反复使用,可以使用Bind-买
如果需要一个方法立刻就要执行,建议call/apply-借
ES6:简化了/改变了语法:
1.模板字符串:支持直接在字符串中书写
我都名字教${name}
再也不用和了
2.块级作用域: 将var替换为let用于创建变量:优先使用let 作用: 1.let之前不允许出现未声明的同名的变量 -解决声明的提前 2.添加了块级作用域: 一个{}就是一个块 3.绑定事件时,会记录着当前元素的下标 不需要自己定义自定义下标
3.箭头函数;简化一切的回调函数:
回调函数:匿名函数,没有自调,就是回调
公式:去掉function,()和{}之间添加=>,如果形参只有一个省略(),如果函数只 有一句话省略{}如果函数只有一句话并且时return,{}和return都省略
箭头函数中如果出现this->外部的对象
建议:我们在事件中暂时不要简化为箭头函数
HTML:网页
XHTML:更严格的网页
DHTML:动态的网页
XML:数据格式
BOM:browser Object Model
提供专门用于操作浏览器的API
没有标准,但是大部分浏览器厂商已经统一的实现,除了老IE具有大量的兼容性问题,使用较少
DOM:本来时可以操作一切结构化文档(HTML/XML)的:三部分
1.核心DOM:万能,但是api比较繁琐:elem.setAttribute("属性名","属性值")
2.HTML DOM:只能操作HTML文档,API非常的简单:elem.属性值=值;
3.XML DOM:垃圾
建议:以后优先使用HTML DOM,HTML DOM实现不了,再用核心的DOM补充
2.DOM树中:保存所用网页内容的树状结构:树根:doucument不需要创建。由浏览器的js解释器自动创建,一个网页只有一个树根:
DOM节点/对象/元素:一个标签,文本,属性,注释等等
每个DOM节点/对象/元素的三大属性:
1.xx.nodeType:获取xx的节点类型
document:9
元素标签:1
文本节点:3
属性节点:2
对于开发者,没用
2.属性节点:nodevalue:获取属性节点的节点值
现在依然没用:我们现在用getAttribute("")能直接获取属性的值
3.nodeName:获取属性节点的名称:
直接找儿子的话,可能找到多种标签,但是我们希望对不同的标签执行不同的操作
特殊:获取出来的标签全是大写。
递归:函数中,再一次调用函数自己,但是迟早有一天要让它停下来
作用:专门用于【遍历层级不明确的树状结构】
1.创建函数,传入实参树根,形参借助,直接做第一层要做的操作
functon f1(root){
直接第一层操作
//判断自己有没有下一级。如果有再次调用此方法,但传入的实参已经变成了你的下一级
}
调用函数
f1(实际的根元素)
算法:深度优先!优先遍历当前节点的子节点
子节点遍历完,才会跳到到兄弟节点
递归;优点:直观,易用
缺点:效率较低,同时开启的函数很多,内存空间,不是任何时候否要使用,几乎不担心
循环:优点;效率高
缺点:难度极大!
遍历API:专门用于【遍历层级不明确的树状结构】
2步:
1.创建treewalker对象
var tw=document.createTreeWalker(root,NodeFilter,SHOW_ALL/SHOW_ELEMENT;)
2.反复调用nextNode方法:
while((node=tw.nextNode())!=null){
node;//当前节点做什么操作
}
深度优先算法
注意:此方法必须跳过起点
纯循环遍历层级不明确的树状结构-别用
查找元素: 1.按照HTML的特点去查找元素4个 var elem=document.getElementByid("id") 找到了是单个元素,没找到一定是null var elem=document.getElementsByTagName/className/Name("标签/class名/name值") 找到了是个集合,没找到一定是一个空集合[]
2.按照CSS选择器进行查找:2个 1.单个元素,没找到一定是一个Null,如果有多个,也只会找到第一个 var elem =document.querySelector("任意css选择器") 2.多个元素,找到的是一个集合,没找到空集合 var elem =document.querySelectorAll("任意css选择器") getxx和querySelectorxxx的区别? 1.返回结果的不同: getxxx返回是一个动态的集合(每次DOM树修改,都会悄悄的再次查找) querySelectXXX - 返回是一个静态集合 (每次DOM树修改,不会再次查找,只管第一次找到的结果) 2.动态集合,不支持forEach 静态集合,支持forEach 3.复杂查找时,尽量使用 var elem=document.querySelectorAll("任意css选择器")