html决定网页结构和内容(决定看到什么),相当于人的身体。css决定网页呈现给用户的模样(决定好不好看),相当于给人穿衣服、化妆。js实现业务逻辑和页面控制(决定功能),相当于人的各种动作。
浏览器执行js:浏览器分为两部分:渲染引擎和js引擎。
js由ECMAScript(语法)、DOM(页面文档对象模型)、BOM(浏览器对象模型)组成。
js有三种书写位置:行内式、内嵌式、外部。
在html中推荐使用双引号,但在js中推荐使用单引号。
js提供的一些输入输出语句:
变量是用于存放数据的容器,我们通过变量名获取数据,甚至修改数据。变量的本质是程序在内存中申请的一块用来存放数据的空间。
变量的使用:先声明再赋值。
var age。
age = 18;var age = 18;声明变量的特殊情况:
变量的命名规范:
js是一种弱类型(动态)语言,这意味着不用提前声明变量的类型,在程序运行中,类型会自动确定。js的变量数据类型是只有程序在运行过程中,根据等号右边的值来确定的。js是动态语言,也同时意味着变量的数据类型可以发生改变。
js把数据类型分为两大类:简单数据类型、复杂数据类型。
Number:用来保存整数值,也可以保存小数。
Number.MAX_VALUE,数字型的最小值:Number.MIN_VALUE。String:引号里的文本 (推荐就使用单引号)
Boolean:true表示1,false表示0。
undefined:如果一个变量声明未赋值,就是undefined(未定义数据类型)。
var v = undefined;
console.log(v + 'pink'),输出的是undefinedpink。console.log(v + 1),输出的是NaN。null:空值。
var v = null;
console.log(v + 'pink'),输出的是nullpink。console.log(v + 1),输出的是1。检测数据类型:typeof 变量名。
数字型转换成字符串型:
其他类型转换成数字型:
其他类型转换成布尔型:Boolean()函数。
程序语言翻译成机器语言的工具称为翻译器,它翻译的方式有两种:编译和解释,两者区别在于翻译的时间点不同。
浮点数在算数运算里面会有误差,不要直接判断浮点数是否相等。
==:默认转换数据类型,会把字符串型的数据转换成数字型,只需要两边值相等就是true。
===:要求两侧的值和数据类型完全一致才是true。
短路运算:当有多个表达式(值)时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值。
三元运算符:条件表达式?表达式1:表达式2。如果条件表达式结果为真,就返回表达式1的值;如果为假就返回表达式2的值。
switch语句:通常处理case为比较确定值的情况,我们开发里面表达式经常写成变量。表达式的值和case里面的值相匹配的时候是全等,必须值和数据类型都一样。
switch(表达式){
case value1:
执行语句1;
break;
case value2:
执行语句2;
break;
...
default:
执行最后的语句;
}
continue关键字用于立即跳出本次循环,继续执行剩余次数循环。
break用于跳出整个循环。
创建数组:
var arr = new Array();var arr = [];(用这个,简单筛选数组中的元素:newArr[newArr.length] = arr[i];
函数使用分为两步:声明函数和调用函数。
声明函数:
function 函数名(){
函数体
}
函数形参和实参匹配问题
return:
arguments的使用:当我们不确定有多少个参数传递的时候,可以用arguments来获取。在js中,arguments实际上它是当前函数的一个内置对象。所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。
伪数组并不是真正意义上的数组,它有以下特点:
js作用域:就是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性,更重要的是减少命名冲突。
js的作用域(es6)之前:全局作用域、局部作用域。
变量的作用域:根据作用域的不同变量分为全局变量和局部变量。
从执行效率来看全局变量和局部变量:
现阶段js没有块级作用域,在es6的时候新增的块级作用域。
作用域链:内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值。(就近原则)
js解析器运行js分为两步:预解析、代码执行。
预解析分为:变量预解析(变量提升)、函数预解析(函数提升)。
案例:
<script>
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
//上面的代码预解析过后是:
f1();
function f1(){
var a; // 局部变量
a = 9;
b = c = 9; //直接赋值就是全局变量
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
console.log(c); //9
console.log(b); //9
console.log(a); //报错
</script>
在js中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象。对象是由属性和方法组成的。
创建对象的三种方式:字面量、new Object、构造函数。
对象字面量:就是花括号{}里面包含了表达这个具体事物(对象)的属性和方法。
<script>
//利用字面量创建对象{}
var obj = {
uname: 'wld',
age: 20,
saiHi: function(){
console.log('hi');
}
}
//使用对象 1.采取 对象名.属性名
console.log(obj.uname);
//2.调用属性还有一种方法: 对象名['属性名']
console.log(obj['age']);
//调用对象的方法sayHi 对象名.方法名()
obj.saiHi();
</script>
里面的属性或者方法采取键值对的形式。键 属性名: 值 属性值
多个属性或者方法中间用逗号隔开
方法冒号后面跟的是一个匿名函数
new Object
//利用new Object创建对象
var obj = new Object();
obj.uname = 'wld';
obj.age = 20;
obj.saiHi = function(){
console,log('hi');
}
利用 等号 = 赋值 的方法添加对象的属性和方法
每个属性和方法之间用分号结束
构造函数:就是把对象里面一些相同的属性和方法抽象出来封装到函数里面。
前面的方式一次只能创建一个对象,因此我们可以利用函数的方法,重复这些相同的代码,里面封装的是对象。
//构造函数的语法格式
function 构造函数名(){
this.属性 = 值;
this.方法 = function(){
}
}
new 构造函数名();
function Star(uname, age, sex, sang){
this.uname = uname;
this.age = age;
this.sex = sex;
this.sing = function(sang){
console.log(sang);
}
}
var wld = new Star('www', 20, '女');
wld.sing('乐队的夏天');
构造函数名字首字母要大写
构造函数不需要return就可以返回结果
调用函数要new函数
方法和属性前面要有this
变量和属性的相同点:用来存储数据的。不同点:变量是单独声明并赋值,使用的时候直接写变量名,单独存在的;属性是在对象里面的不需要声明的,使用的时候必须是对象.属性。
函数和方法的相同点:实现某种功能。不同点:函数是单独声明,并且调用的 函数名()单独存在的;方法是在对象里面的,调用的时候是对象.方法。
遍历对象:
for(var k in obj){
console.log(k); //k 变量 输出 得到的是属性名
console.log(obj[k]); //obj[k] 得到的是属性值
}
使用for in 里面的变量 一般写k 或 key
内置对象就是指js语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)。js提供了多个内置对象:Math、Date、Array、String等。
Math数学对象不是一个构造函数,所以我们不需要new来调用,而是直接使用里面的属性和方法即可。
Math.max():
Math.abs():求数值的绝对值。
三个取整方法:
Math.random():返回一个随机的小数,范围是[0,1)。
Math.floor(Math.random() * (max - min + 1)) + min;Date是个构造函数,必须使用new来调用创建我们的日期对象。
new Date();
获得Date总的毫秒数(时间戳),不是当前时间的毫秒数,而是距离1970年1月1日的毫秒数。
valueOf()、getTime()+new Date()Date.now()检测是否为数组:
添加数组元素的方法:
删除数组元素的方法:
pop():删除数组的最后一个元素。
没有参数
返回的结果是删除的元素
shift():删除数组的第一个元素。
翻转数组:reverse();
数组排序(冒泡排序):sort(function(a, b){
return a - b;})(a - b就是升序排列,b - a是降序)
数组索引方法:
indexOf(数组元素):返回该数组元素的索引号,从前往后查找。
lastIndexOf():返回该数组元素的索引号,从后往前查找。数组转换成字符串:
toString()contact():连接两个或多个数组,不影响原数组,返回一个新的数组。
slice():数组截取slice(begin, end),返回被截取项目的新数组。
splice():数组删除splice(第几个开始,要删除的个数),返回被删除项目的新数组。ps:这个会影响原数组。
基本包装类型:就是把简单数据类型包装成为了复杂数据类型,这样基本数据类型就有了属性和方法。
字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。
字符串对象,根据字符返回位置:index('要查找的字符',[起始的位置])
根据位置返回字符:
charAt(index):返回元素本身charCodeAt(index):返回相应索引号的字符ASCII值,目的是判断用户按下了哪个键str[index]:H5新增的有一个对象 来判断是否有该属性:对象['属性名']
字符串操作方法:
concat(str1,str2...):用来连接两个或多个字符串,拼接字符串等效于+,+更常用。substr(start,length):从start开始,length取的是个数。slice(start,end):从start开始,截取到end位置,end取不到。substring(start,end):从start开始,截取到end位置,end取不到,基本和slice相同,但是不接受负值。替换字符:replace('被替换的字符','替换为的字符')
字符转换为数组:split('分隔符')
toUpperCase():转换大写
toLowerCase():转换小写
简单类型又叫基本数据类型或者值类型,复杂类型又叫做引用类型。简单数据类型 null返回的是一个空的对象。
堆栈空间分配区别:
API是为我们程序员提供的一个接口,帮组我们实现某种功能,会使用就行。
Web API是浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM),现阶段我们主要针对于浏览器讲解常用的API,主要针对浏览器做交互效果。
DOM是文档对象模型,是个标准编程接口,通过DOM接口可以改变网页的内容、结构和样式。
DOM树:(DOM把以下内容都看作是对象
获取元素:getElementById()
console.dir():打印我们返回的元素对象,更好的查看里面的属性和方法。获取某类标签元素:document.getElementsByTagName('标签名')
element.getElementsByTagName('标签名'):获取某个元素(父元素)内部所有指定标签名的子元素
通过H5新增的方法获取:
document.getElementsByClassName('类名'):根据类名返回元素对象集合。document.querySelector('选择器'):根据指定选择器返回第一个元素对象。
document.querySelectorAll('选择器'):根据指定选择器返回所有元素对象集合。获取特殊元素(body、html):
document.body:返回body元素对象。document.documentElement:返回html元素对象。所谓的事件就是触发的响应机制。事件由三部分组成:事件源、事件类型、事件处理程序,也称为事件三要素。
执行事件的步骤:
改变元素内容:
element.innerText:从起始位置到终止位置的内容。
element.innerHTML:起始位置到终止位置的全部内容。
修改表单属性:
this.disabled = true; this指向的是事件函数的调用者。样式属性操作:
element.style:行内样式操作。
``element.className`:类名样式操作。(添加类名
它会直接更改类名,会覆盖之前的类名。如果想要保留之前的类名,就在等号先写出之前的类名后面加空格再写上新的类名。(多类名选择器
适合样式多的情况。
获得焦点:onfocus,失去角度:onblur。
鼠标经过:onmouseover,失去角度:onmouseout。
排他思想:如果有一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法。
获取属性操作:
element.属性:获取内置属性值(元素本身自带的属性)
element.getAttribute('属性'):主要获取自定义的属性(自己添加的属性)
修改属性值操作:
element.属性 = '值' :设置内置属性值element.setAttribute('属性','值'):主要针对于自定义的属性移除属性:element.removeAttribute('属性')
自定义属性目的:为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性,H5新增了自定义属性:H5规定自定义属性data-开头做为属性名并且赋值。
element.dataset.属性名或者element.dataset['属性名']
一般来说,节点至少拥有nodeType、nodeName、nodeValue这三个基本属性。在实际开发中,节点操作主要操作的是元素节点。
父节点:parentNode
子节点:
获取子节点
childNodes:获取所有的子节点。
得到的所有子节点包含元素节点、文本节点等等。
如果只想要获得里面的元素节点,就要专门处理。
children:获取所有的子元素节点。(最常用的
获取第一个子节点(最后一个是last
firstChild:返回第一个子节点,不管是元素还是文本节点。
firstElementChild:返回第一个子元素节点
实际开发的写法:没有兼容性问题又返回第一个子元素
children[index]兄弟节点:
nextSibling:下一个兄弟节点,包含元素节点或文本节点等等。nextElementSibling:下一个兄弟元素节点。previousSibling:下一个兄弟节点,包含元素节点或文本节点等等。previousElementSibling:下一个兄弟元素节点。我们想要在页面添加一个新的元素:1.创建元素 2.添加元素。
document.createElement('tagName')方法创建由tagName指定的HTML元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点。
添加节点:
node.appendChild(child)(node父级、child子级)方法将一个节点添加到指定父节点的子节点列表末尾,类似于css里面的after伪元素。node.insertBefore(child,指定元素):在指定元素前面添加child节点。node.removeChild(child):删除一个node的child节点,返回删除的节点。
node.cloneNode():返回调用该方法的节点的一个副本。
document.write():直接将内容写入页面的内容流,但是文档流执行完毕,它会导致页面全部重绘。
innerHTML:创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂。
createElement():创建多个元素效率稍微低一点,但是结构更清晰。
BOM是浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window。BOM由一系列相关的对象构成,并且每个对象都提供很多方法与属性。BOM是浏览器厂商在各自浏览器上定义的,兼容性较差。BOM比DOM大,它包含DOM。
window对象是浏览器的顶级对象。
window.namewindow.onload = function(){}或者window.addEventListener('load',function(){});是窗口(页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、css、文件等),就调用的处理函数。
document.addEventListener('DOMContLoaded',function(){}):DOMContLoaded事件触发时,仅当DOM加载完成就行。
如果页面的图片很多的话,从用户访问到onload触发可能需要较长的时间,交互效果就不能实现,必须影响用户的体验,此时用这个比较合适。
load:等页面内容全部加载完毕,包含页面dom元素、图片、flash、css等。DOMContLoaded:是DOM加载完毕,不包含图片、falsh、css等就可以执行,加载速度比load更快一些。
window.onresize = function(){}或者window.addEventListener('resize',function(){});是调整窗口大小加载事件,当触发时就调用的处理函数。
window提供了两个好用的方法:
window.setTimeout(调用函数,[延迟的毫秒数]):设置一个定时器,该定时器在定时器到期后执行调用函数。
setInterval(回调函数,[间隔的毫秒数]):反复调用一个函数,每隔这个时间,就去调用一次回调函数。
window.clearTimeout(timeoutID):取消先前通过调用setTimeout()建立的定时器。
window.clearInterval(timeoutID):取消先前通过调用setInterval()建立的定时器。
this指向问题:一般情况下this的最终指向的是那个调用它的对象。
全局作用域或者普通函数中this指向全局对象window(注意:定时器里面的this指向window)
方法调用中谁调用this指向谁
构造函数中this指向构造函数的实例
js一大特点是单线程。为了解决单线程造成的等待过久的问题,js出现了同步和异步。本质区别是这条流水线上各个流程的执行顺序不同。
同步任务:都在主线程上执行,形成一个执行栈。
异步任务:js的异步是通过回调函数实现的。异步任务相关回调函数添加到任务队列中(消息队列)。一般而言,异步任务有以下三种类型:
js执行机制:
由于主线程不断的重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为事件循环。
location属性用于获取或设置窗体的URL,并且可以用于解析URL。因为这个属性返回的是一个对象,所以我们将这个属性也称为location对象。
URL是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
location对象的属性:
location.href:获取或者设置整个URLlocation.host:返回主机(域名)location.port:返回端口号,如果未写返回空字符串location.pathname:返回路径location.search:返回参数location.hash:返回片段 #后面内容常见于链接锚点location对象的方法:
location.assign():跟href一样,可以跳转页面(也称为重定向页面),可以后退页面。location.replace():替换当前页面,因为不记录历史,所以不能后退页面。location.reload():重新加载页面,相当于刷新按钮或者f5.如果参数为true强制刷新ctrl+f5。navigator对象包含有关浏览器的信息,它有很多属性,我们最常用的是userAgent,该属性可以返回由客户机发送服务器的user-agent头部的值。
window给我们提供了history对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的URL。
history对象方法: