基本数据类型
String, Number, Boolean, Null, Undefined
引用数据类型(对象)
Object(特殊的Array, Function)
调对象的属性 .属性/[“属性名”],属性名包含特殊字符(空格,-)或者不确定(变量名在变量里)时 必须第二种
方法:obj.属性名 = function(){ };obj.属性名();调方法 //当属性值为函数,那么属性名为方法
例如:inner.Onclick= function(){console.log(this)} ; this就是inner(若inner是一个dom对象),这个回调函数作为inner的onclick属性的方法
document object model
onload
DOM查询
基本
getElementById, getElementByTagName, getElementByClass(兼容问题)
分类:文档节点—— 元素节点—— 属性节点—— 文本节点
子节点
childNodes, firstChild, lastChild
父节点和兄弟节点
parentNode, previousSibling, nextSibling
html, body
查询选择器querySelector
document.querySelector(".box img") 可以直接输入css选择器,很强大,可代替基本查询
但是,只能返回一个元素,若查询有多个只返回第一个
增删改查
增
删
改
查
修改css样式
元素.style.样式名 = 样式值
js通过内联进行修改,如果原来有!important会失效
只读样式
getComputedStyle
IE不可用
currentStyle
getStyle(element, “width”)
scrollWidth, client, offset等可查询且只是数字
注:想要js读取css样式表的值,一定要把css写在js前面
事件
冒泡
委派
如:通过js新建的元素不具备点击事件,可用在其父元素中添加点击事件,其所有子元素都能获得
如果想要其他元素不被委派到事件,可以给需要的元素加class,然后判断
绑定
内联
js中 dom对象.事件 = 函数
addEventListener监听
inner.addEventListener( “click”, function(){ console.log(111), false} )
参数:1. 绑定什么事件,不加on; 2. 回调函数,事件触发时该函数被调用 ;3. 是否在捕获阶段触发事件,一般false
this是inner
此方法可以为同个元素的相同事件 绑定多个响应函数,依次触发,不会被覆盖
Ie8以下兼容用attachEvent, 循序要反,两个参数,事件加on
可写一个bind函数解决兼容,传三个值, 绑定事件的对象,绑定什么事件,回调函数
browser object model
包含:window, navigator, location, history, screen
window
navigator
代表浏览器信息,识别不同浏览器
一般只使用userAgent判断浏览器信息(userAgent用户代理==浏览器)
Location
代表当前浏览器的地址栏信息
区分大小写。大写L返回一个函数
常用方法
History
浏览器的历史记录,可操作
由于隐私原因,该对象不能获取到具体的历史记录, 只能操作浏览器向前向后翻页
属性
sreen
setInterval
setInterval(function() {}, xxxxms)
参数:1. 回调函数,每隔xxxx调用一次 2. 调用时间间隔
return:返回一个Number作为定时器唯一标识,第几个定时器
注意
将定时器写在点击事件内,一定要在开启前clear清除上一个定时器
setTimeout
typeof
instanceof
===
let a = {age:1}; function fn(obj) { obj = {age: 2}}; fn(a); console.log(a.age); //2
** let aa = 1; function fun(a) { a++}; fun(aa); console.log(aa); // 1
**let p={name:“yl”, setName: function (name){this.name = name} }; p.setName(“tang”); console.log(p.name); //“tang”
js调用函数时传递变量参数时,是值传递还是引用传递?
函数的功能
函数的调用方式
test() 直接调用
obj.test() 通过对象调用,为方法
new test() //new调用,为构造函数
**test.call/apply(obj) //类似obj.test(),临时让test成为obj的方法进行调用,改变test的this指向obj
什么是回调函数
立即执行!
又称匿名函数自调用 (function () { let a=1; console.log(a)})()
a不会污染全局
注意() , [] 前后语句一定要加;不然会报错
原型与原型链
原型
原型上的方法是给实例对象使用的,所以一般我们会给构造函数的prototype添加属性 以供实例访问
分类
显示原型
每个函数都有 ,即prototype属性
隐式原型
每个实例对象都有,即__proto__
创建实例时自动添加,默认值为其构造函数prototype的属性值。即Fn.prototype === fn.proto
同个构造函数创建的实例的原型相等p1.proto===p2.proto===P.prototype
ES6之前不能直接操作
原型链
隐式原型链:访问一个对象的属性时,先在自身属性中找,没有再沿着__proto__这条链向上查找,最终没有找到则返回undefined(注意不会报错)
三个特性
执行上下文与执行上下文栈
变量提升与函数提升
变量提升
var a=3; function fn(){console.log(a); var a=4 } fun(); //undefined
函数提升
fun()函数调用 可以写在声明前面。必须function fun(){}这样定义
注意:如果函数声明var fun = function(){}; 这样声明的话,首先遵守变量提升,就不能提前调用了
报错,类似于var c; function c©{…}; c=1; c(2);
执行上下文
函数内的arguments,是一个伪数组,存放传入的实参列表
执行上下文栈
作用域与作用域链
作用域
分类:全局,局部,块级(ES6刚有)
块级:if(1){let a=10}; console.log(a); //报错
面试题
会报错,要访问fn2要加this
作用域链
闭包
如何产生
什么是闭包
作用
延长了局部变量的生存周期
函数外可以操作内部数据
问题
1.函数执行完,函数内部的局部变量是否存在?
2.在函数外部能否直接访问函数内部的局部变量?
例子
简单的demo
应用1:函数外部操作函数内部的数据
利用闭包,此时函数外部就可以操作函数内部的数据
fn1(); //没有输出,因为fn2已经成为立即对象
闭包要死亡:f = null;
还要注意函数的定义的方式,定义执行完才产生闭包
应用2:定义JS模块
使用
*一个具有特定功能的js文件
*将所有的数据和功能都封装在一个函数内部 (私有的)
*只向外暴露一个包含n个方法的对象/函数(return)
想暴露两个或以上函数,可以return{ one: one, two: two}
也可以把函数放在window属性中,做成一个立即执行函数
*模块使用者,只需要通过模块暴露(return)的对象调用方法实现对应功能(let xx = 函数;xx())
缺点
函数内局部变量没有被释放,占用内存时间变长
容易造成内存泄漏
解决:*能不闭包就不闭包 *及时释放(闭包函数=null)
面试题
不是闭包
object.getNameFunc执行完后得到的是函数,所以调函数this是window,输出全局的name
对比。是闭包(函数嵌套,且内部函数引用了外部函数的变量that)
对象创建模式
object构造函数模式(场景:创建时不确定对象内部的数据,可以动态添加或修改属性/方法)
let p = {}; p.name = ‘yl’; p.setName = function(name) {this.name = name}; 缺点:语句太多
问题:创建多个对象时,代码重复,适用创建单个对象
工厂模式(了解工厂函数)
function creatPerson(name) {let obj = {name:‘name’, setName: function(name){this.name = name} } return obj} //返回一个对象的函数,即工厂函数
优点:创建多个对象;缺点:对象类型都是Object,没有具体类型
自定义构造函数模式(最常用)
function Person(name,age) {this.name = name; this.age = age; this.setName = function(name){this.name = name }}
缺点:每个对象(实例)都有相同的数据,浪费内存
解决:把例如setName放到object原型中,共用
在构造函数中只初始化一般函数
Person.prototype.setName = function(name) {this.name = name} //把方法放到了原型上,其他不变
继承模式
*原型链继承
此时子类型就从继承的原型链上拿到了’Supper property’
分析(好好理解,难)
借用构造函数继承
组合继承
进程与线程
进程
线程
是进程内的一个独立执行单元;是程序执行的一个完整流程;是CPU的最小调度单元
多线程
优点
缺点
JS是单线程
相关知识
浏览器内核
再识定时器
JS的单线程
代码分类
执行基本流程
先执行初始化代码
包含特殊的代码
然后在某个时刻才会执行回调代码(异步执行)
为何是单线程
事件循环模型
jS模块在主线程,定时器模块等在分线程执行的
事件的回调函数和定时器等回调代码 被事件管理模块WebAPIs 放在callback queue中,待处理,等初始化代码执行完才循环遍历队列执行
事件驱动模型
其他相关概念
事件管理模块WebAPIs包含:定时器、Dom事件、Ajax
H5 Web Workers(多线程)