变量提升
在非严格模式下,js可以先使用后声明,但是实际编程中一定要避免。
小知识:在函数中没有用var声明的变量均视为全局变量
function a(){
test = 1;
var test2 = 2;
}
a()
console.log(test)//输出1
console.log(test2)//报错
事件
这一块应该是js+html的东西,在标签触发的事件,一般有两个阶段:
-
事件捕获(触发事件后,系统从父标签往下依次查找对应的标签),参数为true
-
事件冒泡(找到标签后,事件会从子标签往上传递,并依次触发),参数为flase
阻止冒泡/捕获的函数:event.stopPropagation(); vue中是.stop,vue事件监听都是冒泡,要监听捕获参数为.capture
至于事件委托,则是一种利用方法,我们可以在很多子标签的事件交由给父组件来监听,利用event.target.id来进行不同的操作。
事件循环:这个需要单独学习,一句话说不清楚
JavaScript垃圾回收机制
js垃圾回收主要通过:
- 标记清除:简单的讲,就是变量退环境了,就会被清理
- 引用计数:没有指向这个内存的任何变量时,该地区就会被清除,会引起内存泄露(比如两个对象间循环引用,还有闭包等等,需要小心谨慎)
Call Apply Bind
这三个玩意主要用来重定向this的,然后,bind返回值是一个函数,其他两个则是函数调用,其中apply调用函数,所有参数要放在一个数组里,其他的则是分开的。
原形链
首先明确一点,js是面向对象的语言,函数本质也是依附于对象的。js中所有对象和函数的源头都可以一直链接到Object()原生对象
所有函数都会有一个原型:名为prototype的对象
prototype有一个constructor属性会指向这个函数本身,意思就是构造器的意思,也就是原型和constructor是相对应的概念,A是B的原型,那么B就是A的构造函数,当然,由A函数创造出来的对象,其constructor属性自然指向A函数
console.log(a.prototype === a.prototype.constructor.prototype)//结果为true
这个prototype还有一个__proto__属性,指向产生这个原型的原型
所有对象创建时,都会有一个__proto__属性,该属性会指向产生他的函数原型,从而形成了一条链,注意,对象本身的prototype是undefined。
也就是说,实例原型和实例对象都有__proto__,两者都指向实例原型,但是前者指向"上级",而后者指向对应的实例原型。
对象的继承
继承又和原型链扯上关系了,我们可以通过原型链继承属性,继承的方法主要有两种,一种是在构造函数那里继承,另一种是在原型链上继承。
内容有点复杂,具体另外讨论。
柯里化
柯里化就是把一个函数的参数拆开,利用回调来实现多参数的传递,下面是例子:
function test(x){
return function a(y){
return (x+y)
}
}
console.log(test(4)(5))
//换种写法:
function curry (fn, ...args) {
return (..._args) => {
return fn(...args, ..._args)
}
}
function add(...args){
return args.reduce((a, b)=>{
return a + b;
})
}
console.log(add(1,2,3,4,5,6))
console.log(curry(add,1,2,3,4)(5,6))
有些柯里化比较难,比如实现add(5)(6)(7)(11,2) == add(5,6)(7,11,2)
像这种有点难
一些dom操作
查找方法:
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值
getElementById() //通过元素Id
修改方法:
添加:appendChild()
删除:removeChild()
创建节点:createElement()
复制节点:cloneNode()
移动节点:应该是混合操作
/通过元素Id
修改方法:
添加:appendChild()
删除:removeChild()
创建节点:createElement()
复制节点:cloneNode()
移动节点:应该是混合操作
修改属性节点:setAttribute(“name”,“hhhh”)
通过选择器查找节点:document.querySelector("#demo")
对象的拷贝
浅拷贝没什么意义,分享一种常用拷贝方法,就是用json:
JSON.stringify() //转化为字符串
JSON.parse() //转化为对象