ECMAscipt:核心语法简化

121 阅读6分钟
  1. 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选择器")