基础概念小结(2)

102 阅读9分钟

数组去重

1.Set去重
2.for循环,splice去重
3.for循环,indexOf去重
4.for循环,includes去重
5.利用filter去重

insertBefore

功能:将目标节点添加至参照节点之前
参数:dom.insertBefore(目标节点,参照节点)

console.log("heihei");

滚动条高度的读写
浏览器的兼容性
滚动条高度的兼容写法
    var sTop = document.body.scrollTop || document.documentElement.scrollTop;

事件相关的三要素

事件元素 : 触发事件的元素
事件类型 : 事件触发的类型onclick ondblclick onmouseover
事件对象 : 携带着相关类型事件的属性和方法
    只有鼠标事件对象和键盘事件对象
事件对象的兼容写法
    document.onclick = function(evt) {
        var e = evt || event;

鼠标事件对象 坐标相关属性

page:针对于整个页面的左顶点  常用
    console.log(e.pageX + "," + e.pageY);
client:针对于可视窗口的左顶点  不常用
    console.log(e.clientX + "," + e.clientY);
offset:针对于父元素的左顶点  用于拖拽
    console.log(e.offsetX + "," + e.offsetY);
元素在页面移动的本质就是在改变它的lefttop

事件流

事件流:当某个元素执行某种事件时, 该事件会向父元素传递或向子元素传递
事件流传递的方向:
冒泡:由子元素向父元素传递
onfocus onblur onload不会产生冒泡问题      
捕获:由父元素向子元素传递

阻止冒泡s

在事件传播的子元素上,通过事件对象调用函数
    e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;

阻止浏览器的默认行为

e.preventDefault ? e.preventDefault() : e.returnValue = false;

键盘事件

注意事项:通常情况下键盘事件的事件源都是document
    键盘弹起的时刻触发  document.onkeyup
    键盘按下的时刻触发  document.onkeydown
    生成一个字符的时刻触发  document.onkeypress

键盘事件对象

获取键盘按下的字符的ASC码值
    兼容写法
    var key = e.keyCode || e.which || e.charCode;
    console.log(key, String.fromCharCode(key));
        48   "0"
        97   "a"  
        65   "A"   
        32    空格
        13    回车
        10    ctrl+回车
        ctrlKey判断ctrl是否被按下

事件绑定的方式

1.通过HTML元素直接绑定
2.通过js对象绑定
以上两种绑定方式不能完成一些功能:
     (1).不能为相同的元素多次绑定相同的事件
     (2).无法决定事件流的传递是冒泡还是捕获
3.事件监听
    好处
        (1).可以为相同的元素多次绑定相同的事件
        (2).可以决定事件流的传递是冒泡还是捕获
    事件元素.addEventListener("去掉on的事件类型","事件体回调函数",["捕获还是冒泡"]);
        默认不写或flase为冒泡,true捕获
当捕获和冒泡同时存在于一个元素时,先捕获后冒泡

事件绑定的取消

解绑的核心思想就是去掉原来绑定的函数对象
    1.js方式的解绑
        oBtn.onclick = null;
    2.事件监听的解绑
         document.removeEventListener("click", fun);
         //注意事项:addEventListener和removeEventListener的回调函数必须是同一个

事件委托

委托:自己事情让别人干 
    委托的本质是依赖于事件冒泡
好处1:
    场景1:
    批量绑定若干子元素的事件,可以大大提高程序绑定事件的效率
        委托中,被被点击的元素不是this      this是父元素
    target被操作的真实元素
        var target = e.target || e.srcElement;
    tagName操作元素的名字,且为大写
        console.log(target.tagName);
好处2:
    场景:为未来添加的子元素提前绑定事件

拖拽

拖拽相关的事件
    onmousedown   box
    onmousemove   document
    onmouseup     document
        onmousedown包含move和up
        也就是说down了之后,才绑定了move和up事件
可视窗口的高,可视窗口的宽
    console.log(innerWidth, innerHeight);

正则的概念

字符串正确的规则

作用

前端往往有大量数据效验工作,正则对象可以控制字符串的格式,从而境地服务器压力,
提高程序运行效率

正则表达式验证数据格式  前端
服务器验证数值         后端

JS的正则表达式通常都围绕着表单验证  

正则对象的创建

a.构造方法
    var reg = new RegExp("格式字符串",["修饰符"]);
        test
            功能:判断目标字符串是否满足正则对象的格式
            参数:test(目标字符串)
            返回值:boolean
b.字面量
    var reg = /格式字符串/修饰符;

正则的格式字符串

格式字符串:普通字符+特殊字符
普通字符:普通的字符,看起来是什么就是什么
特殊字符:拥有特殊含义的字符
    a.单个字符
    b.组合字符
    c.各种括号

至少包含一个a
    var reg = /a/;
至少包含连续的5个a
    reg = /aaaaa/;

同时存在,同时消失
    ^:正则开始
    $:正则结束
只能包含一个a
    reg = /^a$/;
只能包含3个a 
    reg = /^aaa$/;
以b开头  至少3个a  至多5个a
    reg = /^ba{3,5}$/;
6个5
    reg = /^5{6}$/;
邮编   6位数字  
    reg = /^\d{6}$/;
定义一个由字母或数字或下划线组成的用户名   范围在6,18之间   
    reg = /^\w{6,18}$/;
定义一个由字母或数字或下划线组成的用户名 但是首字母不为数字   
    reg = /^\D\w{5,17}$/;
定义一个密码 至少6位
    reg = /^.{6,}$/;
www.baidu.com
    reg = /^www.baidu.com$/;
写一个3+5
    +:{1,}
    reg = /^3+5$/;
以 13 或 15 开头的手机号
    或的表示方法
    a. (xxx|xxx|xxx)
        reg = /^1(3|5)\d{9}$/;
    b.[x1x2x3x4]
        reg = /^1[35]\d{9}$/;
只能是a-f和0-6的区间
    reg = /^[a-f][0-6]$/;
空格
    reg = /^\s$/;
[\u4e00-\u9fa5] 中文字符区间
两个中文
    reg = /^[\u4e00-\u9fa5]{2}$/;
除了
    [^x1x2x3]
    reg = /^[^abc]$/;

密码强弱的判断

由数字,字母,其他字符构成
    纯数字,纯字母,纯其他字符为弱
    全都有为强
    其他情况为中
至少包含
    var regNum = /\d+/;
    var regChar = /[a-zA-Z]+/;
    var regLetter = /[!@#$%]/;

只能
    var _regNum = /^\d+$/;
    var _regChar = /^[a-zA-Z]+$/;
    var _regLetter = /^[!@#$%]$/;

表单验证

action:发送数据的地址,也就是服务器接收数据的文件
method:数据提交的方式,与安全性和效率有关,get和post,默认为get
get:安全性低,但效率高,携带数据量小
post:安全性高,但效率低,携带数据量大

焦点验证表单

失去焦点    onblur
聚焦        onfocus

正则相关的方法

test
    功能:判断目标字符串是否满足正则对象的格式
    参数:test(目标字符串)
    返回值:boolean
exec
    功能:返回满足正则对象的子串
    参数:exec(目标字符串)
    返回值:满足正则对象的子串,存储在长度为1的数组
修饰符
    g:全局
    i:忽略大小写

字符串相关方法,正则对象作为参数

search方法  返回与正则表达式查找内容匹配的第一个子字符串的位置
    用法:str.search(reg)
match
    功能:返回满足正则的子串,存储在数组中
    参数:match(正则对象)
    返回值:满足正则的子串数组
replace
    replace(参数1正则对象,参数2):用参数2,替换参数1,返回被替换的字符串

let

let:用来定义变量的关键字
特点:
    1.要求变量必须先定义后使用,不能声明提升
    2.不能重复定义变量
    3.块级作用域(变量在该作用域中不会丢失)
    4.暂时性死区(当内部变量与外部变量同名时,内部变量屏蔽外部变量)

const

const:定义只读变量的关键字(创建有名的常量)
特点:
    1.const修饰的变量为只读变量
    2.const修饰的变量必须初始化(赋初值)

    3.不能声明提升,必须先定义后使用
    4.不能重复定义
    5.块级作用域
    6.暂时性死区
面试题:var,let,const的异同?
    1.都是用来定义变量的关键字
    2.var具备声明提升
    3.let,const必须先定义后使用,不具备声明提升,不能重复定义变量
               块级作用域,暂时性死区
    4.const修饰的变量为只读变量,且必须初始化

this与bind

this:函数体内的内置对象,作用域只能在函数体内使用
    1.与事件体连用:代表触发该事件的元素本身
    2.与普通方法连用(除了事件体和构造方法),调用该方法的对象本身
bind:函数对象的一个方法,作用就是用来改变该函数的this指向,主要修饰匿名函数的this
    bind(被修改的this指向)

json和字符串的相互转换

字符串->json对象
    注意事项:使用以下转换方法的json对象和字符串,key必须用双引号引起来
    JSON.parse(str)
json对象->字符串
    JSON.stringify

for...in和for...of

for...in
    通常用来遍历json对象,因为遍历的是下标
    for(let 索引 in json对象){}
for...of
    针对于没有下标的容器,进行遍历
        for(let 元素数值 of 容器){}

字符串扩展方法

判断字符串是否包含在另一个字符串中
在ES5 中使用的是 indexOf() 方法,在ES6中可以使用includes()、startsWith()、endsWith()三个方法。
    str.includes(参数): 返回布尔值,表示是否找到了参数字符串。
    str.startsWith(参数):返回布尔值,参数是否在源字符串的头部。
    str.endsWith(参数): 返回布尔值,参数是否在源字符串的尾部。
打印中文的问题
    unicode
中文解析默认是utf-16
    0~65535
超过65535的汉字,中文和编码的读取方式
中文
    console.log('\u{21c56}');
打印该汉字对应的编码
    console.log(str1.codePointAt(0));

箭头函数:匿名函数的一种写法

    let fun = a => a * 2;   
    console.log(fun(20));
特点:
    1.如果只有一个参数,可以省略圆括号
    2.如果函数体只有一条语句,则可以省略花括号
    3.如果函数体只有一条语句,则自带return

解构赋值

1.解析结构进行赋值
    a.数组
    b.json对象
2.交换两个变量的值
    [a, b] = [b, a];
    console.log(a, b);

set集合

set:集合,没有下标,自动去重
let set = new Set(数组);
    add(参数) 向集合中添加一个元素
    delete(值) 删除集合中某个数
    has(值) 判断集合中是否含有某个值
    clear() 清空集合
数组去重
    let arr = [1,"heihei",1,2,2,3,4,4,5,5,1,"heihei"];
    let set = new Set(arr);
通过Array.from(集合):将集合转化为数组
    arr = Array.from(set);
    console.log(arr);

map

map:键值对的容器,映射
    key1=value1,key2=value2...
        set(key,value) 向集合中添加一个元素:key以存在,则为改,不存在则为增
        get(键)  根据键去取值
        delete(键) 删除集合中某个数
        has(键) 判断集合中是否含有某个值
        clear() 清空集合

ES6的字符串模板

''""不支持换行

反引号支持换行,常用于页面的拼接
被``包含的字符序列也是字符串
ES6字符串模板中出现变量必须用${变量}
    oUl.innerHTML += `<li>${i}</li>`

ES5新增的迭代函数

遍历分为两步
    1.循环
    2.循环中执行相应功能
数组迭代函数:帮我们把循环实现了,我们只需要写功能
forEach
    功能:遍历数组
    参数:arr.forEach(回调函数)
    回调函数: function 回调函数(元素的数值,[元素的下标],[数组名])
    返回值:无
map
    功能:遍历数组
    参数:arr.map(回调函数)
    回调函数: function 回调函数(元素的数值,[元素的下标],[数组名])
    返回值:在回调函数添加return,返回一个新数组
filter
    功能:过滤,根据回调函数返回的布尔值,决定元素是否被存入新的数组
    参数arr.filter(回调函数)
    回调函数: function 回调函数(元素的数值,[元素的下标],[数组名])
    返回值:根据回调函数返回的布尔值,决定元素是否被存入新的数组

匀速运动

运动原理:
    通过定时器改变元素的left或者top(width,heigth)
    1.先清空定时器,避免运动混乱 
        clearInterval(time);
    2.计算速度,叠加位移(宽高)
        let speed = target>obj.offsetLeft?5:-5;
        obj.style.left = obj.offsetLeft + speed + "px";
    3.达到条件终止定时器

缓冲运动

核心算法:
    let speed = (target - obj.offsetTop) / 10;
    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);