前言
javacript脚本语言对于处理逻辑问题,很多语法上有很多java大差不差。所以使用它上手没有那么麻烦。
类型
数值类型 number
数字类型,包含整数或者小数.
- 不同于java : Java中整数用的是int/long 类型,浮点型用的是float,double
- 注意: 在javaScript 内部,所有数字都是以64位浮点数形式储存 , 所以会遇到1和1.0是相等
- 数值范围:
-(2^{53}-1)
到2^{53}-1
,即-9007199254740991
到9007199254740991
- 异常场景: 出现 NAN的情况, 字符串解析成数字时候或者是数字运算有问题的时候
- 转换: 通常使用
parseInt
/parseFloat
/Number
等方法转换
let i = 1
let i = 1.0
let i = parseInt(1)
let i = parseFloat(1.0)
let i = Number(1.0)
字符串类型 string
单个或者多个字符拼接在一起,用单引号或者多引号
- 不同于java : java中字符串得用多引号标识才行
- 注意 : 某种意义上字符串也是数组,可以使用数组的方括号通过位置获取到指定字符
- 常用的属性 :
length
获取长度,注意js里面这个是属性,不是方法
let s = 'sss'
let s = "sss"
let s1 = s[0]
let len = s.length
对象类型 object
相信大家对对象应该很熟悉,就是键值对构建成的,也类似于java中的Map
结构。
注意:js的灵活性,可以直接通过大括号定义键值对即为对象,赋值取值也极为方便
键名 : 可以是加引号,也可以不加引号(符合命名条件)
键值: 可以是任何类型,也可以是函数方法
判断是否为空 : Object.keys(b).length
判断是否为空
在实际应用中,对象使用的地方比较广,所以需要清晰的应用对应的方法
// 定义对象
var obj = {
name: 'gjc',
age: 1
};
var obj = {
s:function(num){num+1}
}
// 获取属性
obj['name']
obj.name
// 设置属性(新增或者修改)
obj.name = 'xxx'
obj['score'] = 100
// 删除属性
delete obj['name']
// 清空属性
obj={}
obj=null
// 遍历属性
for(let i in obj){
i // 对应的key
obj[i] // 对应的值
}
// 判断是否存在对应的属性
'name' in obj
数组类型 array
一组数据值按照次序排列,每个值有着自己的编号位置。 类似于java中的数组
常用的属性: length
获取数组的长度,但是这个值可以随意更改,数组随之内容也随之增减
判断键名是否存在 : 通过in
来判断,适用于上述的对象,同时也适用这个数组
数组的判断是否为空数组 : 通过length
长度判断
var arr = [1,2,3] // 定义数组
arr.length // 获取长度
2 in arr // 判断键名是否存在
for(var j in arr){} // 遍历循环
arr.forEach(function(res){}) // 遍历循环
arr.pop()// 删除数组最后一个
var shift_data = arr.shift() // 删除数组的第一个对象,并返回删除的那个对象
var length = arr.unshift(4) // 开头添加,返回新的长度
arr.push(5)// 末尾添加
arr.concat([6,7,8]) // 两个数组拼接
arr[1] // 获取指定位置数组的值
注意使用slice
和splice
来提取数组内容的区别
slice
: 提取选定的元素(不改变原来数组) ,返回位置间的数据- 第一个参数:起始位置
- 第二个参数:结束点位置(不含)
splice
: 对原数组有影响 ,返回删除的内容- 第一个参数:起始位置
- 第二个参数:要删除的个数
- 最后的参数:要添加的参数
arr.slice(1,arr.length) // 返回出第2项 到 最后一项arr.length-1的位置
arr.splice(0,2,"add")// 从第一项开始删除2个,添加一项add值 ,返回删除的两个的数组
标准库对象
转换类型
: 使用Number()
转换为数字类型 , String()
转换为字符串类型 , Boolean()
转换为布尔类型
-
Array对象
:数组 , 一些类似于java8特性的stream方法join
:用分割符号将数组以字符串形式返回map
:对每一项进行包装操作生成新的数组filter
: 对每一项判断boolean值,过滤返回符合的数组forEach
: 遍历循环some,every
: 判断成员是否存在满足/所有满足的boolean返回concat
: 连接数组合并sort
: 数组的排序 升序reverse
: 数组的排序 降序
-
Object对象
: 对象keys
: 返回对象中的所有key的数组values
: 返回对象中的所有value的数组
-
Number对象
: 数字toFix
: 保留指定位数的小数, 返回以字符串形式toExponential
: :保留指定位数的小数 ,科学计数法
-
String对象
: 字符串concat
: 连接字符串subString
: 截取字符串trim
: 去除两段空格splice
和slice
: 提取数组内容 ,上述内容提到过
-
Math对象
: 数学计算Math.abs()
:绝对值Math.ceil()
:向上取整Math.floor()
:向下取整Math.max()
:最大值Math.min()
:最小值Math.sqrt()
:平方根Math.round()
:四舍五入Math.random()
:随机数
-
JSON对象
: json , 注意:json的格式有要求字符串要双引号
,按照正常的json格式来JSON.stringify
: json对象转字符串JSON.parse
: 字符串转json对象
// 数组相关方法
let a =[1,2,3]
let res = a.join(",") // 返回 '1,2,3'
let res = a.map(res=>res+1) //返回 [2,3,4]
let res = a.filter(res=>res%2==0) //返回 2
a.forEach(res=>console.log(res)) // 输出每一项
let flag = a.some(res=>res==1) // true
let flag = a.every(res=>res==1) // true
let res = a.concat([7,8,9]) // [1,2,3,7,8,9]
let res = a.sort() // [1,2,3]
let res = a.reverse() // [3,2,1]
// 对象相关方法
let obj = {"name":"gjc","age":12}
let res = Object.keys(obj) // ['name', 'age']
let res = Object.values(obj) // ['gjc', 12]
let res = JSON.stringify(obj) // '{"name":"gjc","age":12}'
let res = JSON.parse('{"name":"gjc","age":12}') // {name: 'gjc', age: 12}
// 数字相关方法
let number = 1.4
let res = number.toFixed(2) // '1.40'
let res = number.toExponential(2) // `1.40e+0`
// 字符串
let s = "stringContent "
let res = s.concat("sss") // 'stringContent sss'
let res = s.subString(1,2) // 't
let res = s.trim() // 'stringContent'
// Math操作数字
let res = Math.abs(-1) // 1
let res = Math.max(2,4) // 4
let res = Math.min(2,4) // 2
let res = Math.sqrt(2.5) // 1.5811388300841898
let res = Math.random() // 0.38617210525975243
let res = Math.ceil(1.46) //2
let res = Math.floor(1.56) // 1
运算符
算数运算符
+,-,*,/
:除了对于数字的一些基本常规运算,对字符串同样也会额外效果+
: 会进行重载,判断实现字符串拼接/数字逻辑计算-,*,/
: 不会进行重载,只会进行数字逻辑计算
%
: 获取余数**
: 指数运算符,前一个运算子是底数,后一个运算子是指数++,--
: 自增和自减
比较运算符
>,<,>=,<=
: 比较大小的运算符, 虽然给出了很多类型的比较形式,但是还是习惯用常规的数字比较==,===,!=,!==
: 比较是否相等或者不相等==
: 比较两个值是否相等===
: 严格意义上比较两个值,不仅比较值是否相等,同时比较是否同一个类型,一般我们可以使用这个比较保险稳定些。
布尔运算符
注意
:undefined
, null
, false
, 0
, NaN
,''
, 这些都是在布尔值上的意义都是false, 除了这些都是true
&&
: 且运算符,在java中我们都是两个boolean值进行判断,但是在js依靠短路特性实现可以替代if逻辑,i && do逻辑
, 即i存在false,就不会实现do逻辑||
: 或运算符, 同等于上述场景,也可使用短路逻辑来替代if逻辑,i || do逻辑
, 即i存在true,就不会实现do逻辑三元(?:)
: 判断表达式逻辑,执行前面逻辑或是后面逻辑
二进制运算符
基本类似于java中的位运算 , &,|,~,^,<<,>>
函数
函数就是方法,可以实现通过传参来调用执行逻辑的的方法体
使用: 定义函数使用,使用function
关键词
注意: 参数不是必传的,可以省略,对应省略的参数值就变成undefined
, 普通基本类型传递方式是值传递,但对于(对象,数组,其他函数)就是传址传递
// 定义
function f(x){
return x + 1
}
f(1) // 调用
异步
javaScript用的是只在一个线程上运行,避免多线程对网页dom的修改加锁操作,主线程执行同步任务,同步任务执行完后运行队列中的异步任务,同时使用事件循环去轮训挂起的异步任务的回调结果。
回调函数
在多个函数执行下,保证同步方法运行在异步方法之下,通过使用回调函数在异步方法上执行
function f1(){
console.log('1')
}
// 定义f2使用延时来模拟异步的操作
function f2(){
setTimeout(function(){
console.log(2)
},1000)
}
function f3(){
console.log('3')
}
f1()
f2()
f3()
此时场景运行的 1,3,2
,那我们怎么保证f2的结果在f3之前呢,就是通过回调函数来实现
function f2(callback){
setTimeout(function(){
console.log(2)
callback()
},1000)
}
f1()
f2(f3)
这样运行就保证了结果就为 1,2,3
,我们让f3的函数在f2函数后面执行。
定时器
主要由setTimeout()
和setInterval()
这两个函数来完成。它们向任务队列添加定时任务
相同点:接收两个参数第一个参数func函数方法/逻辑代码,第二参数是延迟的毫秒数
不同点:setInterval()
每隔一段时间的执行一次,会无限执行下去
fucntion f1(){
console.log('1')
}
let timeId = setTimeout(f1,1000) // 1s后执行f1函数
let timeId = setInterval(f1,1000) // 每隔1s后执行f1函数,无限执行
针对如何清除定时器 ,我们获取到上述的timeId
,然后执行 clearTimeout
和 clearInterval
clearTimeout(timeId)
clearInterval(timeId)
Promise 对象
便于操作异步的实现,避免回调地狱的现象的产生,使用方式通过对回调函数的包装成Promise
对象
改进回调地狱的效果如何呢, 还是前面那个例子,保证后面的那个同步方法在异步方法执行之后
// 定义f2使用延时来模拟异步的操作
function f2(){
setTimeout(function(){
console.log(2)
},1000)
}
function f3(){
console.log('3')
}
var p1 = new Promise(f2)
p1.then(f3) // 保证执行完f2的异步后再执行f3
这样书写很方便的改变了之前回调地狱的写法,在语义上也更为清晰
对于Promise的对象有几种对象,用于对异步方法进行控制
peding
初始状态Fulfilled
成功,定义者通过resolve
函数返回 ,接受时候then(value=>{})Rejected
失败, 定义者通过reject
函数返回, 接受时候catch(error=>{})
var p = new Promise(function (resolve, reject) {
if (flag){// 异步操作成功
resolve('成功');
} else { // 异步操作失败
reject(new Error('失败'));
}
}
p.then(vaule=>{}).catch(error=>{})
DOM
DOM 是 JavaScript 操作网页的接口 , 用于将网页转成js对象,进行脚本操作
节点分为七种类型:
Document
:整个文档树的顶层节点DocumentType
:doctype标签(比如<!DOCTYPE html>
)Element
:网页的各种HTML标签(比如<body>
等)Attr
:网页元素的属性(比如class"
)Text
:标签之间或标签包含的文本Comment
:注释DocumentFragment
:文档的片段
Node 接口
Dom节点对象集成Node接口,含有一些共有的属性
nodeName
: 节点名称nodeValue
: 节点文本值textContent
: 返回当前节点和它的所有后代节点的文本内容childNodes
: 包括当前节点的所有子节点的数组对象parentElement
: 父亲节点firstChild
,lastChild
: 当前的第一个/最后一个子节点
// 示例标签 : <div id="divId">hello</div>
var divId = document.getElementById('divId');
divId.nodeName // DIV
divId.nodeValue // null
divId.firstChild.nodeValue // hello
divId.textContent // hello
divId.childNodes // 获取到nodeList类型
divId.parentElement // 获取到一整个父标签内容
含有的一些公共的方法
removeChild()
: 用于从当前节点移除该子节点appendChild()
: 用于从当前节点添加该子节点insertBefore()
: 将某个节点插入父节点内部的指定位置
// 示例标签 :
<div id="divId">
<div id="testId1">test1</div>
<div id="testId2">test2</div>
</div>
let p = document.getElementById("divId")
p.removeChild(document.getElementById("testId1")) // 移除掉了testId1的标签
p.appendChild(document.createElement("div")) // 增加div标签
p.insertBefore(
document.createElement("div"),
document.getElementById("testId1")
); // testId1的标签前面增加一个div标签
NodeList 接口
用于包含多个Node的集合数组,能遍历 forEach
,获取长度length
等方法
获取方式: 通过 childNodes
方法和 document.querySelectorAll()
获取到批量的node对象形成的数组
// 示例标签 :
<div id="divId">
<div id="testId1">test1</div>
<div id="testId2">test2</div>
</div>
var divNodes = document.querySelectorAll("div") //
divNodes.length // 3
divNodes.forEach(item=>{item.nodeName}) // DIV3个
divNodes.keys() // 0,1,2
divNodes.values() // <div id="divId"> , <div id="testId1">test1</div> , <div id="testId2">test2</div>
divNodes.entries() // 键值对
ParentNode , ChildNode 接口
针对Node接口的公共属性和方法,对于其是父节点还有ParentNode的方法,对于其是子节点则含有ChildNode方法
对于 ParentNode 接口
children
: 当前元素的子节点firstElementChild
: 第一个子节点lastElementChild
: 最后一个子节点append(),prepend()
: 最后面/前面添加一个子节点
对于 ChildNode 接口
remove()
: 移除当前节点before(),after()
: 在当前节点前/后插入节点
Document 节点
代表了整个对象,每个网页都有属于他自己的document对象
querySelector()
: 通过css样式选择器选择getElementsByTagName()
: 通过标签名字选择getElementsByClassName()
: 通过class类名来选择getElementById()
: 通过id来选择createElement()
: 创建节点createTextNode()
: 创建文本节点createAttribute()
: 创建属性addEventListener()
: 创建监听事件
// 示例标签 :
<div id="divId" class="divClass">
<div id="testId1">test1</div>
<div id="testId2">test2</div>
</div>
let p = document.querySelector("#divId")
let p = document.querySelectorAll("div")
let p = document.getElementsByTagName("div")
let p = document.getElementsByClassName(".divClass")
let p = document.getElementById("#divId")
let p = document.createElement("div")
// createTextNode
let newContent = document.createTextNode('Hello World')
p.appendChild(newContent)
// createAttribute , 或者直接使用setAttribute(key,value)
let styleName = document.createAttribute("style")
styleName.value = "valueNum"
p.setAttributeNode(styleName)
// "load" 字符串的监听事件,listener的回调函数 ,冒泡阶段false
document.addEventListener('load', listener, false);
Element节点
Element
节点对象对应网页的 HTML 元素,也是集成了node接口
相关属性
id
: 返回标签的idtagName
: 返回标签的名称hidden
: 返回元素是否可见attributes
: 返回属性的数组className
: 返回标签的class属性innerHtml
: 返回该标签的所有Html字符串内容outerHtml
: 返回该标签的所有Html字符串内容(包含他自己)clientHeight/clientWidth /clientLeft / clientTop
: 元素节点的 CSS 可视高度/宽度左边框/顶部(单位像素)scrollHeight / scrollWidth /scrollLeft / scrollTop
: 当前元素的实际含滚动总高度/总宽度/向右侧滚动量/向底部滚动量(单位像素)offsetHeight / offsetWidth / offsetLeft / offsetTop
: 元素的 CSS 垂直高度/水平宽度/左上角偏移/右上角偏移(单位像素)
注意: scroll
属性主要用于处理和获取元素内容的滚动情况和完整尺寸;client
属性关注元素内部用于显示内容的实际可视区域大小;offset
属性则侧重于元素在页面布局中实际占据的空间大小以及相对于定位祖先元素的位置信息
相关的方法
- 获取节点方法与之前document相似 : querySelector()/getElementByxxx()
- 对属性的操作
getAttribute()
: 获取指定属性值getAttributeNames()
:获取所有属性的名称列表setAttribute()
: 设置属性hasAttribute()
: 是否有某个属性hasAttributes()
: 判断是否属性removeAttribute()
: 移除属性
// 示例标签 :
<div id="divId" class="divClass">
<div id="testId1">test1</div>
<div id="testId2">test2</div>
</div>
let e = document.getElementById("#divId")
e.id // divId
e.tagName // DIV
e.attributes[0].name // id
e.attributes[0].value // divId
e.className // divClass
e.innerHtml // <div id="testId1">test1</div>
// <div id="testId2">test2</div>
e.outerHtml // <div id="divId" class="divClass">
// <div id="testId1">test1</div>
// <div id="testId2">test2</div>
// </div>
e.getAttribute("id") // divId
e.getAttributeNames() // "['id','class']"
e.setAttribute("id","divUpdateId")
e.hasAttribute("id1") // false
e.hasAttributes() // true
e.removeAttribute("class")
对css操作
可以通过获取节点,然后直接对其style属性设置指定的css属性值
// 示例标签
<div id="testId1">test1</div>
let p = document.getElementById("testId1")
p.style.backgroundColor = 'red'
p.style.width = '100px'
p.style.height = '100px'
事件
DOM 的事件操作(监听和触发),都定义在EventTarget
接口
DOM的事件操作
addEventListener
: 添加监听,其中具体参数有type,listener,useCapturetype
: 事件名称listener
: 监听函数useCapture
: 监听函数的触发阶段,false(只在冒泡阶段)
removeEventListener
: 移除监听dispatchEvent
: 触发事件
<button id="btn">按钮</button>
let btn = document.getElementById('btn');
btn.addEventListener('click',()=>alert('test'),false) // 添加事件
var event = new Event('click')
para.dispatchEvent(event) // 触发点击事件
btn.removeEventListener('click',()=>alert('test'),false) // 移除点击事件
绑定事件三种形式
- 通过html的onXx属性来绑定事件 ,只会在冒泡阶段
- 通过标签节点直接指定on方法的执行逻辑,只会在冒泡阶段
- 通过上述说的事件绑定方法 addEventListener ,可以自己指定阶段
<div onclick="console.log('触发事件')">
div.onclick = function (e) {
console.log('触发事件');
};
div.addEventListener('click',()=>console.log('触发事件'),false) // 添加事件
Event对象
事件发生以后,会产生一个事件对象,作为参数传给监听函数。
function method(event){
event.bubbles;
}
Event属性
bubbles
: 是否冒泡 ,false为冒泡eventPhase
: 是否目前所处阶段- 0 : 当前没有发生
- 1 : 捕获阶段
- 2: 目标阶段
- 3: 冒泡阶段
cancelable
: 事件是否可以取消 ,然后可以配合preventDefault
实现取消currentTarget
: 事件当前正在通过的节点,随着传播会变target
: 事件最初发生的节点,固定不变
Event的方法
preventDefault()
: 取消事件的默认行为stopPropagation()
: 阻止事件的传播stopImmediatePropagation
: 阻止事件的传播,包括当前节点的其他监听函数
注意:事件在DOM中传播,如何区分在不同阶段?
- 冒泡阶段 : 目标元素开始触发,向外层节点蔓延触发,自下而上
- 捕获阶段 : 从最外层的祖先节点开始触发,传递到目标元素,自上而下
- 目标阶段: 标识当前事件已经到达目标元素
浏览器相关
嵌入js代码
使用声明
- 添加js脚本代码,属性
type
可以不写,可以声明text/javascript
这个 - 加载js外部脚本代码,添加属性
src
<script>
console.log("test")
</script>
<script type="text/javascript">
console.log("test")
</script>
<script src="/xx/yy.js"/>
<script src="https://xxxx.yy.js"/>
注意: 建议将<script>
标签都放在页面底部在body
标签内部的最后,而不是头部
windows对象
指的是当前的浏览器窗口,最高层顶级对象
相关属性
screenX/screenY
: 返回浏览器窗口左上角相对于当前屏幕左上角的水平距离和垂直距离(单位像素),只读innerHeight/innerWidth
: 网页在当前窗口中可见部分的高度和宽度outerHeight/outerWidth
: 返回浏览器窗口的高度和宽度scrollX/scrollY
:返回页面的水平/垂直滚动距离
相关方法
moveTo()/moveBy()
:移动浏览器窗口到指定/相对位置resizeTo()/resizeBy()
: 缩放窗口到/了指定大小scrollTo()/scrollBy()
: 文档滚动到/了指定位置
相关事件
onload
: 在文档在浏览器窗口加载完毕时,触发的回调onerror
:浏览器脚本发生错误时 ,触发的回调
window.onload = function (){}
window.onerror = function (message, filename, lineno, colno, error){}
Cookie
是服务器保存在浏览器的一小段文本信息,一般大小不能超过4KB
cookie中包含的信息有
- 名称
name
- 对应的设置的值
value
- 到期时间 ,
expires
- 所属域名(默认当前),
domain
- 所属地址(默认当前),
Path
- 指定浏览器只有在加密协议 HTTPS 下才发送,
Secure
- 无法js脚本获取,只有通过浏览器发送请求才会,
HttpOnly
cookie的前后端的交互
- 服务端设置cookie,就是在响应头上增加
Set-Cookie
- 浏览器发送请求时会携带上满足域名,地址等条件的cookie的值,请求头上携带
Cookie
前端获取和调整cookie
- 通过document直接获取cookie
- 直接通过写入cookie ,一次性写入一个,是添加不是覆盖
- 删除cookie ,只能通过赋值过去的expires时间
document.cookie // "foo=bar;baz=bar" 获取结果
document.cookie = 'test1=hello'; // 简单添加
document.cookie = "foo=bar; expires=Fri, 31 Dec 2020 23:59:59 GMT"; // 添加的同时增加属性
document.cookie = 'fontSize=;expires=Thu, 01-Jan-1970 00:00:01 GMT'; //删除
Storage
Storage 接口用于脚本在浏览器保存数据 , 包含一个sessionStorage
和 localStorage
sessionStorage
: 适用于一次浏览器会话中,关闭窗口,数据清空localStorage
: 保存的数据长期存在
具体使用的方法
setItem()
: 存入对应的数据getItem()
: 获取对应的数据removeItem()
: 移除对应的数据clear()
: 清空数据key()
: 获取对应位置的键值
window.sessionStorage.setItem("key","value")
window.sessionStorage.getItem("key") // value
window.sessionStorage.removeItem("key")
window.sessionStorage.clear()
window.sessionStorage.key(0) //key
History
表示当前窗口的浏览历史
对应的方法
back()
: 后退到上一个网页forward()
: 前进到下一个网页go()
: 指定到具体的网页
history.back();
history.forward();
history.go(2);
Location
提供 当前文档的URL 相关的信息和操作方法
相应的属性
href
:整个 URL。protocol
:当前 URL 的协议,包括冒号(:)。host
:主机。如果端口不是协议默认的80和433,则还会包括冒号(:)和端口。hostname
:主机名,不包括端口。port
:端口号。pathname
:URL 的路径部分,从根路径/开始。search
:查询字符串部分,从问号?开始。hash
:片段字符串部分,从#开始。origin
:URL 的协议、主机名和端口。
相应的方法
assign()
: 浏览器立刻跳转到新的 URLreplace()
: 浏览器立刻跳转到新的 URL , 且History会删除当前网址reload()
: 重新加载当前网址,相当于刷新
URL编码解码
encodeURI()
: 编码不符合URL的合法字符的那些,整个地址为参数encodeURIComponent()
: 编码指定内容decodeURI()
: 解码不符合URL的合法字符的那些,整个地址为参数decodeURIComponent()
: 解码指定内容
encodeURI("http://www.baidu.com?param=我") // http://www.baidu.com?param=%E6%88%91
encodeURIComponent("我") // %E6%88%91
decodeURI("http://www.baidu.com?param=%E6%88%91") // www.baidu.com?param=我
decodeURIComponent("%E6%88%91") // 我
URL
用来构造,解析编码的url的对象
// 构造,第一个是相对路径,第二个相对路径
var url = new URL('index.html', 'http://example.com');
var url = new URL('http://example.com/index.html');
url.href // http://example.com/index.html
URL对应的属性和 Location基本一致
search
:返回查询字符串,以问号?开头 ,可以构造URLSearchParams对象searchParams
:返回一个URLSearchParams实例,该属性是Location对象没有的,获取到URLSearchParams可以进行一些参数的修改和增加
URLSearchParams
用于构建解析处理Url路径上的参数信息
// 构造
var params = new URLSearchParams('?param1=1¶m2=2');
var params = new URLSearchParams([['param1', 1], ['param2', 2]])
var params = new URLSearchParams({'param1' : 1 , 'param2' : 2});
// 通过URL对象获取
var url = new URL('http://example.com/index.html?name=value');
url.searchParams
// 增加
params.append('param3', 3);
params.set('param3', 3);
// 获取
params.get('param3') //3
//删除
params.delete('param3');
Blob对象
一个二进制文件的数据内容 , 用于操作二进制文件
// 构造保存json/html数据 ,接受字符串数组[]和类型type的对象
var blobResult = new Blob[JSON.stringify({name:'gjc'})],{type : 'application/json'}]
var myBlob = new Blob(['<div></div>'], {type : 'text/html'});
主要方法:
slice
方法有三个参数,都是可选的
- 起始的字节位置(默认为0)
- 结束的字节位置(默认为size属性的值,该位置本身将不包含在拷贝的数据之中)
- 新实例的数据类型(默认为空字符串)
File和FileList
-
File 对象代表一个文件,用来读写文件信息
主要用途: input组件用户选中后的文件进行操作
相关方法:除了blob有的size
和type
,还增加了name
名称和lastModified
最后修改时间 -
FileList 对象一组选中的文件,就是File的数组形式
FileReader
用于读取 File 对象或 Blob 对象所包含的文件内容
对应的属性
error
:读取文件时产生的错误对象readyState
:整数,表示读取文件时的当前状态。一共有三种可能的状态,0表示尚未加载任何数据,1表示数据正在加载,2表示加载完成。result
:读取完成后的文件内容,有可能是字符串,也可能是一个 ArrayBuffer 实例。
对应的事件
onabort
:abort事件(用户终止读取操作)的监听函数。onerror
:error事件(读取错误)的监听函数。onload
:load事件(读取操作完成)的监听函数,通常在这个函数里面使用result属性,拿到文件内容。onloadstart
:loadstart事件(读取操作开始)的监听函数。onloadend
:loadend事件(读取操作结束)的监听函数。onprogress
:progress事件(读取操作进行中)的监听函数。
<input type="file" onchange="onChange(event)">
<script>
function onChange(event) {
// 获取到文件
var file = event.target.files[0];
var reader = new FileReader();
reader.onload = function (event) {
// 读取操作后的回调,获取内容result
console.log(event.target.result);
};
// 开始读取操作
reader.readAsText(file);
}
</script>
对应的实例的方法
abort()
:终止读取操作,readyState属性将变成2。readAsArrayBuffer()
:以 ArrayBuffer 的格式读取文件,读取完成后result属性将返回一个 ArrayBuffer 实例。readAsBinaryString()
:读取完成后,result属性将返回原始的二进制字符串。readAsDataURL()
:读取完成后,result属性将返回一个 Data URL 格式(Base64 编码)的字符串,代表文件内容。readAsText()
:读取完成后,result属性将返回文件内容的文本字符串。
XMLHttpRequest
用于浏览器与服务器之间的通信,发送各种格式的数据
使用open方法来实现初始化请求 ,如请求方式,请求地址,请求是否异步信息
let xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.baidu.com', true);
通过onreadystatechange
来监听事件的结果
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) { // 标识请求完成
if (xhr.status === 200) {
console.log(xhr.responseText);
} else {
console.error('请求出错,状态码:' + xhr.status);
}
}
};
最后通过send
方法来发送请求
总结
js在基础语法上和java大致很像,不过他多了和浏览器交互的等额外操作。