1.国人开发的一个轻量级框架。
2.双向数据绑定,在数据操作方面更为简单。
3.视图,数据,结构分离,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作。
4.组件化,方便封装和复用
5.虚拟DOM: dom操作是非常耗费性能的,不再使用原生的dom操作节点,极大解放dom操作
第一步:父组件在引用组件是,通过属性绑定(v-bind: ) 的形式,把需要传递给子组件的数据,传递到子组件内部,供子组件使用
第二步:把父组件传递过来的数据,在props数组中定义一下
1.组件中的所有props 中的数据,都是通过父组件传递给子组件的
2. props中的数据都是只读的,无法重新赋值
第三步:在该子组件中使用props数组中定义好的数据
流程:
1.子组件创建并监听自定义事件,
2.在事件函数里面执行emiti函数,通过emit把想传的值传给父组件
3.父组件在子组件上监听emit定义的事件名称并绑定自身的函数,在函数的参数中接收子组件传递的参数。
v-if 和 v-show 都是动态显示DOM元素。
1、编译过程: v-if 是 真正 的 条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-show 的元素始终会被渲染并保留在 DOM 中。
v-show 只是简单地切换元素的 CSS 属性display。
2、编译条件: v-if 是惰性的:如果在初始渲染时条件为假,则什么也不做。直到条件第一次变为真时,才会开始渲染条件块。
v-show不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
3、性能消耗: v-if有更高的切换消耗。
v-show有更高的初始渲染消耗。
4、应用场景: v-if适合运行时条件很少改变时使用。
v-show适合频繁切换。
它就是webpack的一个加载器,主要作用就是解析和转换.vue文件,提取vue中的逻辑代码,style样式和html模板,再分别交给对应的loader去处理,
简单来说,就是把你写的vue代码转换成浏览器能识别的,然后还包含了一些打包和编译的功能
template
script
style
Axios是一个基于promise的HTTP库,类似于jQuery的ajax,用于http请求。可以应用于浏览器端和node.js,既可以用于客户端,也可以用于node.js编写的服务端。
npm install axios
import axios from 'axios' //配置访问服务器基础路径 axios.defaults.baseURL="服务器地址"; //保存session信息 axios.defaults.withCredentials=true; //将axios注册到vue中 Vue.prototype.axios=axios;
axios.post("url",Qs.stringify({参数:值,参数:值})) .then(res=>{....})
单页面应用(SPA),通俗一点说就是指只有一个主页面的应用,浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中。但在写的时候,还是会分开写(页面片段),然后在交互的时候由路由程序动态载入,单页面的
页面跳转,仅刷新局部资源。多应用于pc端。
多页面(MPA),就是指一个应用中有多个页面,页面跳转时是整页刷新
单页面的优点:
单页面缺点:
npm i module_name -S 即 npm install module_name --save写入dependencies,发布到生产环境
npm i module_name -D 即 npm install module_name --save-dev 写入devDependencies,发布到开发环境
npm i module_name -g 即 global全局安装(命令行使用)
npm i module_name 即 本地安装(将安装包放在./node_modules下)
注:使用npm install(简写npm i) ---->使用cnpm更快!
MVM分为Model、View、ViewModel三者。
这种模式实现了Model和View的数据自动同步,因此开发者只需要专注对数据的维护操作即可,而不需要自己操作dom。
三个基本部分:模型 (Model)、视图(View)和控制器(Controller)
• (控制器Controller)- 负责转发请求,对请求进行处理。
• (视图View) – 界面设计人员进行图形界面设计。
• (模型Model) – 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
在浏览器与服务器进行通信时,主要是通过 HTTP 进行通信。浏览器与服务器需要经过三次握手,每次握手需要花费大量时间。而且不同浏览器对资源文件并发请求数量有限(不同浏览器允许并发数),一旦 HTTP 请求数量达到一定数量,资源请求就存在等待状态,这是很致命的,因此减少 HTTP 的请求数量可以很大程度上对网站性能进行优化。
CSS Sprites
国内俗称CSS精灵,这是将多张图片合并成一张图片达到减少HTTP请求的一种解决方案,可以通过CSS的background属性来访问图片内容。这种方案同时还可以减少图片总字节数。
合并 CSS 和 JS 文件
现在前端有很多工程化打包工具,如:grunt、gulp、webpack等。为了减少 HTTP 请求数量,可以通过这些工具再发布前将多个CSS或者多个JS合并成一个文件。
采用 lazyLoad
俗称懒加载,可以控制网页上的内容在一开始无需加载,不需要发请求,等到用户操作真正需要的时候立即加载出内容。这样就控制了网页资源一次性请求数量。
浏览器在加载HTML内容时,是将HTML内容从上至下依次解析,解析到link或者script标签就会加载href或者src对应链接内容,为了第一时间展示页面给用户,就需要将CSS提前加载,不要受 JS 加载影响。
一般情况下都是CSS在头部,JS在底部。
浏览器缓存是将网络资源存储在本地,等待下次请求该资源时,如果资源已经存在就不需要到服务器重新请求该资源,直接在本地读取该资源。
基本原理:重排是DOM的变化影响到了元素的几何属性(宽和高),浏览器会重新计算元素的几何属性,会使渲染树中受到影响的部分失效,浏览器会验证 DOM 树上的所有其它结点的visibility属性,这也是Reflow低效的原因。如果Reflow的过于频繁,CPU使用率就会急剧上升。
减少Reflow,如果需要在DOM操作时添加样式,尽量使用 增加class属性,而不是通过style操作样式。
1.对象方法v-bind:class=" { 'orange ' :isRipe, 'green ':isNotRipe}” 2.数组方法v-bind: class=" [class1,c1ass2]" 3.行内v-bind : style="{color : color , fontsize:fontsize 'px '}”
promise只有两个状态resolve和reject
如果已经有了状态(resolve或者reject),则立刻调用回调函数
在异步事件状态pendding->resolve回调成功时,通过调用resolve函数返回结果;当异步操作失败时,回调用reject函数显示错误信息。
New Promise( function(resolve, reject) {...} /* executor */ );
调用then方法获取执行结果
promise.then((resolve) => { console.log(resolve); }, (err) => { console.log(err); });
关键字:async:async关键字用于修饰function
关键字:await::await关键字只能在async函数中才能使用
async function fn(){ await sayhello(); return 0; }
async
表示函数里有异步操作,
await
表示让出当前线程
,紧跟在后面的表达式需要等待结果。返回值是 Promise
async函数内部return语句返回的值,会成为then方法回调函数的参数。
1、通过NPM,你可以安装和管理项目的依赖,并且能够指明依赖项的具体版本号。
2、对于Node应用开发而言,你可以通过package.json文件来管理项目信息,配置脚本,以及指明依赖的具体版本
3、npm install xx -S:发布到生产环境
npm install -D的命令含义:发布到开发环境
4、npm uninstall xx是:卸载npm包
5、项目转换的时候,不会把node_modules包发过去,那么你拿到没有nodeModules目录的项目怎么让它跑起来(npm install安装所有的依赖)
初始化:npm init -y
beforeCreat() 创建前 在new一个vue实例后,只有一些默认的生命周期钩子和默认事件,其他的东西都还没创建。在此生命周期执行的时候,data和methods中的数据都还没有初始化。不能在这个阶段使用data中的数据和methods中的方法
created()被创建 data 和 methods都已经被初始化好了,可以调用了
beforeMount() 挂载前 在内存中已经编译好了模板了,但是还没有挂载到页面中,此时,页面还是旧的
mounted()已挂载 Vue实例已经初始化完成了。此时组件脱离了创建阶段,进入到了运行阶段。 如果我们想要通过插件操作页面上的DOM节点,最早可以在和这个阶段中进行
beforeupdate()更新前 页面中的显示的数据还是旧的,data中的数据是更新后的, 页面还没有和最新的数据保持同步
updated()更新 页面显示的数据和data中的数据已经保持同步了,都是最新的
beforeDestroy() 销毁前 Vue实例从运行阶段进入到了销毁阶段,这个时候上所有的 data 和
methods , 指令, 过滤器 ……都是处于可用状态。还没有真正被销毁
destroyed()被销毁 这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于不可用状态。组件已经被销毁了。
基本流程:
a.域名解析
b.发起TCP的3次握手
C.建立TCP连接后发起http请求
d.服务器端响应http请求,浏览器得到htm|代码
e.浏览器解析html代码,并请求html代码中的资源
f.浏览器对页面进行渲染呈现给用户
function trim(str) { if (str & typeof str === "string") { return str .replace(/(^s*)I(s*)$/g,""); //去除前后空白符 } }
// 方法一: var arr1 =[1,2,2,2,3,3,3,4,5,6], arr2 = []; for(var i = 0,len = arr1.length; i< len; i++){ if(arr2.indexOf(arr1[i]) < 0){ arr2.push(arr1[i]); } } document.write(arr2); // 1,2,3,4,5,6
IE浏览器Hack一般又分为三种,条件Hack、属性级Hack、选择符Hack
//1、条件Hack <! --[if IE]> <style> .test{color : red; }</style> <! [endif]--> // 2、属性Hack .test{ color : #0909; /*t For IE8+*/ *color : #f00; /*For IE7 and earlier */ _color : #ff0; /*For IE6 and earlier */} //3、选择符Hack *htm1 .test{color : #090; } /*iFor IE6 and earlier * / *+ html .test{color : #ff0;} /*For IE7*/
箭头函数 promise this 指向 解构赋值
两者都是外部引用CSS的方式,但是存在—定的区别:
(1) link是XHTML标签,除了能够加载CSS,还可以定义RSS等其他事务;
@import属于CSS范畴,只可以加载CSs。
(2) link引用CSS时,在页面载入时同时加载;
@import需要页面完全载入以后再加载。
(3) link是XHTML标签,无兼容问题;
@import则是在CSS2.1提出的,低版本的浏览器不支持。
(4) link支持使用Javascript控制DOM改变样式;
@import不支持。
cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)
cookie数据始终在同源的http请求中携带(即使不需要),记会在浏览器和服务器间来回传递
sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存
存储大小
cookie数据大小不能超过4k
sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
有期时间:
localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据
sessionStorage 数据在当前浏览器窗口关闭后自动删除
cookie 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
<!--阻止事件冒泡.stop--> <div id="div1" class="stop" @click.stop="event1(1)"> <!--使用事件捕获模式.capture--> <div id="div4" class="stop" @click.capture="event1(4)"> <!--事件只作用本身.self,类似于已阻止事件冒泡--> <div id="div7" class="stop" @click.self="event1(7)"> <!--阻止浏览器默认行为.prevent--> <a href="https://github.com/dk-lan" target="_blank" @click.prevent="prevent">dk's github</a> <!--只作用一次.once--> <a href="https://github.com/dk-lan" target="_blank" @click.once="prevent">dk's github</a> <!--修饰符可以串联.click.prevent.once--> <a href="https://github.com/dk-lan" target="_blank" @click.prevent.once="prevent">
**ref有什么作用呢:**只要是想要在Vue中使用DOM元素,则必须在元素上用ref注册引用信息,之后再Vue中用$ref.注册名字引用该元素
(1)IE盒模型的width包含:content+border+padding
(2)W3C盒模型的width只包含:content
(3)用来控制元素的盒子模型的解析模式,默认为content-box
(4)context-box: W3C的标准盒子模型,设置元素的 height/width 属性指的是content部分的高/宽
(5)border-box:IE传统盒子模型。设置元素的height/width属性指的是border + padding + content部分的高/宽
可以继承的:
字体相关:font-family
、font-style
、font-size
、font-weight
等;
文本相关:text-align
、text-indent
、text-decoration
、text-shadow
、letter-spacing
、word-spacing
、white-space
、line-height
、color
等;
列表相关:list-style
、list-style-image
、list-style-type
、list-style-position
等;
其他属性:visibility
、cursor
等;
不能继承的:
border
padding
margin
width
height
CSS3实现圆角(border-radius),阴影(box-shadow),边框图片border-image
文字阴影:text-shadow: 5px5px 5px#FF0000;(水平阴影,垂直阴影,模糊距离,阴影颜色)
强制文本换行(word-wrap),线性渐变(linear-gradient)
旋转,缩放,定位,倾斜:transform:rotate(90deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);
增加了更多的CSS选择器、多背景、rgba();
在CSS3中唯一引入的伪元素是 ::selection ;
媒体查询(@media),多栏布局(flex)
px和em都是长度单位,区别是,px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,并且em会继承父级元素的字体大小。
浏览器的默认字体高都是16px。所以未经调整的浏览器都符合:1em=16px。那么12px=0.75em,10px=0.625em
以此为例:
<div class="father"> <div class="son"></div> </div>
.father { width: 300px; height: 100px; background-color: aquamarine; position: relative; } .son { width: 46px; height: 40px; background-color: bisque; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; }
.father { width: 200px; height: 100px; background-color: antiquewhite; /* 设置父项 */ display: flex; /* 设置子元素在主轴上的排列方式 */ justify-content: center; /* 设置子元素在侧轴的排列方式(单行排列方式) */ align-items: center; } .son { width: 100px; height: 40px; background-color: bisque; }
父盒子设置:dispaly: relative;
子盒子设置:transform: translate(-50%,-50%); position: absolute; top:50%; left:50%;
.father { dispaly: relative; background-color: antiquewhite; } .son { position: absolute; top:50%; left:50%; transform: translate(-50%,-50%); background-color: bisque; }
.father { display:tbale-cell; text-align:center; vertical-align:middle; background-color: antiquewhite; } .son { dislplay: inline-block; vertical-align:middle; background-color: bisque; }
属性:display:tbale-cell;
<script> console.log(typeof 123); //number console.log(typeof '123'); //string console.log(typeof function); //报错 function是关键字 console.log(typeof string); //undefined console.log(typeof undefined); //undefined console.log(typeof null); //object 较为特殊 console.log(typeof isNaN); //function 是个判断函数 console.log(typeof isNaN(123)); //boolean console.log(typeof []); // object 数组也是对象 console.log(Array.isArray); //ƒ isArray() { [native code] } console.log(Array.isArray()); //false console.log(toString.call([])); //[object Array] console.log([].constructor); //ƒ Array() { [native code] } </script>
总结出来
明确调用内置函数,强制把一种类型的值转换为另一种类型。
强制类型转换主要有:
在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加。之所以不同的数据类型之间可以做运算,是因为JavaScript 引擎在运算之前会悄悄的把他们进行了隐式类型转换。
**事件流:**当你在页面触发一个点击事件后,页面上不仅仅有一个元素响应该事件而是多个元素响应同一个事件,因为元素是在容器中的。事件发生的顺序就是事件流,不同的浏览器对事件流的处理不同。
1、window对象 ,是JS的最顶层对象,其他的BOM对象都是window对象的属性;
2、document对象,文档对象;
3、location对象,浏览器当前URL信息;
4、navigator对象,浏览器本身信息;
5、screen对象,客户端屏幕信息;
6、history对象,浏览器访问历史信息;
简述AJAX: AJAX即"Asynchronous Javascript And XML”(异步JavaScript和XML),
是指一种创建交互式网页应用的网页开发技术。
通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。
这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
// 实例化一个xhr对象 let xhr = new XMLHttpRequest() // 监听状态的变化 xhr.onreadystatechange = () =>{ // 监听数据请求完毕 readyState 0=>初始化 1=>载入 2=>载入完成 3=>解析 4=>完成 if(xhr.readyState === 4){ // 判断状态码 if( xhr.status === 200 ){ //将数据转化成json对象 alert(JSON.parse(xhr.responseText)) } } } // 设置请求 GET是请求方式(要传递的参数可以写在url后面) url是网址 true是异步请求数据改为false就是同步 xhr.open("GET",url,true); // 发送数据 也可以发送post请求要传递参数 xhr,send(null)
get 请求
post 请求
**200:**请求已成功,请求所希望的响应头或数据体将随此响应回。
**302:**请求的资源临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有Cache-Control 或 Expires 中进行了指定的情况下,这个响应才是可缓存的。
**304:**如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
**403:**服务器已经理解请求,但是拒绝执行它。
**404:**请求失败,请求所希望得到的资源未被在服务器上发现。
**500:**服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
(1)get是从服务器上获取数据,post是向服务器传送数据。
(2)get是将参数数据加到URL中,用户可以看到。post是将内容放置在http请求信息体内传送,用户看不到这个过程。
(3)对于get方法,服务器端是用Request.QueryString获取变量的值,对于post方法,服务器端用Request.Form获取提交的数据。
(4)get传送的数据量较小,不能大于2kb。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80kb,IIS5中为100kb。
(5)get安全性非常低,post安全性较高。但是执行效率却比post方法好。
1.无法使用缓存文件;
2.向服务器发送大量数据;
3.发送包含未知字符的用户输入时,post比get更稳定也更可靠
1、charAt(索引值) //查找具体的位置
"tian-qin-bai".charAt(0); //返回t
2、indexOf(searchValue[,fromIndex]) //返回字符串中一个子串第一处出现的索引,找不到时返回-1
"tian-qin-bai".indexOf("-"); //返回4 "tian-qin-bai-lucky".indexOf("-"); //返回4 "tian-qin-bai".indexOf("qin"); //返回5,即查找字符串的第一个位置 "micromajor".indexOf("-"); //返回-1
3、search(regexp) 返回匹配的位置,找不到返回-1
"tianbaiqin123".search(/[0-9]/); //返回10 "tianbaiqin123".search(/[A-Z]/); //返回-1
4、match(regexp) 返回匹配到的字符,以数组形式返回;找不到返回null
"tianbaiqin123".match(/[0-9]/); //返回["1"] "tianbaiqin123".match(/[0-9]/g); //返回["1","2","3"] "tianbaiqin123".match(/[A-Z]/); //返回null
5、replace(regexp|substr,newSubstr) //找到并替换成相应 的字符串
"tianbaiqin123".replace("123","###"); //返回"tianbaiqin###" "tianbaiqin123".replace(/[0-9]/,"#"); //返回"tianbaiqin#23" "tianbaiqin123".replace(/[0-9]/g,"#"); //返回"tianbaiqin###" "tianbaiqin123".replace(/[0-9]/g,""); //返回"tianbaiqin"
6、substring(indexA,indexB) //字符串截取准确的字符,indexA首位置(包含),indexB末尾位置(不包含)
"tianbaiqin".substring(5,7); //返回"ai" "tianbaiqin".substring(5); //返回"aiqin"
7、slice(beginSlice,endSlice) //字符串截取,首末位置,与subString()大同小异,然后不同的是可以传入负值(负值是从末尾数负数)
"tianbaiqin".slice(5,7); //返回"ai" "tianbaiqin".slice(5); //返回"aiqin" "tianbaiqin".slice(1,-1); //返回"ianbaiqi" "tianbaiqin".slice(-3); //返回"qin"
8、substr(index,length) //返回匹配的字符串
"tianbaiqin".substr(5,2); //返回"ai" "tianbaiqin".substr(5); //返回"aiqin"
9、slipt(separator[,limit]) //分隔符函数,以数组方式返回分隔后的字符串
"tian qin".split(" "); //返回["tian","qin"] "tian qin".split(" ",1); //返回["tian"] "tian1qin2bai".split(/[0-9]/); //返回["tian","qin","bai"]
10、toLowerCase() //将所有的字符串都转换为小写字母
"TianBaiQin".toLowerCase(); //返回"tianbaiqin"
11、toUpCase() //将所有的字符串都转换成大写字母
"TianBaiQin".toUpperCase(); //返回"TIANBAIQIN"
12、String() //转字符串
String(123); //"123" String(null); //"null"
<input type=”button” onclick=”showInfo(this);” value=”点击一下”/>
function Animal(name, color) { this.name = name; this.color = color; }
<input type="button" id="text" value="点击一下" /> <script type="text/javascript"> var btn = document.getElementById("text"); btn.onclick = function() { alert(this.value); //此处的this是按钮元素 } </script>
**1.push() 后增 **
push()方法可以向数组后添加一个新的元素,并返回新数组的长度。
末尾添加,返回长度,改变原数组
var a = [1,2,3] var b = a.push(4) console.log(a) // [1,2,3,4] console.log(b) // 4
2.unshift() 前增
unshift()可以向数组前添加一个或多个元素,并返回新的长度
首部添加,返回长度,改变原数组
var a = [2,3,4] var b = a.unshift(0,1) console.log(a) // [0,1,2,3,4] console.log(b) // 5
3.pop() 后删
pop() 用于删除并返回最后一个元素。
尾部删除,返回被删除的元素,改变原数组
var a = [1,2,3] var b = a.pop() console.log(a) // [1,2] console.log(b) // 3
4.shift() 前删
shift() 用于删除并返回首个元素
删除首部元素,返回被删元素,改变原数组
var a = [1,2,3] var b = a.shift() console.log(a) // [2,3] console.log(b) // 1
5.splice() 修改删除
plice(index,length,增加的元素1,增加的元素2…,增加的元素N) 表示从index开始删除length个元素,并从index开始新增元素1~N,放回被删除的元素组成的数组
对数组进行删除修改,返回被删除的元素组成的数组,改变原数组
var a = [1,2,3] var b = a.splice(1,1,3,[2,3,4],5) console.log(a) // [1,3,[2,3,4],5,3] console.log(b) // [2]
6.concat() 拼接
concat() 方法用来合并两个或多个数组
合并两个或多个数组,返回新数组,不会改变原数组
var a = [1,2,3] var b = [4,5] var c = a.concat(b) console.log(a) // [1,2,3] console.log(b) // [4,5] console.log(c) // [1,2,3,4,5]
7.slice() 剪切
slice(startIndex,endIndex) 返回从startIndex开始(包括),到endIndex(不包括)之间的原属组成的数组
返回新数组,不改变原数组
var a = [1,2,3] var b = a.slice(0,1) // 不填参数则表示剪切整个数组 var c = a.slice() console.log(a) // [1,2,3] console.log(b) // [1] console.log(c) // [1,2,3] console.log(a===c) // false // 注意 a !== c // 负数表示从后往前数 var d = a.slice(-1,-2) console.log(d) // [] 从左向右截取,所以说为[] var e = a.slice(-1) console.log(e) // [3]
8.join()
join() 方法用来将数组转换为字符串
不改变原数组,返回转换后的字符串
var a = [1,2,3,4,5] console.log(a.join(',')) // 1,2,3,4,5 console.log(a) // [1,2,3,4,5]
9.sort() 排序
按ascii码排序
改变原数组,返回排序后的数组
var a = ['a','b','d','c'] console.log(a.sort()) // ['a','b','c','d'] console.log(a) // ['a','b','c','d']
10.reverse() 颠倒顺序
reverse() 方法用于颠倒数组中元素的顺序。
返回的是颠倒后的数组,会改变原数组。
var a = [1,3,2,7,6] console.log(a.reverse()) // [6,7,2,3,1] console.log(a) // [6,7,2,3,1]
11.indexOf()和lastIndexOf()
indexOf(某元素,startIndex) 从startIndex开始,查找某元素在数组中的位置,若存在,则返回第一个位置的下标,否则返回-1
lastIndexOf(某元素,startIndex) 和indexOf()相同,区别在于从尾部向首部查询
不会改变原数组,返回找到的index,否则返回-1
若不使用下标,则一般通过includes()方法代替indexOf()
var a = [1,2,4,3,4,5] console.log(a.indexOf(4)) // 2 console.log(a.indexOf(4,3)) // 4
12.filter() 过滤
filter() 方法返回数组中满足条件的元素组成的新数组,原数组不变
filter()的参数是一个方法
var a = [1,2,3,4,11] // 第一个参数为一个方法,有三个参数,current:当前值 index:当前值下标 array:这个数组对象 var b = a.filter(function(current,index,array){ return current < 10 }) console.log(b) // [1,2,3,4] console.log(a) // [1,2,3,4,11]
13.map() 格式化数组
map() 方法来根据需求格式化原数组,返回格式化后的数组。原数组不变
var a = [1,2,3,4,5] // 参数同filter方法 var b = a.map(function(current,index,array){ return current + 1 }) console.log(b) // [2,3,4,5,6] console.log(a) // [1,2,3,4,5]
14.every()
对数组的每一项都运行给定的函数,若每一项都返回 ture,则返回 true
var a = [1,2,3,4,5] var b = a.every(function(current,index,array){ return current < 6 }) var c = a.every(function(current,index,array){ return current < 3 }) console.log(b) // true console.log(c) // false
15.some()
对数组的每一项都运行给定的函数,若存在一项或多项返回 ture,则返回 true
var a = [1,2,3,4,5] var b = a.some(function(current,index,array){ return current > 4 }) var c = a.some(function(current,index,array){ return current > 5 }) console.log(b) // true console.log(c) // false
16.forEach() 数组遍历
遍历整个数组,中途不能中断
var arr = ['a','b','c'] var copy = [] arr.forEach(function(item){ copy.push(item) }) console.log(copy)
**1.find() **
找到数组中第一次满足条件的元素,并返回,若找不到则返回undefined。不改变原数组。
和filter()方法的区别在于:filter返回值是所有满足条件的元素组成的数组,
一般在需要使用找到的元素时,用find()方法
2.findIndex()方法
findIndex()的作用同indexOf(),返回第一个满足条件的下标,并停止寻找。
区别是findIndex() 的参数为一个回调函数,且一般用于对象数组
3.includes()
includes()方法,返回一个布尔值。 参数是一个value,一般用于简单数组。
对于复杂数组,则可以使用some()方法替代includes()方法
4.Array.isArray()方法
用来判断一个元素是否为数组
apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
**call **:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。
call 与 apply 的相同点:
call 与 apply 的不同点:两者传入的列表形式不一样:
闭包就是能够读取其他函数内部变量的函数。
①函数嵌套函数
②函数内部可以引用函数外部的参数和变量
③参数和变量不会被垃圾回收机制回收
①.封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口;
②.持久性:一般的函数,调用完毕之后,系统自动注销函数,而对于闭包来说,在外部函数被调用之后,闭包结构依然保存在
系统中,闭包中的数据依然存在,从而实现对数据的持久使用。
优点
缺点
符号
字符 | 说明 |
---|---|
^ | 匹配输入字符串的开始位置。要匹配 “^” 字符本身,请使用 “/^” |
$ | 匹配输入字符串的结尾位置。要匹配 “ " 字 符 本 身 , 请 使 用 " / " 字符本身,请使用 "/ "字符本身,请使用"/” |
( ) | 标记一个子表达式的开始和结束位置。要匹配小括号,请使用 “/(” 和 “/)” |
[ ] | 用来自定义能够匹配 ‘多种字符’ 的表达式。要匹配中括号,请使用 “/[” 和 “/]” |
{ } | 修饰匹配次数的符号。要匹配大括号,请使用 “/{” 和 “/}” |
. | 匹配除了换行符(/n)以外的任意一个字符。要匹配小数点本身,请使用 “/.” |
? | 修饰匹配次数为 0 次或 1 次。要匹配 “?” 字符本身,请使用 “/?” |
+ | 修饰匹配次数为至少 1 次。要匹配 “+” 字符本身,请使用 “/+” |
* | 修饰匹配次数为 0 次或任意次。要匹配 “" 字符本身,请使用 "/” |
| | 左右两边表达式之间 “或” 关系。匹配 “|” 本身,请使用 “/|” |
方法
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
**exec() **一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回null)
search() 一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。
**match()**一个在字符串中执行查找匹配的String方法,它返回一个数组或者在未匹配到时返回null。
1.ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
2.不存在变量提升
**3.暂时性死区 **
let在for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); } // abc // abc // abc
上面代码正确运行,输出了 3 次abc
。这表明函数内部的变量i
与循环变量i
不在同一个作用域,有各自单独的作用域。
4.let不允许在相同作用域内,重复声明同一个变量。
1.const声明一个只读的常量。一旦声明,常量的值就不能改变。
**2.const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。 **
3.const的作用域与let命令相同:只在声明所在的块级作用域内有效。
**4.const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。 **
5.const声明的常量,也与let一样不可重复声明。
**ES6中,按照一定的模式,从数组或对象中提取值,对变量进行赋值。这个过程叫做解构赋值。 **
ES6
变量的解构赋值本质上是“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予匹配的右边的值,如果匹配不成功变量的值就等于undefined
。
// ES6 之前的写法 const arr = ["元素一", "元素二", "元素三", "元素四", "元素五"]; let one = arr[0]; let two = arr[1]; let three = arr[2]; let four = arr[3]; let five = arr[4]; console.log(one); console.log(two); console.log(three); console.log(four); console.log(five);
// ES6 写法 let [one, two, three, four, five] = ["元素一", "元素二", "元素三", "元素四", "元素五"]; console.log(one); console.log(two); console.log(three); console.log(four); console.log(five);
输出的结果都是:
元素一
元素二
元素三
元素四
元素五
**本质上,这种写法属于“模式匹配”。只要赋值号两边的模式相同,左边的变量就会被赋予对应的值。 **
let [a, [b, c]] = [1, [2, 3]]; console.log(a); console.log(b); console.log(c); let [e, , f] = [4, 5, 6]; console.log(e); console.log(f);
输出的结果:
1
2
3
4
6
解构失败时,变量的值为undefined
let [a, b] = [1]; console.log(a); //1 console.log(b); //undefined
不完全解构
let [a,b] = [1,2,3]; console.log(a);//1 console.log(b);//2
const obj = { name: "亚索", skill: "hasakei" } let {name,skill} = obj; console.log(name); //亚索 console.log(skill); //hasakei
变量名与属性名相同,才能取到正确的值。
如果想要自定义变量名,则用:进行修改。
const obj = { name: "亚索", skill: "hasakei" } let {name: n,skill} = obj; console.log(n); console.log(skill);
var obj = { r:function(){ console.log("狂风绝息斩"); }, e:function(){ console.log("e去不复返"); } } const {r,e} = obj; r(); e();
const obj = { p: [ "hello", { y: "world" } ] } let {p:[a,{y:b}]}=obj; console.log(a); console.log(b);
let x; {x} = {x:1}; console.log(x);
以上代码是错误写法。{x}
前面如果没有let ,const的变量声明的关键字,则js会将其视为代码块。
如果需要提前声明变量,则需要将解构语句用小括号包裹起来;
let x; ({x} = {x:1}); console.log(x);
数组本质也是特殊的对象,也可以对数组进行对象属性的解构。
const arr = ["诺手", "蝎子", "劫", "EZ", "女坦"]; let { length, 0: first, 4: last } = arr; console.log(length); // 5 console.log(first); // 诺手 console.log(last); // 女坦
const str = 'hello'; let [a, b, c, d, e] = 'hello'; // [h, e, l, l, o] let { length } = 'hello'; console.log(length); //5
类数组的对象都有一个length
属性,我们可以对这个属性进行解构赋值。
function add([x,y]){ return x+y; } let sum = add([1,2]); console.log(sum);//3
函数add的参数表面上一个数组,但是在传入参数的那一刻,数组参数会被解构成变量x和与y.
function add(num1,num2){ var num = num1+num2; if(num2+1>100){ return num; }else{ return add(num,num2+1) } } var sum = add(1,2)
$()函数是jQuery()函数的别称。
$() 函数用于将任何对象包裹成 jQuery 对象,接着你就被允许调用定义在 jQuery 对象上的多个不同方法。
你可以将一个选择器字符串传入 $() 函数,它会返回一个包含所有匹配的 DOM 元素数组的 jQuery 对象。
$(’[name=NameOfSelectedTag] :selected’)
1、this表示javascript的dom对象
2、$(this)表示把dom对象转换为jquery对象
3、jquery包的方法只能由jquery对象调用,不能用javascript的com对象使用
//这里的this表示被点击的输入框对象,可以使用javascript对该对象进行操作 $("input").click(function(){ //jquery对象与dom对象取值方法不一样,要用jquery方法必须使用$(dom对象)转换 var value=this.value; var val=$(this).val(); })
设置onclick属性:$(“a”).attr(“onclick”);
删除onclick属性:$(“a”).removeAttr(“onclick”);
设置onclick属性:$(“a”).attr(“onclick”,“test()”);
大概归纳为9种
1、基本的有id、标签、类、通配符选择器:
#id element .class *
2、层次选择器:
ancestor descendant parent > child prev + next prev ~ siblings
3、基本过滤器选择器
:first :last :not :even :odd :eq :gt :lt :header :animated
4、内容过滤器选择器
:contains :empty :has :parent
5、可见性过滤器选择器
:hidden :visible
6、属性过滤器选择器
[attribute] [attribute=value] [attribute!=value] [attribute^=value] [attribute$=value] [attribute*=value] [attrSel1][attrSel2][attrSelN]
7、子元素过滤器选择器
:nth-child :first-child :last-child :only-child
8、表单选择器
:input :text :password :radio :checkbox :submit :image :reset :button :file :hidden
9、表单过滤器选择器
:enabled :disabled :checked :selected
delegate()会在以下两种情况下使用到:
1、如果你有一个父元素,需要给其下的子元素添加事件,这时你可以使用delegate()了,代码如下:
$(“ul”).delegate(“li”,“click”,function(){
$(this).hide();
});
2、当元素在当前页面中不可用时,可以使用delegate()
1.执行时间
2.编写个数不同
3.简化写法
wxml 模板文件,是框架设计的一套标签语言,结合基础组件、事件系统、可以构建出页面的结构
wsxx 样式文件,是一套样式语言,用于描述WXML的组件样式
js脚本逻辑文件,逻辑处理网络请求
json配置文件,小程序设置,如页面注册,页面标题及tabBar
app.json 整个小程序的全局配置,包括:
app.js监听并处理小程序的生命周期函数、全局变量
app.wxss全局配置的样式文件
1、遍历的时候:
2、调用data模板(赋值)的时候:
== 有待完善。。。。。。 ==