1.语言核心、DOM、BOM
2.在body中< script>写代码 script> or < script src=””>< /script>引入
3.变量声明提升
js在执行前,会预解析,会提升所有变量的声明(重点)。
变量声明提升会提升到当前作用域之前。
只提升声明,不加载值。
(和后边函数对应着看)
4.基本数据类型:
5.小数运算时,可调用 toFix()确定保留位数。
6.也有对象的概念,里面有Math.pow(a,b)的操作。
7.逻辑运算,短路原则,跟java一样。
8.逻辑处理语句,跟java一样
9.数组,跟java差不多,理解一下new Array(2);这种方式。
10.引用类型(对象)和基本类型
跟java一样。还是引用、指针、值和地址那一套,所以相等估计得调用方法,所以涉及到了深浅拷贝和递归注意事项。
在js里,基本类型是number、boolean、string、undefined、null,引用是array、object、function、regexp等等
11.函数(体现出js脚本语言的特性,不是把函数搞成方法,而是就叫c面向过程的”函数”。其实感觉也可以用方法理解)
function fun(){}
函数可以提升(这个好理解,加载时候,变量和函数,优先加载函数再加载变量)(不一定是加载这个词儿)
arguments表示它接收到的实参列表,它是一个类数组对象。
不用在fun的括号里写参数,直接能全拿进来
12.局部变量、全局变量(这俩都有自己特色)
涉及变量声明加载时机、遮蔽效应、全局不传参拿数等等,之后可以仔细研究一下js中变量在浏览器的加载机制。
13.闭包?(待研究)
函数能够记忆住其定义时所处的环境。即使函数不在其定义的环境中被调用,也能访问定义时所处环境的变量。(包括写在前面的和形参)
闭包产生时,函数所处环境的状态会始终保持在内存中,不会在外层函数调用后被自动清除。
Java、c++都有私有属性的概念,但是js中只能用闭包来模拟私有变量。
(又想一直留着这个变量属性,又不想让外部访问。)
外面有var接住了这个函数,才不会释放函数内存。
闭包有可能会导致内存泄露。
14.IIEF立即调用
(function(){
alert(1)})();
在一些场合,如for循环中,可以将全局变量转变为局部变量。
15.DOM(Document Object Model)
将文档表示为DOM节点树,有元素节点、文本节点、属性节点等等。
nodeType属性可以显示这个节点具体的类型。
document对象,是整个HTML文档的根。
访问元素节点的常用方法(兼容性各不相同):
.getElementByID()
.getxxx
.getxxx
…
一般< script >放在最后面,不然拿不到html标签。或者添加监听,也可以写前面。
树的节点之间有“父子兄弟”的关系,可以通过这些关系互相找,也都有函数。
节点操作
innerHTML、innerText,设置节点内容(上树)。
.style.backgroundColor(css的-变驼峰)=”red”,改变css样式。
直接.或者get or set Attribute(),改变html属性。
节点可以通过js创建、移除和克隆。
DOM事件(.等等,如box1.onclick,称onclick为事件)
DOM事件传播(外父标签,内子标签):先从外往内传(捕获阶段),再从内往外传(冒泡阶段)。注意:最内层的标签元素,因为就自己,就不再区分捕获还是冒泡了,所以代码书写顺序会影响执行顺序,但其他的代码书写顺序不会影响执行顺序。
DOM0级事件监听:.onXXX=function(){};的写法只能监听冒泡阶段。
DOM2级事件监听:.addEventListener(‘click’,function(){}, true or false) 监听不同阶段通过true或false改。
如果给元素设置两个或多个同名事件,则DOM0级写法后面写的会覆盖先写的;而DOM2级会按顺序执行。
DOM事件对象:e/event,浏览器给封装的,写在function的形参上。如.onXXX=function(e){e.xx};
事件对象中还有许多操作,如阻止事件传播等等,有机会深入研究。
事件委托(处理动态绑定事件的问题):
批量添加事件监听的性能问题
事件监听的注册会消耗一定的系统内存,而批量添加事件会导致监听数量太多,内存消耗大。
每个< li>的事件的处理函数都是不同的函数,再js中函数也是引用,所以函数本身也会占用内存。
事件委托:利用事件冒泡的机制,将后代元素事件委托给任意一个祖先元素。
通常结合e.target
常用场景:
批量添加事件监听
动态元素上树
使用事件委托时注意:
不能委托不冒泡的事件给祖先元素。
最内层元素不能再有额外的内层元素,因为e.target添加监听的最内层元素。
16.BOM(Browser Object Model):允许 JavaScript 与浏览器对话
window对象:全局变量是window对象的属性。直接写在.js文件里,不同的< srcipt>里,不同的,js文件里,都是全局变量,都是windows的属性。
还有其他常用玩法
17.对象
在 JavaScript 中,几乎“所有事物”都是对象。所有 JavaScript 值,除了原始值,都是对象。
布尔是对象(如果用 new 关键词定义)
数字是对象(如果用 new 关键词定义)
字符串是对象(如果用 new 关键词定义)
日期永远都是对象
算术永远都是对象
正则表达式永远都是对象
数组永远都是对象
函数永远都是对象
对象永远都是对象
在js中,对象是键值对的集合,表示属性和值的映射关系
大括号表示对象,属性是key:value,的形式;方法也是key:value,的形式,但value是函数。
函数上下文this(需要再研究下?):
函数中的this,表示函数的上下文,函数中的this指代什么,需要通过调用函数时的前言后语来判断。
函数的上下文,由调用方式决定。同一个函数,用不同的形式调用,则上下文不同。
函数代码里写this,不知道this指代什么,因为函数只有被调用时,它的上下文才能被确定。
规则1:对象.调用函数,函数中this指代这个打点对象(xiaoming.sayHello())
规则2:圆括号直接调用函数,函数中this指代window对象(var sh=xiaoming.syHello(); sayHello();)
规则3:数组(类数组对象)枚举出函数进行调用,上下文是这个数组。arguments对象是最常见的类数组对象。
规则4:IIFE中的函数,上下文是window对象。
规则5:定时器、延时器调用函数,上下文是window对象。
规则6:事件处理函数的上下文是绑定事件的DOM元素。
call和apply能指定函数的上下文。
Java/c++,面向对象的语言
JavaScript,基于对象的语言
因此,js中构造函数可以类比成面向对象中的“类”,写法确实类似,但和真正的面向对象有本质不同,除此之外,js有自己特有的特性。
实例可以访问它的原型的属性和方法,“原型链查找”。
方法应该写在类(js叫原型)里,不应该放在构造函数里new新的,不合理,此时就可以用prototype搞在原型上。
原型链的重点是object.prototype,类似于java中可以调用object的方法。
继承
Student.prototype = new People();
(super关键字可以找父类)
包装类、Math对象、Date对象
时间戳:1970.1.1 0点整距离某时刻的毫秒数
17.ES6
引入let,let和var的区别:
1.var允许重复声明,let不允许
2.var会变量提升,let不存再变量提升(正常逻辑)
3.let会暂时死区,同名时会自动绑定当前作用域(绑定区块),解决了var在外边但函数内能拿到的不舒服
4.全局中声明的let,不会绑到window
5.let有块级作用域。(var i = 3;for(;i<8;i++){} 和 for(var i=3; i <8; i++){}一样
有了let,就不一样了,成了我们正常理解的java和c了,写在for里外面就拿不到了。
const
关键字 const 有一定的误导性。
它没有定义常量值。它定义了对值的常量引用。
因此,我们不能更改常量原始值,但我们可以更改常量对象的属性。(当然,基本数据类型肯定就没法修改了)
模板字符串
Let info=’我的名字是’:${person.username}
箭头函数(类似lamada表达式)
Map对象、Set对象、Iterator跟javac++一样
JS异步操作Async 、promise(见前端技术知识总结)
class类玩法,跟java差不多,也有super的用法,也有extends用法,也能写私有属性了(加个_),也得写构造函数constructor,为了不让每次实例化都有一个方法,所以这里方法定义的和constructor同级(这样的写法跟java等写法更相似了)
解构赋值
数组解构赋值:
模式(结构)匹配
索引值相同的完成赋值
Eg. const[a,b,c]=[1,2,3]
对象解构赋值:
模式(结构)匹配
属性名相同的完成赋值
Eg. const{ age:age, username:username }={username:’Alex’, age:18};
18.js常用方法
split():字符串按规则拆成数组
join():数组按规则拼成字符串
例子:return val.split(“”).join(“\n”),效果是把一行字符串竖着显示
19.js中= =、= = =、!==、!= = =