p63 三元表达式
p104 数组长度可以修改
会有两个空元素
p105 数组声明时可以不声明长度,只声明一个空列表
p115 函数的使用
p126 arguments
arguments是一个伪数组,只有函数才有arguments,所有函数都默认内置
p138
js在es5标准下没有块级作用域,es6新增块级作用域。即:在es5标准下for循环里面的变量在循环外也能使用
p139 作用域链 js可以在函数内部定义函数,内部函数可访问外部函数的变量。若变量名冲突,采取就近原则
p140 p141 预解析
函数声明有普通声明和函数表达式函数表达式两种方式。其中函数表达式是将函数写成变量声明的形式,比如:
var fun = function() {...}。
当预解析函数表达式的时候,会将var fun;提到最前面,var成了一个变量而不是函数,所以若是调用写在函数声明之前会失败,显示undefine类型。而函数的普通定义方式则不会出现这种情况,预解析会将整个函数定义放在最前面,所以函数调用在声明前和声明后都可以。
p145 对象创建三种方式 利用字面量创建对象
调用属性和方法的两种方式
p146
p147 利用new Object创建对象
p149 利用构造函数创建对象
示例:
p150 方法调用
p151 js没有类的概念,构造函数就相当于类,实例化对象直接使用构造函数实例
p153 对象的遍历
for(变量 in 对象){
...
}
循环中变量习惯用k或key,就像java中习惯i一样
p155 js内置对象导读
p156 内置对象
p157 学会查询MDN文档
p158 Math对象 Math对象
p160 js如果对字符串类型的数字运算时,会自动将字符串隐式转换为数字,然后给出正确结果
p163 Date日期对象 注意:和Math对象不同,Date对象是有构造函数的 初始化Date对象建议使用字符串类型作为参数,不建议使用参数来初始化(可能会有一些问题)
p164 格式化日期
注意:getMonth()和getDay()是从0开始计算的。getMonth()真实数据值要加1;getDay()周一到周六是正确的,但周日为0
p166 Date的总毫秒数(时间戳)
p169 数组组建的两种方式
p170 检测是否是数组 instanceof
p171 添加删除数组元素 添加数组元素
p172 删除数组元素
p174 数组排序
p175 获取数组元素索引
p177 数组转换为字符串
p178 基本包装类型
p179 字符串不可变
当给字符串重新赋值时,原来的字符串保留,系统会在内存中开辟一个新的空间来保存新的字符串。所以,大量修改字符串是个很占用内存的操作,所以不要频繁拼接或者修改字符串
p180 根据字符返回位置
p182 根据位置返回字符
p183
p185 拼接以及截取字符串
p186 替换字符串以及转换为数组
p187 简单数据类型和复杂数据类型
p188
p189
p190 复杂数据类型的传参
复杂数据类型传参是传递的引用。
总结:
在计算机中,有堆和栈两种空间类型,都可以存放变量。其中栈存放简单数据类型的变量,当将简单类型a的值赋值给简单类型b时,b会在栈中重新开辟一个内存空间,并将a的值复制一份放进这个空间里。所以,对于简单数据类型的赋值以及传参传递的是值的复制,实参和形参是两个地址不同的变量。但对于复杂数据类型,栈中存放的是复杂对象的地址,而复杂类型的值放在堆中。当对复杂类型赋值或传参时,新变量或者形参是在栈中作为一个指针指向原对象在栈中的地址,并不开辟新地址来存放变量。总的来说,在赋值或者传参时,简单类型会在栈中开辟一个新的空间,并复制原变量的值;而复杂类型并不开辟新空间,只是作为一个指针在栈中指向原变量的地址,新变量是它的一个引用
p191 web API简介导读
p192 web API和JS基础关联性
p193 API和web API
p194 DOM
p195
p196 getElementByid获取元素
p197 getElementsByTagName获取元素
p198 H5新增获取元素方式
p199 获取body和html元素
p200 事件三要素
p201 执行事件过程
常见的鼠标事件
p202 修改元素
元素添加事件:
元素不添加事件:
p203 innerHTML和innerText区别 innerHTML更常用
p204 操作元素,修改元素属性
p209 js修改css样式属性
p211
循环精灵图
在以前通过精灵图设置很多背景图标时,需要手动一个个去设置,非常麻烦。但其实精灵图排列是有规律的,找到规律可以通过js进行设置。
主要是通过document.querySelecter()获取到一个对象列表,然后对列表元素进行遍历,通过字符串拼接的方式改变backgroundPosion(注意是负值),然后就可以给很多图标设置不同背景了。
示例如下:
p213 使用className修改样式属性
p215
操作元素总结
p216
排他思想(算法)
p221
获取自定义属性值
p222
设置、移除自定义属性
p226
h5自定义属性书写规范与获取
data-
p227
节点操作
p228
节点操作之父节点
p229
子节点
children很重要,也很好用。它既没有兼容性问题,也能选出所有元素节点,加上索引号可以选出第一个和最后一个节点
p230
获取第一个和最后一个子元素
children选择first和end最常用
p232
兄弟节点
下面这两个包含文字节点,不常用
返回兄弟元素节点,但有兼容性问题
最好的解决方法是自己封装一个返回兄弟元素节点的兼容性函数
p233
创建和添加节点
创建节点
添加节点 插入节点
p235
删除节点
p237
复制节点
p244
document.write创建元素(冷门,了解,会新建页面清空之前的元素,不常用)
p245
innerHTML和createElement效率对比
innerHTML创建节点需要拼接字符串时,每拼接一次就创建一个字符串对象,比较耗时。
createElement创建节点无需拼接字符串,创建多个节点是速度是innerHTML速度的10倍
但innerHTML采用数组形式来大量创建节点时,速度是createElement的两倍多,但需要一个临时数组,空间复杂度会变高
p246
dom重点核心(总结)
创建 增删改查
p247
事件高级导读
p248
注册事件的两种方式
传统方式:
方法监听注册方式(推荐):
p249
attachEvent注册事件(非标准,ie9以前浏览器才识别,新版本不支持,垃圾)
兼容各个浏览器的方法:封装一个兼容性函数(了解,现在生产环境不太注重兼容性)
p250
删除(解绑)事件
p251
dom事件流理论
所谓事件冒泡,是触发事件这个信息向父级冒泡,而不是将事件向上传递
比如父盒子定义了mouseover事件,子盒子没有定义。当鼠标放在子盒子上时,子盒子没有触发事件,但是会将鼠标经过子盒子这个信息传递给父盒子,父盒子定义了mouseover事件,所以就会进行触发。从视觉上来看就是鼠标经过父盒子时出发了一次事件,当鼠标经过子盒子又进行了一次触发(但实际上是父盒子又进行了一次触发),工触发两次
p252
dom事件流代码验证
dom事件流分为捕获阶段和冒泡阶段。捕获阶段事件从上级传到下级,冒泡阶段事件从下级传到上级。addElementListener若是第三个参数为true,则执行捕获阶段;缺省或false则执行冒泡阶段
p253
事件对象
p254
常见事件对象
e.target和this区别(重点)
总结:
e.target指向的是触发事件的对象,this触发的是绑定事件的对象。比如下面这个html结构:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
若是给ul绑定了点击事件,而在点击时点击的是li。则e.target指向li,this指向ul
p255
返回事件类型
阻止默认行为
p256
阻止事件冒泡
p257
事件委托
事件绑定的是父元素,而我们点击的是子元素,addElementListener方法第三个参数缺省说明执行冒泡阶段。当我们点击子元素时,e.target可以得到当前点击元素,虽然子元素没有添加点击事件,但在向上冒泡的过程中浏览器发现父元素添加了点击事件,于是就会执行子元素里面定义的改变背景颜色的命令。代码如下:
p258
禁止右键菜单和禁止选中文字
禁止右键菜单:contextmenu
禁止选中文字:selectstart
p259
常用鼠标事件
获得鼠标在页面中的坐标
p260
案例:跟随鼠标的天使
鼠标事件:mousemove,鼠标移动事件,只要鼠标一移动就会触发这个时间。在这里,我们给document进行注册
p261
常用的键盘事件
keyup只是按键松开时执行一次。而keydown和keypress只要按着键就会一直执行,两者区别是keypress不识别功能键,而keydown能识别所有按键
三个键盘事件的执行顺序:
p262
keyCode判断用户按下哪个键
p263
模拟京东按键输入内容案例
p264
快递单号查询(放大效果)
p266
BOM浏览器对象导读
p267
bom概述
p268
页面加载事件
window.load()是传统方式,不推荐。
window.addEventListener("load", )和document.addEventListener("DomContentLoaded")是新的两种加载事件方式,后者更快,交互效果更好
p269
调整窗口大小事件
p270
定时器之setTimeout
给定时器起名字,以便于以后清除定时器
p271
回调函数
p272
清除定时器
p273
定时器之setInterval
总结:setTimeout是一次性的,setInterval是不断循环的
p274
倒计时效果
p275
清除定时器clearInterval
注意:当变量声明而暂时不赋值时,最好初始化为null(如下)。若是不做初始化,系统默认为undefinded,很容易引起问题
let timer = null;
p276
案例:发送短信
p277
this指向问题
定时器中this指向的是window
构造函数this指向它构造的对象
类中的方法中的this指向的是调用它的对象
p278
同步和异步
setTimeout是定时器,在定时器等待过程中会利用等待时间做其他事,异步
sleep是睡眠,只有睡眠醒来时才能去做其他事,睡眠时间不做任何事,同步
p279
同步任务和异步任务执行过程
先按顺序执行同步任务,再按顺序执行异步任务
p280
js执行机制
js执行机制有三部分组成,分别是主线程执行栈、异步进程处理机制、任务队列。一开始所有同步和异步任务都在执行栈中,js会顺序进行遍历:遇到同步任务立即执行,遇到异步任务将其加入到异步进程处理机制中。当异步任务在异步进程处理机制中满足条件时(比如click事件遇到了鼠标点击,定时事件到达等待时间)就立即加入任务队列中。主线程会不断检查任务队列中是否有任务,若有则立即加入执行栈执行并在任务队列中将其删除。主线程不断获取任务并执行任务,这种机制被称为事件循环
p281
location对象常见属性
p283
获取URL参数
p284
location常见方法
assign和replace都可以实现页面跳转,但前者记录历史(能后退到之前页面),后者不记录历史。reload刷新,加上参数true强制刷新代表重新从浏览器获取数据,而不使用之前下载下来的数据
p285
navigator对象
用来判断用户使用的是pc端还是手机端
p286
history对象
例:
history.forward();
history.back();
history.go(1);
history.go(-1);
p287
pc端网页特效导读
p288
offsetLeft和offsetTop获取元素偏移
若是想要获取相对父亲的偏移,则父亲必须有定位
p289
offsetWidth和offsetHeight获取元素大小
offsetParent返回最近的带有定位的父亲
p290
offset和style区别
注意:style只能获得行内样式(就是和html写在一起的),不能获取到内部样式表和外部样式表。所以获取元素用offset,但是不带单位的数值型。设置元素使用style
p291