lznbuild / my-blog

自己的博客
9 stars 1 forks source link

《JavaScript高级程序设计》笔记 #14

Open lznbuild opened 4 years ago

lznbuild commented 4 years ago

在做这次笔记之前,《高程》我就已经看过一遍了,这次不会全部看,只会挑一些章节记录。

第四章 变量,作用域和内存问题

Number()

parseInt(num,[进制])

parseFloat() 只解析十进制,16进制直接转换为0

执行环境负责管理代码执行过程中使用的内存。

垃圾收集器会按照固定的时间间隔周期性的执行这一操作。 垃圾回收机制的两个策略:

具体垃圾回收机制请看 Javascript垃圾回收

第六章 面向对象的程序设计

对象的数据属性

Object.getOwnPropertyDescriptor 取得给定属性的描述符

hasOwnProperty 检测一个属性存在于实例还是原型上

怎么判断属性存在于原型上?

function hasPrototypeProperty(obj,name){
   reutrn !obj.hasOwnProperty(name)&&(name in obj)
   // obj有这个属性且不在实例上
}

for in 循环返回可枚举的属性,包括实例上的,原型上的

object.keys()返回实例上的可枚举属性

继承部分请看 Javascript多种继承方式

第八章 BOM

location

href 完整的url (protocal + host)
protocol 协议
host 主机,服务器名称和端口号 (hostname + port)
hostname 服务器名称
port 端口号
pathname url中的目录
search ?后的参数部分
hash

打开新页面或刷新当前页面

window.open('https://www.baidu.com','_block')
location.href = xxx
location.replace()
location.reload(true) 不去找缓存
修改url非hash部分

修改hash当前页面不会刷新,onhashchange监听hash的变化

第十章 DOM

[dom].nodeName // 元素标签名

操作class

//删除"disabled"类
div.classList.remove("disabled");
//添加"current"类
div.classList.add("current");
//切换"user"类
div.classList.toggle("user");
//确定元素中是否包含既定的类名
div.classList.contains("bd")  

用于获取设置dom自定义属性

dom.dataset[id]

JS 添加样式的简写

el.style.backgroundColor = 'red'
// 或者 
el.style.cssText = 'background-color: red'
// 或者
Object.assign(el.style, {
    backgroundColor: "red",
    margin: "25px"
})

第十三章 事件

dom事件包括3个阶段

stopPropagation(),stopImmediatePropagation() 区别

event.stopPropagation();阻止事件冒泡。也阻止事件捕获.

event.stopImmediatePropagation(); 阻止事件冒泡,并且阻止该元素上同事件类型的监听器被触发

target,currentTarget区别

后者是事件绑定的dom节点,前者是触发此事件的节点(可能是子元素)

document.body.onclick = function(e){
   console.log(e.currentTarget)// document.body
   console.log(e.target) // div
}
// 点击body中的一个div,通过事件冒泡,触发此事件

focus,blur事件不会冒泡
focus、blur、load、unload等事件,不会冒泡 resize

判断是否功能键被按下,布尔值

e.shiftKey、ctrlKey、altKey 和 metaKey。

e.detail 中包含了一个数值,表示在给定位置上发生了多少次单击。

发生一次 mousedown 和一次 mouseup 事件算作一次单击。

在用户按了一下键盘上的字符键时,首先会触发 keydown 事件,然后紧跟着是 keypress 事件,最后会触发 keyup 事件。

keydown支持功能键,shift,ctrl,f1键等,keypress不行。
onkeypress支持组合键,keydown不行。
onkeydown 捕获的 keyCode 不区分字母大小,而 onkeypress 区分。

第二十一章 AJAX和comet

ajax发起请求,在收到响应之前还可以调用abort()方法取消异步请求,停止触发事件,不再允许访问任何与响应有关的 对象属性。

xhr.abort()

跨域问题

cors背后的思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,决定请求响应成功还是失败。

请求给它附加一个额外origin头部属性,其中包含请求页面的协议域名端口号,以便服务器根据这个头部来决定是否给与响应。如果服务器认为这个请求可以接受,就在Access-Control-Allow-Origin头部中回发相同的源信息。如果没有这个头部,或源信息不匹配,浏览器就会驳回请求。

整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

具体看阮一峰大佬的文章 跨域资源共享 CORS 详解

Object.entries

let meals = {
 mealA: 'Breakfast',
 mealB: 'Lunch',
 mealC: 'Dinner'
};

for (let [key, value] of Object.entries(meals)) {
 console.log(key + ':' + value);
}
// 'mealA:Breakfast' 'mealB:Lunch' 'mealC:Dinner'

nodetype检验子节点类型
元素节点 1
属性节点 2
文本节点 3