JS学习108-161

正则表达式

提交表单时经行校验

1.字面量(必须完全一样)

var reg = /abc/

2.内置构造函数

var reg = new RegExp("abc")

3.进行测试
(true/false)

console.log(reg.text(“abc”))
元字符
  1. \d 一位数字(0-9)//至少两位就是/\d\d/
var reg = /\d/
//在这个字符串里包含数字//
console.log(reg.text(123))=>true
  1. \D 一位非数字(/\Dk\D/)
var reg = /\D/
  1. /s 一位空白内容(空格、缩进、换行“/n”)
var reg = /\s/
  1. /S 非空白内容
var reg = /\S/
  1. /w 字母、数字、下划线
var reg = /\w/
  1. /W 非字母、数字、下划线
var reg = /\W/
  1. . 任意内容 (换行不算/n)
var reg = /./
  1. \ 转义字符
var reg = /\d\.\d/ 

console.log(reg.test("1.2"))==>true
console.log(reg.test("1a2"))==>false

边界符

"^"开头

//开头为字母
var reg = /^\d/ 

"$"结尾

var reg = /\d$/ 

例:

//开头结尾为a,c中间为字母
var reg = /^a\dc$/

限定符(范围)
格式:

var reg = /\d+/
  1. * 0~多次
  2. + 1~多次
  3. ? 0~1次
  4. {n} 指定次数
  5. {n,} >=n
  6. {n,m} 范围==>[n,m]

注:

//只能说明c需出现两次
var reg = /abc{2}/

特殊符号 p112

  1. ( )整体

可以实现单独捕获

//需出现abc两次
var reg = /^(abc){2}$/
  1. |
var reg = /a|b/
  1. [ ] 代表1个,含有其中一个
//[a-zA-Z0-9_]
var reg = /[asdf]/
捕获–exec

test()
exec()捕获片段

只能截取第一个片段

标识符 g i
g:全局标识符
i:忽略大小写

var reg = /\d{4}-\d{1,2}-\d{1,2}/g

正则表达式的两大特性p114

1.惰性 :通过全局标识符解决
2.贪婪:==>非贪婪 var reg = /\{1,4}?/加问号,取最少

正则与字符串与案例:密码验证

this指向

this可以用在构造函数之中,表示实例对象。除此之外,this还可以用在别的场合。但不管是什么场合,this都有一个共同点:它总是返回一个对象。简单说,this就是属性或方法“当前”所在的对象。(被谁调用指向谁)
例:

var person = {
  name: '张三',
  describe: function () {
    return '姓名:'+ this.name;
  }
};

person.describe()
// "姓名:张三"

上面代码中,this.name表示name属性所在的那个对象。由于this.name是在describe方法中调用,而describe方法所在的当前对象是person,因此this指向person,this.name就是person.name。

由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的。

var A = {
  name: '张三',
  describe: function () {
    return '姓名:'+ this.name;
  }
};

var B = {
  name: '李四'
};

B.describe = A.describe;
B.describe()

上面代码中,A.describe属性被赋给B,于是B.describe就表示describe方法所在的当前对象是B,所以this.name就指向B.name。

绑定this的方法

this的动态切换,固然为 JavaScript 创造了巨大的灵活性,但也使得编程变得困难和模糊。有时,需要把this固定下来,避免出现意想不到的情况。JavaScript 提供了call、apply、bind这三个方法,来切换/固定this的指向。

var obj = {};

var f = function () {
  return this;
};

f() === window // true
f.call(obj) === obj // true

上面代码中,全局环境运行函数f时,this指向全局环境(浏览器为window对象);call方法可以改变this的指向,指定this指向对象obj,然后在对象obj的作用域中运行函数f。

call方法的参数,应该是一个对象。如果参数为空、null和undefined,则默认传入全局对象。

var n = 123;
var obj = { n: 456 };

function a() {
  console.log(this.n);
}

a.call() // 123
a.call(null) // 123
a.call(undefined) // 123
a.call(window) // 123
a.call(obj) // 456

上面代码中,a函数中的this关键字,如果指向全局对象,返回结果为123。如果使用call方法将this关键字指向obj对象,返回结果为456。可以看到,如果call方法没有参数,或者参数为null或undefined,则等同于指向全局对象。

如果call方法的参数是一个原始值,那么这个原始值会自动转成对应的包装对象,然后传入call方法。

ES6

**#### 定义变量

let变量
语法:

 let a = 100

与var的不同之处:
1.需先定义
2.可检查变量重名
3.块级作用域,避免和外面变量互相打扰

const常量
必须赋值

const obj = {
name:"kerwin"
}
//同一把钥匙,门里内容变了
obj.name = "mm"
//钥匙变了
obj = {name:"mm"}

let块级作用域案例P120

//这里定义的i只在大括号中生效
for(let i=0;i<5;i++){
console.log(i)
}
箭头函数P121

语法:

 var test = () =>{
 console.log()
 }

1.小括号可以省略:只有一个行参时
2.大括号省略:只有一句代码或只有返回值时
3.没有arguements(arguments是保存着所有实参的伪数组,所以不用写形参也可以。
4.没有this,箭头函数this是父级作用域的
解决方法:## 标题
临时将this赋值给that在这里插入图片描述

解构赋值

快速从对象和数组中获得里面的成员
(多维数组同理)

var arr =["chris","becky"]
//arr[arr.lengh-1]
let[x,y] = arr
console.log(x,y)

交换位子

var a = 10
var b = 20

var[b,a] = [a,b]
对象
var obj = {
name:" ",
age:100
}
Let {name,age}=obj
document.write(name)

对象简写
对象前面的key值和后面的一样则可以省略

展开运算符

...

  • 把数组展开
    在这里插入图片描述

  • 复制
    -在这里插入图片描述

  • 实参
    -在这里插入图片描述

  • 行参
    在这里插入图片描述

  • 伪数组
    在这里插入图片描述

模块化语法

1.默认导出语法 export default 默认导出的成员:

// 当前模块 为 export1.js
//定义私有成员 a 和 c
let a = 10
let c = 20 

// 外界访问不到 变量 d 因为其没有被 暴露出去
let d = 30
function show(){}

// 将 本模块中的私有成员 暴露出去,供其他模块使用
export default  {
    a,
    c,
    show
}

2.默认导入语法 import 接收名称 from ‘模块接收符’:

<script type="module">
// 导入模块成员
import export1 from './export1.js'

console.log(export1)

//打印输出结果为 
// { a: 10, c: 20, show: [function show] }

注意:

在每一个模块中只允许使用唯一的一次 export default ,否则会报错 在一个模块中如果没有向外 export
default,则导入该模块时 默认输出 {}

面向对象–>自定义构造函数

典型的面向对象编程语言(比如 C++ 和 Java),都有“类”(class)这个概念。
但是,JavaScript 语言的对象体系,不是基于“类”的,而是基于构造函数(constructor)和原型链(prototype)。

JavaScript 语言使用构造函数(constructor)作为对象的模板。所谓”构造函数”,就是专门用来生成实例对象的函数。它就是对象的模板,描述实例对象的基本结构。一个构造函数,可以生成多个实例对象,这些实例对象都有相同的结构。

function creatObj(name){
  this.name = name
  this.material = []
  this.cook = function(){
}}
var obj1 = new createObj("")

注意:

  • 为了与普通函数区别,构造函数名字的第一个字母通常大写。
  • 构造函数不写return
  • new过程==实例化这个过程,此时实例对象已经生成,此时this指向实例化后的对象
class p131

语法:

//构造器函数
class CreateObj{
constructor(name){
this.name = name
}say(){
console.log(this.name,"hello")
}}
面向对象:继承

ajax

优势:
不需要插件的支持
用户体验良好
减轻服务端和宽带的负担
但是:搜索引擎支持不够

1.创建xhr = new XMLHttpRequest()
2.配置 open(请求方式,请求地址,是否异步xhr.open("GET","hppt://......txt:)
3.接受数据,注册一个事件:xhr.onreadystartechange = function(){}

状态码
在这里插入图片描述
readyStateChange

  • ajax中的一个事件
  • 其专门用来监听ajax对象的readystate值改变的行为
  • 实验我们就在这个事件中来监听ajax的rs是不是到4了
    在这里插入图片描述
    ajax同步异步
    true:异步请求
    false:同步请求
请求方式

get:(偏向于)获取数据xhr.open('get','/getList?num=12')
post:提交数据xhr.open("post","/submitData"); xhr.send('{"name":"huazhu","age":"7"}')
put:更新
delete:删除
patch:部分修改
head、potions、connect
下载noodjs

ajax封装

method(必选) 请求类型 get 和
post url(必选) 请求的url地址
相同域名下的页面(此函数不支持跨域请求)
data(必选) 请求协带的数据 以js对象的形式定义,如:{name:‘张三’}
callback(必选) 回调函数,可接收一个参数,这个参数就是服务器响应的数据
type(可选) 指定服务器响应的数据类型(可选值:json,xml,text),如果是json模式,则使用json解析数据,默认为text普通字符串

例:

 ajax({
       //地址
        url:"http://....",
        //结构方式
        method:"GET",
        async:true,
        //必须传的是对象的格式
        data:{
            username:"chris"
            password:"123"
        },
        headers:{}
        //回调函数
        success:function(res){
            console.log(res)
        },
        error:function(err){
            console.log(err)
        }
    })
回调地狱

当一个回调函数嵌套一个回调韩式的时候,就会出现一个嵌套结构,当嵌套结构多了就会出现回调地狱的情况
解决方法:
1.promise
它有三种状态:等待中(pending) 完成了 (resolved) 拒绝了(rejected),当他觉得你的要求可以通过便会返回给你resolved,若是你的要求达不到它便会返回给你rejected拒绝你。

封装之后

 let parkplay = (who) =>{
			return new Promise((resolve,reject)=>{
				resolve("去游乐园玩啦!")
			})
		}
		parkplay("me").then(res =>{
			//去玩游乐圆玩先买票
			return Buytickets(res)
		}).then(res=>{
			//买票入园后游乐设施前排队
			return queue(res)
		}).then(res=>{
			//开始玩啦
			return playing(res)
		})

简洁易修改
2.async和await(ES7语法)
可以把异步代码写的像同步代码

let parkplay = (who) =>{
   		return new Promise((resolve,reject)=>{
   			resolve("去游乐园玩啦!")
   		})
   	}
   	(async()=>{
   		let parkplay_result = await parkplay("me");
   		let buytickets_result = await buytickets(parkplay_result);
   		let queue_result = await queue(buytickets_result);
   		let playing_result = await playing(queue_result)
   	})()

promise(async和await)由于可以链式调用 对于开发这种多层嵌套的代码很方便,降低了代码的维护难度等等。

fetch

XMLHpptRequest设计粗糙,而且基于事件的异步模型写起来不友好且兼容性不好

fetch语法:

fetch(url)
  .then(...)
  .catch(...)

url参数是必须填写,option可选,设置fetch调用时的Request对象,如method、headers等
比较常用的Request对象有:

  • method - 支持 GET, POST, PUT, DELETE, HEAD
  • url - 请求的 URL
  • headers - 对应的 Headers 对象
  • body - 请求参数(JSON.stringify 过的字符串或’name=jim\u0026age=22’ 格式)

注意事项:

fetch()使用 Promise,不使用回调函数,因此大大简化了写法,写起来更简洁。
fetch()采用模块化设计,API分散在多个对象上(Response 对象、Request 对象、Headers 对象),更合理一些;相比之下,XMLHttpRequest的 API 设计并不是很好,输入、输出、状态都在同一个接口管理,容易写出非常混乱的代码。
fetch()通过数据流(Stream对象)处理数据,可以分块读取,有利于提高网站性能表现,减少内存占用,对于请求大文件或者网速慢的场景相当有用。

cookie本地存储

cookie其实就是一些数据信息,类型为“小型文本文件”,存储于电脑上的文本文件中。游览器保存了我们的cookie,里面记录了一些信息,当然,这些cookie是服务器创建后返回给游览器的。游览器只进行了保存。

cookie中常用属性的解释:

  • Name:这个是cookie的名字
  • Value:这个是cooke的值
  • Path:这个定义了Web站点上可以访问该Cookie的目录
  • Expires:这个值表示cookie的过期时间,也就是有效值,cookie在这个值之前都有效。
  • Size:这个表示cookie的大小

注意:游览器只会携带在当前请求的url中包含了该cookie中path值的cookie),并且是以key:value的形式进行表示的。多个cookie用;进行隔开。

cookie的生存期:
默认情况,cookie是临时存在的。在一个浏览器窗口打开时,可以设置cookie,只要该浏览器窗口没有关闭,cookie就一直有效,而一旦浏览器窗口关闭后,cookie也就随之消失。
如果想要cookie在浏览器窗口之后还能继续使用,就需要为cookie设置一个生存期。

设置生存时间:

document.cookie =“名称=值;expires=+ 时间;(时间必须是一个字符串)
var d= new Date();
d.setHours(d.getHours() + (24 * 30)); //保存一个月
document.cookie=“visited=yes; expires=+ d.toUTCString();//d.toUTCString();将时间转化字符串

jsonp

一种跨域通信的手段,json的一种”使用模式,可以让网页从别的域名那获取资料。

同源策略:同域名,同端口号,同协议当其中一个不满足时,我们的请求即会发生跨域问题。

原理:动态创建script标签,src属性指向没有跨域限制,首先是利用script标签的src属性来实现跨域。
通过将前端方法作为参数传递到服务器端,然后由服务器端注入参数之后再返回,实现服务器端向客户端通信。
1)、设定一个script标签

<script src="http://jsonp.js?callback=xxx"></script>

2)、callback定义了一个函数名,而远程服务端通过调用指定的函数并传入参数来实现传递参数,将fn(response)传递回客户端

$callback = !empty($_GET['callback']) ? $_GET['callback'] : 'callback';
echo $callback.'(.json_encode($data).)';

3)、客户端接收到返回的js脚本,开始解析和执行fn(response)

ps:由于使用script标签的src属性,因此只支持get方法

闭包

函数内部返回一个函数,被外界所引用,这个内部函数就不会被销毁回收。内部函数的外部函数的变量也不会被销毁

优点:让临时变量永驻内存
缺点:内存泄露

for (var i = 1; i <= 5; i++) {;
    (function(j) {
        setTimeout(function timer() {
            console.log(j)
        }, j * 1000)
    })(i)
}

PS:
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值