ES6的常用特性
新增const和let声明变量
var x = '全局变量';
{
let x = '局部变量';
console.log(x); // 局部变量
}
console.log(x); // 全局变量
let表示声明变量,而const表示声明常量,两者都为块级作用域;const声明的变量都会被认为是常量,意思就是它的值被设置完成后就不再修改了
如果const的是一个对象,对象所包含的值是可以被修改的,就是对象所指向的地址没有改变就行
const a = 1
a = 0 //报错
const student = {name:'cc'}
student.name = 'yy';//不报错
student = {name;'yy'};//报错
let关键词声明的变量不具备变量提升(hoisting)特性
let和const声明变量只在最近的一个块中(花括号)有效
当使用常量const声明时,请使用大写变量
const在声明时必须被赋值
模板字符串
ES6中字符串拼接,用${字符串}来拼接
`这是文本:${字符串}`//反引号是tab键上面那个符号
箭头函数(Arrow functions)
ES6中,箭头函数是函数的一种简写形式,使用括号,包裹参数,跟随一个=>,然后写函数体就可以了。
箭头函数的是三个特点:
不需要function关键字来创建函数
省略return关键字
继承当前上下文中的this关键字
// ES5
var add = function (a, b) {
return a + b;
};
// 使用箭头函数
var add = (a, b) => a + b;
// ES5
[1,2,3].map((function(x){
return x + 1;
}).bind(this));
// 使用箭头函数
[1,2,3].map(x => x + 1);
当函数只有一个参数时,可以省略掉括号;当函数返回只有一个表达是的时候可以省略{}和return;
面向对象介绍
面向过程编程POP
面向过程就是分析出解决问题所需要的步骤,然后用函数吧这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了,就是按照我们分析好了的步骤,按照步骤写解决问题。
面向对象的特性:
1.封装性 2.继承性 3.多态性
创建类
class name {
class body
}
创建实例
var xx = new name();
注意:类必须使用new实例化对象
只要new就会调用constructor里面的代码
类里面所有函数不需要写function
多个方法之间不需要添加逗号分隔
extends 继承
继承中的属性或方法查找原则:就近原则(如果子类有就执行子类的这个方法,如果子类没有就去父类中查找)。
ES6里面的注意点
1.在ES6中类没有变量提升,所以必须先定义类,才能通过类实例化对象
2.类里面的共有属性会让方法一定要加this使用
3.类里面的this指向问题:
constructor里面的this指向实例对象,方法类里面的this指向这个方法的调用者,constructor里面调用方法时,要点击过后再执行方法时, 函数名后面不要加小括号(),不然会直接执行方法
动态添加元素高级
insertAdjacentHTML('beforeend',li):
四个值
- beforeBegin: 插入到标签开始前
- afterBegin:插入到标签开始标记之后
- beforeEnd:插入到标签结束标记前
- afterEnd:插入到标签结束标记后 li里面可以是可以创建字符串:
var li = '<li class = "liactive"><span>新选项卡</span><span class = "iconfont iconfont-guanbi"></span></li>'
双击事件:ondblclick
双击阻止选中文字:
window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
构造函数对象
- 实例成员就是构造函数内部通过this添加的成员如:uname,age,实例成员只能通过实例化的对象new来访问:
const p = new Star(18//实参 );
console.log(p.age//形参);
console.log(Star.uname)//不可以通过构造函数来访问实例成员
- 静态成员在构造函数中本身上添加的成员,如Star.sex=‘男’;静态成员只能通过构造函数来访问:console.log(Star.sex);
构造函数可以通过原型对象来添加方法
prototype是原型对象;
Star.prototype.sing = function() {}
//构造了一个原型对象
对象里系统自己添加了一个__proto__指向我们构造的函数的原型对象prototype,所以我们可以使用原型对象的属性和方法
方法的查找规则:
- 首先看实例化的对象是否有我们调用的这个方法,如果又就执行这个对象上的方法;
- 如果没有我们调用的这个方法,因为有__proto__的存在,就去构造函数原型对象prototype身上查找这个方法
对象原型__proto__)和构造函数(prototype)原型对象里面都有一个属性constructor属性,constructor我们称为构造函数,因为它指回构造函数本身
constructor指回构造函数:
如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,就会覆盖掉Star的构造函数,必须手动的利用constructor指回原来的构造函数
Star.prototype = {
constructor: Star,
sing:function() {},
movie:function() {}
}
谁调用this指向谁
function Star(uname, age) {
this.uname = uname;
this.age = age;
}
var that;
Star.prototype.sing = function () {
console.log('我要唱歌')
that = this;
}
var ldh = new Star('刘德华', 18);
//1.在构造函数中,里面的this指向的是对象实例ldh
ldh.sing();
console.log(that == ldh);//ture
//2.原型对象函数里面的this指向实例对象ldh
原型链
继承
call():调用这个函数,并且修改函数运行时的this指向
fun.call(thisArg,arg1,arg2,....)
//thisArg:当前调用函数this的指向对象(改变后的那个指向)
//arg1,arg2:传递的其他参数
function fn() {
console.log('唱歌');
cosole.log(this);//window
}
var o = {
name:'andy'
}
//1. call()可以调用函数
fn.call();//唱歌
//2. call()可以改变这个函数的this指向,此时这个函数的this,就指向o这个对象
fn.call(o,1,2)
ES5中新增方法
数组方法
www.w3school.com.cn/js/js_array…
字符串方法
trim()方法会从一个字符串的两端删除空白字符。
str.trim()方法并不影响字符串本身,它返回的是一个新的字符串。
表单提交单元格,可以检测用户输入空格
<input type="text"><button>提交</button>
<div></div>
<script>
var input = document.querySfelector('input');
var btn = document.querySelector('button');
var div = document.querySelector('div');
btn.onclick = function() {
var str = input.value.trim();//用str替代后面这一长串
if(str === ''){
//用trim()防止用户输入空格时,不弹出’请输入内容‘,也防止输入空格后length增加
alert('请输入内容');
}
else{
div.innerHTML = str://把输入的内容渲染到div里面
}
}
</script>
对象方法
Object.defineProperty()定义对象中新属性或修改原有的属性。
var obj = {
name:andy,
age:18
}
Object.defineProperty(obj,prop,descriptor)
// obj:必需,目标对象
// prop:必需,需定义或修改的属性的名字--age
// descriptor:必需,目标属性所拥有的特性
第三个参数descriptor说明:以对象形式{}书写
- value:设置属性的值默认为undefined,如有prop这个值就修改,如果没有就添加一个prop的值
- writable:值是否可以重写,true|false 默认为true
- enumerable:目标属性是否被枚举,true|false 默认为true,如果是false遍历的时候就拿不到这个值
- configurable:目标属性是否可以被删除或是否可以再次修改特性true|false 默认为true
函数进阶
函数的定义方法
- 自定义函数(命名函数)
- 函数表达式(匿名函数)var fun = function() {};
- 利用new Function('参数1','参数2',...,'函数体');
- 所有函数都是Function的实例(对象);
- 函数也属于对象;
函数的调用方式
//1.普通函数
function fn() {alert('1');}
//fn(); fn.call();
//2.对象的方法
var o = {
sayHi:function() {alert('1');}
}
o.sayHi();
//3.构造函数
function Star() {};
new Star();
//4.绑定事件函数
btn.onclick = function() {}//点击了按钮就可以调用这个函数
//5.定时器函数
setInterval(function() {},1000);定时器自动一秒钟调用一次函数
//6.立即执行函数
(function() {alert('1')};)();立即执行函数是自动调用
函数内this的指向
改变函数内部this指向
- call方法
call方法可以调用一个对象,也可以改变函数的this指向。
fun.call(thisArg,arg1,arg2,...);
//thisArg是指向向谁,可以是自己(函数调用者)比如this,也可以是其他,比如对象p.
- apply方法
apply()方法调用一个函数,简单理解为调用函数的方法,但是它可以改变函数的this指向。
fun.apply(thisArg,[argsArray]);
//thisArg:在fun函数运行时指定的this值
//argsArray:传递的值,必须包含在数组(伪数组)里面
//返回值是函数的返回值,因为它就是调用函数
- bind方法
bing()方法不会调用函数,但是能改变函数内部的this指向
fun.bind(thisArg,arg1,arg2,...);
//thisArg:在fun函数运行时指定的this值
//arg1,arg2:传递的其他参数
//返回由指定的this值和初始化参数改造的原函数拷贝
//如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind
高阶函数
高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出
闭包
闭包是一个函数(一个作用越可以访问另外一个函数的局部变量)
闭包的作用就是延伸变量的作用范围
立即执行函数也称为小闭包,因为立即执行函数里面的任何一个函数都可以使用它的变量
递归
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
递归里面必须加return退出条件
- 浅拷贝只是拷贝一层,更深层次对象级别的值拷贝引用的地址
Object.assign(target,...sources)es6新增方法可以浅拷贝
//target拷贝给谁,sources拷贝对象
Object.assign(o,obj);//拷贝obj给o
- 深拷贝拷贝多层,每一级别的数据都会拷贝
正则表达式
正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式,在技术中,正则表达式也是对象。
创建正则表达式:
1.通过RegExp对象的构造函数创建
var 变量名 = new RegExp(/表达式/);
2.通过字面量创建
var 变量名 = /表达式/;
var rg = /abc/;
// /abc/只要包含abc这个字符串返回的都是true
test()正则对象方法,由于检测字符串是否符合该规则,该对象会返回true和false,其参数是测试字符串。
正则表达式里面不需要加引号,不管是数字型还是字符串型
正则特殊字符
一、 边界服
正则表达式中的边界符(位置符)用来提示字符所在的位置,主要有两个
1.^:表示匹配行首的文本(以谁开始)
2.$:表示匹配行尾的文本(以谁开始)
如果^和$在一起,表示必须是精确匹配
二、 字符类:[]表示有一系列字符可供选择,只要匹配其中一个就可以了
var rg = /[abc]/;//只要输入的内容包含a或者包含有b或者包含有c都返回为true
var teg = /^[abc]$/;//三选一,只有是a、b、c这三个字母才返回true
正则里面的(或者)符号:|符号表示或者用一条竖线表示
范围符:-符号表示范围,如a-z表示英文小写字母从a到z
字符组合:
var reg = /^[a-zA-Z0-9]$/;
//26个英文字母(大小写都可以)和数字0-9任意一个字母返回true
//如果中括号[]里面有^表示取反(就是不包含中括号里的内容都为true),千万别和边界符混淆
var reg1 = /^(abc){3}$/;
//只有当输入为abcabcabc才为true
量词符:
在线测试工具:c.runoob.com/
预定义类:
replace替换
replace()方法可以实现替换字符串的操作,用来替换的参数可以是一个字符串或是一个正则表达式。
replace(参数1,参数2);
第一个参数:被替换的字符串或者正则表达式
第二个参数:替换为字符串
返回值是一个替换完毕的新字符串,只能替换掉第一个满足条件的字符串
正则表达式参数
var rg = /表达式/[switch]
switch(也称修饰符)按照上面样的模式来匹配,有三种值:
1. g:全局匹配
2. i:忽略大小写
3. gi: 全局匹配+忽略大小写