基础概念:脚本语言;
JavaScript:简称js,是一个运行在客户端/浏览器端的解释性弱类型面向对象; 1.js的运行环境为浏览器自带,不需要安装任何环境
2.编译和解释:编译是在程序执行之前会先检查语法是否正确,如果不正确就不执行;比如:Java、C++;解释型是在程序之前不检查语法是否正确,而是直接执行,若是遇到错误之后会停止后续代码;例如:js、php
3.弱类型:变量的保存类型是随意的,数据类型由数据来决定;例如:1->nunber;"1"->字符串;"1"+"1"="11"强类型:变量保存的数据,由数据的类型来决定能保存什么数据。
- 面向对象:对象名.属性名 对象名.方法名()比如:console.log()控制台输出
使用方式:
两种使用方式: 1.直接在html页面上写上,;写在的最后,免得网络卡了加载不出来css; 2.创建一个xx.js的文件,在html中引入
## 输出方式 1.在控制台打印输出日志:console.log(你想要输出的东西); 2.在页面上输入日志:document.write(你想要输出的东西); document文档写入支持标签,将页面上的所有内容全部替换掉。 3.在浏览器的自带警告框输出日志:alert(...)会卡住整个网页,用户只能看到一个白板。
变量:
创建变量:
var 变量名=值;变量是在代码中可以变换的量,也是最基础的; 1.不能以数字开头;2.使用驼峰命名法或者下划线法;3.如果你的变量名为name,不管什么数据类型都会转为一个字符串;4.变量名不能是一个关键字5.变量只创建,不赋值,默认值为undefined;6.多个变量可以连续创建:var name="",age=""中间用逗号隔开;
常量:const 常量名=值;
常量是在代码中不会变的值,后续更改会报错,但是用的较少;
数据类型
基本类型
number:数字,直接写;蓝色 string:字符串,要加上""黑色 Boolean:布尔值,只有两个取值,true/false蓝色 null:空值,唯一的作用就是释放变量 undefined:默认值,取值只有undefined,灰色 查看数据类型:typeof()
运算符
算术运算符:+ - * % / 特殊:1.取余,作用:任意数取余2的结果为0的话则为偶数,可以用来判断奇偶数 取出后几位: console.log(1234%10)可以取出来4;1234%100可以取出来34;1234%1000可以取出来234
2.带有隐式转换,会将两边的数据类型都转为数字之后再进行计算;
true->1;false->0;null->0;undefined->NaN,"100"->100;"100px"->NaN字符串可以转换成数字,但是必须为纯数字,不然则为NaN
NaN:数字类型:算数运算的结果为NaN,比较运算为true/false;+遇上了字符串,两边都会转为字符串,变为拼接操作;
关系运算符:> < >= <= == != === !== 结果为一个布尔值(true/false)带有隐式转换:两边都变为数字之后才比较大小
如果两边都为字符串则会按位比较:ASCII码:0-9<A-Z<a-z<汉字;
判断一个数是不是nan:isNaN()
true==undefined结果为true,要用===表示值和数据类型都要相等
逻辑运算符:
&&与:有假必假
||或:有真必真
!:取反,颠倒布尔值
=:赋值= += -= *= /= %=
将右边的值保存到左边
++与--:
前++与后++的区别:
1、单独使用的时候并没有什么区别
2、前++返回的是加了1的值;后++是返回没有加1的值
分支结构:
if(条件){操作}else if(条件){操作}else{默认操作}
注意:1.分支结构只要满足了条件就不会走其他的路了,注意书写的顺序
2、else if想写多少根据自己的实际情况决定
3、else可以省略,但是不建议
4、分支可以嵌套
switch...case:知道结果可以使用
switch(变量/表达式){ case 1: 操作1; case 2: 操作2; break; default: 默认操作; }
注意:1.不带有隐式转换;获取到的值为字符串;
2、默认1个case满足之后也会执行后续的case,所以要用break;
if与switch区别:switch为等值查询,所以执行效率更高,if为范围查询比较,所以执行效率较慢。
3、三目运算:条件?操作1:条件1?操作2:默认操作
注意:默认操作是不能省略的,省略了会报错;如果操作比较复杂就不能使用三目运算,操作只能由一句话
页面上的一切东西都是字符串
1、强制转换数据类型: parseInt(转换为整数),从左到右依次识别,遇到不认识的东西会停下,不认识小数点,若是一开始就不认识,则为NaN。 parseFloat:跟上面个一样,但是认识第一个小数点 number()
2、强制转换为字符串
xx.toString() string()
3、转布尔类型:
Boolean()不如!!X; 只有6个数的值转布尔类型为false:0 undefined null "" false NaN
循环结构
循环结构:反复执行相同或者相似的操作
三要素:
1、循环条件:开始-结束的次数
2、循环体:每次循环要做的操作
3、循环变量:往往向着不满足循环的方向前进
三种结构:
while循环:
var 循环变量=几
while(循环条件){循环体;循环变量变化起来}
特殊:有时候会用到死循环,不会结束的循环,不确定循环的次数
while(true){}
打破循环:1、break直接打破循环
2、continue:退出本次循环,下一次还是执行
for循环:
for(var循环变量=几;循环条件;循环变量变换){}
for的死循环:for(;;){}
for和while的区别:原理上并没有什么区别;while更麻烦,一般不确定循环的次数使用,for更简单,确定循环的次数可以使用,使用更多
while和do...while:当条件满足时并没有什么区别;条件不满足时,while不执行,而do...while至少执行一次;
function
1.定义:function 函数名(){函数体}
2、调用:函数名();
3、何时使用:不希望页面立即执行,希望由用户出发,函数是js的一等公民,所有独立的功能都要使用函数封装
4、带参函数:
创建一个带有参数的函数其实就是一个变量,不需要写var function(形参,....){};使用带参函数必须传入实参:函数名(实参,...)
注意:传参时需要一一对应,不能多也不能少,位置对应;
总结:1、不带参数的函数可以用来执行一些固定的操作;
2、带参函数可以根据传入的实参,执行不同的微操;
循环与函数的不同:时机不同;循环在页面打开时就已经完成了,函数需要调用才执行
自定义函数function:
1、申明方式就是上面那种
2、直接量方式:var 函数名=function(形参){函数体;return返回值;}
函数名其实就是一个变量名,尽量不要重复,否则后面的会把前面的覆盖;
2、return:退出函数,但是若是后面跟着一个数据,则会把数据返回到函数作用域的外部;但是return只负责返回并不负责保存,所以若是要使用函数内部的值的时候,要用一个变量去接住它;var result=函数名(实参);就算是省略掉了return,函数也会返回一个undefined。
3、作用域:2种; 1、全局作用域:全局变量和全局函数在任何一个地方都可以使用访问
2、函数作用域:局部变量和局部函数,只能在函数调用的时候在内部使用;
变量使用规则:优先使用内部的,内部没有就找外部的,外部没有就会报错;千万不要在函数内部使用没有定义的变量,会造成全局污染。
声明提前:
在程序正式执行之前,会将var声明的变量(轻)和function声明的函数(重)提前到函数的顶部,但是赋值会停留在原地。
强调:声明方式创建的函数会完整的提前;
直接量方式不会完整的提前,只有变量名部分会提前;
函数内部的变量会在执行完毕之后自动释放
重载:相同的函数名,根据传入的实参不同,自动选择对应的函数去执行,但是js不支持,后面的会把前面的覆盖
在函数内部自带一个arguments对象
固定套路:1、通过下标去传入的某一个实参:arguments[i];i从0开始
2、通过length去获取到底传入了几个实参:argument.length
数组
数组为线性排列;除了第一个元素,每一个元素都有一个后驱元素,除了最后一个元素每一个元素都有一个前驱元素,每个元素都有自己的位置称之为下标,从0开始,到最大长度-1。
创建函数:2种
1、直接量方式: var arr[];//空数组
2、构造函数方式:var arr=new Array();
获取数组中的数据:数据名[i]
后续添加/替换元素:
数组名[i]=新数据,下标没人为新增,下标有人为替换
数据的唯一属性:
获取数组的长度,从1开始
三个固定套路:
1、获取数组倒数第n个元素:arr[arr.length-n]
2、向末尾添加元素:arr[arr.length]=新
3、缩容:删除数组倒数第n个元素arr.length-=n
遍历数组:for(var i=;i<=arr.length;i++){}
DOM
1、document:不需要程序员自己创建,js解释器自己创建,一个页面只有一个document节点
var elem=docunment.getelementById() var elem=document.etElementByTagName("") var elem=document.etElementByClass() 特殊:
1、返回值:找到了返回的是一个类数组的DOM集合,没找到返回一个空数组
2、Js只能操作DOM元素,不能直接操作集合
3、不一定非要从document开始查找
通过元素之间的关系查找:
父亲:elem.parentNode
儿子:elem.children
第一个儿子:elem.firstElementChild
最后一个儿子:elem.lastElementchild
前一个兄弟:elem.previousElementSibling
后一个兄弟:elem.nextElementSibLing
操作元素:前提是找到元素
内容:innerHtml-获取开始到结束标签的内容 支持标签
获取:elem.innerHtml 设置:elem.innerHtml=""
innerText获取纯文本,不支持标签
设置:elem.innerText=""
以上两个标签都是双标签设置input有单独的设置方式
获取:input.value
设置:input.value=""
属性:
1、获取:elem.getAettribute("")
2、设置elem.setAttribute("属性名","属性值")
简化版:
1、获取:elem.属性名
2、设置:elem.属性名="属性值"
小缺陷:1.class必须写className
2、不能设置自定义属性,只能设置标准属性
样式:js来操作内链属性
获取:elem.style.css属性名
设置:elem.style.css属性名="css属性值"
特殊:
1、css属性名有横线的地方要用小驼峰命名法来代替
background-color->backgroundColor
绑定事件:elem.onclick=function(){}
this只能在事件内部使用;单个元素绑定时,指代的是这个元素;多个元素绑定时,指代当前元素
一切的获取都是为了判断,一切的设置都是修改