JS数据类型!
1:基本数据类型:
(1)number(数值)
正数 ,负数, 0, 小数 ,infinity-无穷大,NaN不是有效的数字
空字符产转换为数字是0
布尔转换为数字true是1.false是0
null是0
undefined是NaN
Symobl不能转换为数字
NaN与任何人都不相等,即使是NaN与NaN都不相等
(2)string(字符串)
用双引号"",单引号'',反引号(模板字符串)``,这些抱起来的都是字符串,
其他数据类型转换为字符串类型,1:value.toString(),2:String(value)
(3)Boolean(布尔)
true/false
0/NaN/空字符产/null/undefined这些值都是false
其他数据类型转换为布尔,![value]先转换为布尔再取反
(4)null(空值)
(5)undefined(未定义的)
(6)symbol
唯一值
(7)bigint
最大安全数,最小安全数
2:引用数据类型
object(对象)
包括普通对象{}, 由多组键值对组成,属性名和属性值{key:value}
Array数组[],索引值从0开始,每一个索引对应一个值
类数组(class)
实例对象,
原型对象
数组对象[]
正则对象/^$/
日期对象
创建对象方法
1 let obj = new Object()
2 let obj = {}
function(函数)
定义函数,function a(x,y){},普通函数,a为函数名,x和y为为形参
调用函数,a(),内部可以传入实参
函数又分为匿名函数和函数表达式,区别是一个有名字 一个没有名字
立即执行函数:(function(){})(),无需调用即可自己执行自己!
执行函数时需要传递实参,但是传递多少个实参不确定,想接受实参信息,可以用函数内置arguments
也可以用ES6新增剩余运算符...,一般写到形参最后面,如果前面没有形参,则所有实参信息都在里面,
剩余运算符又兼容性问题,arguments没有兼容问题,
ES6新增箭头函数(形参)=>{函数体 },箭头函数都是函数表达式,箭头函数中没有arguments,没有this指向
let fn=(x)=>y=>{x+y}
3:数据类型检测
1:typeof!
2:instanceof!
3:constructof!
4:onject.prototype.toString.call
4=号的区别
=赋值,将右侧值赋值给左侧变量
+=:a=a+5,相当于a+=5
-=:a=a-5,相当于a-=5
*=同上
/=同上
%=同上
==相等,对比时可能会存在数据转换,隐式数据转换
===绝对相等,要求类型和值都要相等
5for循环
for (let i = 0; i < array.length; i++) {
}
1执行初始化表达式,初始化变量 let i = 0
2执行表达式,判断是否执行循环 i < array.length
3执行语句 大括号里面的
4更新表达式 i++
for循环,从哪开始,到哪结束,加还是减
6ES6解构赋值
主要针对数组和对象,左侧定义和右侧类似的结构,申明几个变量可以快速得到每一部分信息
let array=[1,2,3,4,5], let [x,y]=array console.log(x,y) 此时的x为1,y为2
如果let [x,...y]=array console.log(x,y)此时的x为1,y为一个数组,包含1后面的所有项
那么如果只想要数组里的3和4,那么申明方法就是let [,,x,y]=array此时得到的正好是3和4
对象的解构赋值
let obj={
a='张三',
b=18
}
let{a,b}=obj,申明变量需要和属性名保持一致
7交换两个变量的值
let a=1
let b=2
用一个新的变量c来做中转
let c=a
a=b
b=c
此时就可以完成两个变量值的交换
8截取字符串方法
substr(n,m)索引从n开始,m代表截取的个数,。截取多少个
substring(n,m)索引从n开始。截取到m处,但是不包含m
slice(n,m)和substring一样,但是可以以负数作为索引
9逻辑||和逻辑&&
布尔值运算
逻辑||(与):两个都为真返回true,如果第一个值为false则直接返回第一个,不会管第二个值,短路运算
逻辑&&(或):两个只要有一个是true就返回true,两个都为false才返回false
逻辑&&优先级高于逻辑||
非布尔值运算
会先将值转换为布尔值再进行运算,并返回其原值
10if语句
if ( 条件表达式){
语句...
}else{f
语句...
}
条件运算再执行时如果条件1满足则执行条件一的语句,如果条件二满足则执行条件二语句
if...elseif...else。其中elseif可以有个
11条件分支语句(switch)
seitch(条件表达式){
case1 表达式
语句....
break
case2 表达式
语句....
break
}
switch里面表达式与case表达式依次比较,如果相同就执行当前case中语句,执行完毕进行break直接退出,不会往下进行操作
12while循环语句
while( ){
}
13break和continue
break结束整个循环,步长累计也不再执行
continue,结束本轮循环进行下一轮循环
14栈内存和堆内存
1栈内存:
变量保存在栈内存中,基本数据类型都保存在栈内存中,类似 let a = 1 再用let b= a,b只是复制了a的值,但是值与值之间都是独立存在的,互不影响,修改一个变量不会影响其他的变量,
2堆内存
对象是保存到堆内存中的,let obj=new Object(), 此时obj变量名储存在栈内存中,栈内存中保存的是new object()的引用地址,
如果两个变量引用的是同一
15作用域
1全局作用域
页面打开时创建,页面关闭时销毁,
全局作用域中创建的变量都会作为window对象属性保存
全局作用域中创建的函数都会作为window方法使用
2局部作用域(函数作用域)
调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁
每次调用函数就会创建一个新的函数作用域,他们之间是相互独立的
函数作用域可以访问到全局作用域的变量
全局作用域不可以访问函数作用域中的变量
16构造函数的原型对象
构造函数和被构造函数制造出来的实例对象都指向同一原型对象,都可以访问到此prototype
当我们创建构造函数时,可以将这些对象共有的属性和方法添加到原型对象上,不用为每一个对象添加,这样不会影响到全局作用域,而且每个对象都会拥有这些方法和属性
注意;原型对象也会有原型,如果要找方法和属性可以一直往下找原型的原型吗,直到找到object
object也有 _ proto _
17数组
数组也是一个对象,与普通对象相同都是用来储存值的,与对象不同的是对象是通过字符串作为属性名的,但是数组是以数字作为索引来操作元素的,
索引都是以0开始的,
创建数组对象
1:let arr= new Array()
2:字面量创建数组,let arr = []
数组内添加元素 arr[0]=1 arr[1]=2
读取数组中元素 console.log(arr[0]) 返回为1
读取数组的长度 arr.leng
18数组的方法
1 push() 向数组末尾添加一个或多个元素,并返回数组新的长度
2 pop 删除数组最后一个元素,并将删除元素作为返回值
3 unshift 向数组最前面添加一个或者多个元素 并返回的数组新的长度
向最前面添加元素以后其他所有的元素的索引都会依次进行调整
4 shift 删除数组第一个元素 并将被删除元素作为返回值返回
数组的遍历、
遍历数组就是将数组中所有元素都取出来
arr.for Each(item,index)=>{} 数组有多少个元素就会执行多少次,里面会有三个参数。第一个为正在遍历的值,第二个值为正在被遍历的值的索引,第三个是正在被遍历的数组
slice方法
slice(start,end)
可以用来从数组中提取指定元素,1截取开始的位置的索引,2截取结束位置的索引,如果最后一位不写会默认到数组最后一位
该方法不会给改变原数组,而是将截取到的元素封装到一个新的数组中返回
splice方法
arr.splice()
删除元素并向数组添加新元素,使用solice会影响到原数组。会将指定元素从原数组中删除,并将被删除的元素作为返回值
参数。第一个表示开始位置的索引,第二个参数表示要删除的数量,第三个参数和后面的参数可以传递新的元素,这些会自动插入到索引开始位置的前面
concat方法
concat()可以连接两个或者多个数组,并将新的数组返回,不会对原数组影响
join方法
join()该方法可以将一个数组转换为字符串,该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回
join()中可以指定一个字符串作为参数,这个参数将会成为数组元素的连接符,不指定连接符默认以逗号作为连接符
reverse方法
reverse()该方法用来反转数组,前面到后面,后面到前面。该方法会直接修改原数组
sort方法
sort()对数组进行排序,也会影响原数组,默认会按照unicode进行排序,
19函数的方法
两个都是函数的方法,需要通过函数来调用,都会执行函数,可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this,
1:call( )
function.call( )
2:apply( )
function.apply( )
20date对象
let date=new Date( )
构造函数
获取当前的执行时间
21math
math.abs()返回数的绝对值
math.ceil( )向上取整,小数位只要有值就向上进1
meth.floor()向下取整,小数部分会舍弃
math.round()四舍五入
math.random()生成0-1之间的随机数。不包含0和1
max()获取多个数中的最大值
min()获取多个数中的最小值
22DOM
Document Object Model
文档对象模型
获取节点元素
document.getElementByClassName () 通过class获取
document.getElementById () 通过id获取
document.getElemenstByTagName() 通过标签名获取一组节点元素对象
document.getElemenstByName() 通过name属性获取一组元素节点
document.querySelector() 新增,根据css选择器来查询元素节点,id用#。class用.,该方法只会返回唯一一个元素,如果有多个元素只会返回第一个符合元素
document.querySelectorAll() 该方法与上面用法类似,不同的是他会将符合条件的元素封装到一个数组中全部返回
document.body 获取body
document.documentElement 获取html根标签
增删改查节点
document.createElement()创建元素节点,
document.createTextNode()创建文本 节点,
appendChild()向一个父节点中添加一个新的子节点;用法:父节点.appendchild(子节点)
insertBefore()在指定的子节点前面添加一个新的节点;用法:父节点.insertBefore(新节点,旧节点)
replaceChild()替换节点;用法:父节点.replaceChild(新节点,旧节点)
removeChild()删除一个子节点;用法:父节点.remoceChild(要删除的子节点)
23事件对象
event
clientX可以获取鼠标指针在当前可见窗口的水平座标 window.event.clientX
clientY可以获取鼠标指针在当前可见窗口的垂直座标 window.event.clientY
pageX可以获取到鼠标相对于当前页面的水平座标
pageY可以获取到鼠标相对于当前页面的垂直座标
mousemove鼠标移动事件
24DOM事件流
DOM事件分为三个阶段
1 捕获阶段 从大到小,从上往下
2当前目标阶段
3冒泡阶段 从小到大,从里到外
js代码只能执行捕获或者冒泡阶段的其中一个阶段
xx.addEventListener('click',functiong(){} 此处如果填true那么处于捕获阶段,如果是false或者不写就是开启冒泡)
有一些事件没有冒泡,比如blur,focus,mouseenter,mouseleave
阻止默认事件,e.preventDefault(),比如点击页面跳转等
阻止事件冒泡,e.stopPropagation()
25事件委托
指将事件统一绑定给该元素的共同父元素,这样当后代元素上的事件触发后,会一直冒泡到祖先元素
事件委托是利用了冒泡,通过事件委托可以减少事件绑定的次数,提高程序的性能
26innerHTML和creatElemnt
二者都可以创建一个元素节点,但是innerHTML效率会更高,不能采取拼接字符串方法不然会很慢。可以采用数组形式拼接,结构稍微负责一些,creatElement创建效率会低一点,但是结构更加清晰
27注册事件的两种方式
1 event.onxxxx=function(){
}
2event.addEventlistener('xxxx',functiong(){
}) 第二种方法不用带on,但小括号里面的注册事件必须是字符串类型的,同一元素和同一事件可以添加很多个侦听器
28BOM
浏览器对象模型,核心是window
bom是由各浏览器厂商制定的
是最大的对象,包含dom
29窗口加载事件
window.addEventListener('load',functiong(){
}) 窗口加载事件,当文档内容完全加载完成会触发该事件,就会调用此函数
30调整页面窗口事件
window.addEventListener('resize',function(){
})调整窗口大小加载事件,当触发时就会调用该函数
31定时器
1:settimeout() 只调用一次
里面有两个参数。第一个是调用的函数,可以是直接函数,也可以是函数名;第二是延迟的毫秒数,时间也可以省略
该定时器会在定时器到期后执行调用函数
一个页面中可能会有很多定时器,需要给每个定时起标识符,可以区别每一个定时器,也可以方便清除
2:setInterval()重复调用
里面有两个参数。第一个是调用的函数,可以是直接函数,也可以是函数名;第二是延迟的毫秒数,时间也可以省略
该定时器会重复调用一个函数,每隔一段时间就回会去调用一次函数
一个页面中可能会有很多定时器,需要给每个定时起标识符,可以区别每一个定时器,也可以方便清除
清除定时器
clearTimenout(定时器标识符)
clearInterval(定时标识符)
32this指向问题
1:全局作用域或者普通函数中this指向全局对象window,定时器里面的this也指向window
2:方法调用中this被谁调用就指向谁
3:构造函数中的this指向构造函数的实例
33同步任务和异步任务
同步任务在主线程执行栈中,
任务队列,异步任务分类:普通事件:click,resize,资源加载:load,error,定时器:clearTimenout
,clearInterval等
34location
由通信协议,域名,端口号,路径,参数和锚点组成
35offset
offsetparent获取元素距离带有定位的父元素的位置,如果父元素没有定位,则返回以body为准的距离
获得自身的大小,返回数值不带单位
offsetTop返回带有定位父元素上方的偏移
offsetLeft返回带有定位父元素左边框的偏移
offsetWidth返回包括自身的padding,border,内容区域的宽度吗,不包含margin
offsetHeight返回包括自身的padding,border,内容区域的高度不包含margin
\