BOM:浏览器对象模型(Browser Object Model)
BOM,由浏览器提供的用于处理文档(document)之外的所有内容的其他对象;navigator、location、history等对象;JavaScript有一个非常重要的运行环境就是浏览器
BOM主要包括一下的对象模型:

window对象在浏览器中可以从两个视角来看待:
global;window对象;当然,这两个视角存在大量重叠的地方,所以不需要刻意去区分它们:
globalThis,并且大多数现代 浏览器都支持它;setTimeout、Math、Date、Object等;事实上window对象上肩负的重担是非常大的:
属性,localStorage、console、location、history、screenX、scrollX等等(大概60+个属性);方法,alert、close、scrollTo、open等等(大概40+个方法);事件,focus、blur、load、hashchange等等(大概30+个事件);从EventTarget继承过来的方法,addEventListener、removeEventListener、dispatchEvent方法;那么这些大量的属性、方法、事件在哪里查看呢?
查看MDN文档时,我们会发现有很多不同的符号,这里我解释一下是什么意思:
// ECMAScript规范: 全局对象 -> globalThis
// 对于浏览器 -> window
// 对于Node -> global
console.log(window)
console.log(globalThis === window)
我们来看一下常见的window属性:
// 浏览器高度
console.log(window.outerHeight)
console.log(window.innerHeight)
console.log("screenX:", window.screenX)
console.log("screenY:", window.screenY)
// 监听
window.addEventListener("scroll", function (event) {
console.log(window.scrollX)
console.log(window.scrollY)
})
我们来看一下常见的window方法:
var openBtnEl = document.querySelector("button")
var closeBtnEl = document.querySelector(".close")
openBtnEl.onclick = function() {
window.open("./page/new.html", "_blank")
}
closeBtnEl.onclick = function() {
window.close()
}
// window.onfocus = function() {
// console.log("窗口获取到焦点")
// }
// window.onblur = function() {
// console.log("窗口失去了焦点")
// }
window.onhashchange = function() {
console.log("hash值发生改变")
}
浏览器哈希值:即为浏览器地址上#后面的内容,可以通过location.hash获取
location对象用于表示window上当前链接到的URL信息。
常见的属性有哪些呢?
href: 当前window对应的超链接URL, 整个URL;protocol: 当前的协议;host: 主机地址;hostname: 主机地址(不带端口);port: 端口;pathname: 路径;search: 查询字符串;hash: 哈希值;我们会发现location其实是URL的一个抽象实现:

location有如下常用的方法:
assign:赋值一个新的URL,并且跳转到该URL中;replace:打开一个新的URL,并且跳转到该URL中(不同的是不会在浏览记录中留下之前的记录);reload:重新加载页面,可以传入一个Boolean类型;URLSearchParams 定义了一些实用的方法来处理 URL 的查询字符串。
var urlSearchString = "?name=mq&age=18&height=1.88"
var searchParams = new URLSearchParams(urlSearchString)
console.log(searchParams.get("name"))
console.log(searchParams.get("age"))
console.log(searchParams.get("height"))
searchParams.append("address", "xx市")
console.log(searchParams.get("address"))
console.log(searchParams.toString())
URLSearchParams常见的方法有如下:
中文会使用encodeURIComponent和decodeURIComponent进行编码和解码
history对象允许我们访问浏览器曾经的会话历史记录。
有两个属性:
length:会话中的记录条数;state:当前保留的状态值;有五个方法:
back():返回上一页,等价于history.go(-1);forward():前进下一页,等价于history.go(1);go():加载历史中的某一页;pushState():打开一个指定的地址;replaceState():打开一个新的地址,并且使用replace;history和hash目前是vue、react等框架实现路由的底层原理,具体的实现方式我会在后续讲解。
navigator 对象表示用户代理的状态和标识等信息。

screen主要记录的是浏览器窗口外面的客户端显示器的信息:

在目前的开发中,JSON是一种非常重要的数据格式,它并不是编程语言,而是一种可以在服务器和客户端之间传输的数据格式。
JSON的全称是JavaScript Object Notation(JavaScript对象符号):
Douglas Crockford构想和设计的一种轻量级资料交换格式,算是JavaScript的一个子集;将JSON转成对应模型的方式;其他的传输格式:
XML:在早期的网络传输中主要是使用XML来进行数据交换的,但是这种格式在解析、传输等各方面都弱于JSON,所以目前已经很 少在被使用了;Protobuf:另外一个在网络传输中目前已经越来越多使用的传输格式是protobuf,但是直到2021年的3.x版本才支持JavaScript,所 以目前在前端使用的较少;目前JSON被使用的场景也越来越多:
小程序的app.json

JSON的顶层支持三种类型的值:
123
{
"name": "zhangsan",
"age": 18,
"friend": {
"name": "kobe"
}
}
[
123,
"abc",
{
"name": "lisi",
"age": 18
},
{
"name": "wangwu",
"age": 19
}
]
某些情况下我们希望将JavaScript中的复杂类型转化成JSON格式的字符串,这样方便对其进行处理:
localStorage中;在ES5中引用了JSON全局对象,该对象有两个常用的方法:
stringify方法:将JavaScript类型转成对应的JSON字符串;parse方法:解析JSON字符串,转回对应的JavaScript类型;那么上面的代码我们可以通过如下的方法来使用:
var obj = {
name: "mq",
age: 18,
friend: {
name: "kobe"
}
}
console.log(obj.name, obj.age)
// 1.将obj对象进行序列化
var objJSONString = JSON.stringify(obj)
console.log(objJSONString)
// 2.将对象存储到localStorage
localStorage.setItem("info", objJSONString)
var item = localStorage.getItem("info")
console.log(item, typeof item)
// 3.将字符串转回到对象(反序列化)
var newObj = JSON.parse(item)
console.log(newObj)
JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串:
replacer 函数,则可以选择性地替换值;toJSON方法,那么会直接使用toJSON方法var obj = {
name: "why",
age: 18,
friend: {
name: "kobe"
},
toJSON: function() {
return "123"
}
}
// 1.replacer参数
// var objJSONString = JSON.stringify(obj, function(key, value) {
// if (key === "name") {
// return "coderwhy"
// }
// return value
// }, "")
// console.log(objJSONString)
// 2.space参数
// var objJSONString = JSON.stringify(obj, null, 4)
// console.log(objJSONString)
// 3.如果对象本身有显示toJSON方法, 那么直接调用toJSON方法
var objJSONString = JSON.stringify(obj)
console.log(objJSONString)
JSON.parse() 方法用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。
reviver 函数用以在返回之前对所得到的对象执行变换(操作)。var obj = {
name: "why",
age: 18
}
var objJSONString = JSON.stringify(obj)
console.log(objJSONString)
var newObj = JSON.parse(objJSONString, function(key, value) {
if (key === "age") {
return value + 2
}
return value
})
console.log(newObj)
JSON的方法可以帮我们实现对象的深拷贝: