ES5或ES6 上
ES(ESMA SCRIPT) 常见的版本ES3(最基础的版本 所有的浏览器都能解析) ES5(部分低版本浏览器不能解析) ES6(大部分的不能直接解析)
ES5
es5的增强内容
严格模式(es5新增的一个模式)
1.变量命名必须要有修饰符
2.函数内部this不能指向window
3.函数内部arguments与形参不同步
4.禁止在非函数代码块内声明函数
5.禁止八进制
6). eval函数作用域
7). delete 删除window的属性报错
1.声明变量使用关键字(var let const)
"use strict"
myname = "刘德华";//
cosole.log(myname)
2.禁止函数内的this指向全局对象window
"use strict"
function fn(){
console.log(this) //underfined
}
fn()
3.arguments与形参不同步(不一致)
"use strict"
function fn(n){
console.log(n) //100
n = 200
console.log(argumnets) //100 arguments与形参不同步(不一致)
console.log(n)//200
}
fn(100)
4.禁止使用八进制(不要写0开头的数字)
"use strict";
var a=099;
console.log(a);
//Uncaught SyntaxError: Decimals with leading zeros are not allowed in strict mode.
5.不允许在非函数的代码块内声明函数
"use strict"
if(true){
function fn(){
alert(123)
}
}
fn() //Uncaught ReferenceError: fn is not defined
6.eval函数作用域
eval()函数的作用 把字符串解析成js代码 == JSON.parse 可以利用它实现转JSON
var n = 10;
eval(' "use strict"; var n = 20; console.log(n);')//20
cosole.log(n) //10
7.delete 关键字报错
"use strict"
var a = 100
console.log(window.a)
delete window.a//Uncaught TypeError: Cannot delete property 'a' of #<Window>
console.log(window.a)//没有被删除,还会报错
使用"use strict" 他又分为全局严格和局部严格
这句话必须放在代码第一行
- 全局严格
"use strict" //全局严格模式
function fn(){
console.log(this) //undefined
}
fn()
function fn2(){
console.log(this) //undefined
}
fn2()
- 局部严格
function fn(){
"use strict"//局部严格
console.log(this) //undefined
}
fn()
function fn2(){
console.log(this) //window
}
fn2()
数组加强
indexOf 根据对应的内容找下标 找不到返回-1
lastindexOf
高阶函数
forEach 遍历(遍历每个结果做相关操作)
map 遍历 return(遍历每个结果做相关操作 返回一个新的数组)
some 有符合的内容返回Boolean
every 所有都符合 返回Boolean
rudece reduceRight 计算(遍历每个值 做相关计算 返回结果)
第一个参数是一个函数,函数内部有pre cur index arr 根据函数内部的return返回指定结果
第二个参数是pre的初始值
filter 过滤 (遍历每个结果找到返回条件的结果 返回数组)
- bind是用于改变函数内部this的指向 不会立即执行
- call 是用于改变函数内部this的指向 会立即执行当前参数 它有多个参数(推荐使用,具体效率高于apply)
- apply 是用于改变函数内部this的指向 会立即执行当前参数 第二个参数是数组
bind绑定this指向
var obj = {
name:'jack'
}
//属于window
var name = "tom"
function hi(){
//this指向window
console.log(this.name)
}
hi() //打印tom
//bind方法 属于object的方法
//把hi绑定给obj hi里面的this指向对应的obj
var bindFn = hi(obj)
//bind 的返回值也是一个对象
hi()//打印jack
只改变函数内部的this指向 不会执行该函数
var person = {
name: "刘德华"
}
function fn(a, b, c) {
console.log(this)//函数内部的this指向window
console.log(this.name)
console.log(a, b, c)
}
fn.bind(person, "你好", "你们好", '大家好')() //不会自动执行 需要加小括号
apply call方法
var obj = {
name: 'jack'
}
var name = "tom"
function fn() {
console.log(this.name)
}
fn()
//绑定this指向 自动执行方法 第一个参数指定的this指向 第二个参数为函数需要的参数 传递的参数为数组
fn.apply(obj,null)//可以添加第二个参数 fn.apply(obj,[name,age]) 在fn()要写相应的参数以及要打印
//第一个参数指定的this指向 第二个参数为函数需要的参数 传递的参数为一个个元素
fn.call(obj,null) //例如fn.call(obj,name,age)
function fn(a,b) {
console.log(this);//window
console.log(this.name);
console.log(a,b);//
}
fn.call(person,"你好call","2222")
fn.apply(person,["你好apply","2222"])
**setInterval 和setTimeout 默认情况下,内部函数的this指向window
- 函数内部的this,默认是window
- 事件绑定函数,内部的this,默认是事件的绑定者
- 对象内部函数里头的this,指向当前的对象
- 定时器,延时器里的this,默认始终是window
- bind,call,apply会改变this指向
- 严格模式下,函数内部的this,指向undefined
- 箭头函数内部的this,指向上下文对象(环境变量)
- new会改变构造函数内部this的指向
ES6
es6 对于函数对象和string 数组做了加强
命名修饰符
1).let块级作用域
- 相同的变量名称,只能被声明一次
let myname="刘德华";
let myname="周杰伦"; //相同的变量名称,只能被声明一次
// Uncaught SyntaxError: Identifier 'myname' has already been declared
- 如果在代码块内声明的变量,只能在代码块内使用
{
let myname = "刘德华";
}
console.log(myname);//Uncaught ReferenceError: myname is not defined
- 防止变量的提升(预编译)
function fn() {
console.log(myname) //Cannot access 'myname' before initialization
let myname = "蔡徐坤";
console.log(myname);
}
fn();
- 使用let解决下标问题
var oBtns = document.querySelectorAll("button");// 5
for (let i = 0; i < oBtns.length; i++) {//用var打印全是5 用let会顺序打印
oBtns[i].onclick = function () {
console.log(i); //下标解决了
}
}
2).const 常量 (块状作用域) 定义建议写大小写
修饰常量,常量是不可变的,不允许二次赋值 定义的时候必须要赋值 生命的也是一个快状作用域
-
如果声明的变量的值是值类型,不可以被修改
-
如果生命的变量的值是引用类,可以修改值,不能修改类型
值类型
const COOLMAN = "老罗"; COOLMAN = "谭杨帆" //常量 不可以修改 console.log(COOLMAN) //Uncaught TypeError: Assignment to constant variable.
引用类型
const COOLMAN = { name:'换', sex:'男', age:'18' } COOLMAN.name = "胡安" console.log(COOLMAN) //胡安 类型没有被改变,对象的属性或者方法可以被修改
const 与let的相同点
可以避免变量的提升
也具备块级作用域
同一个变量只能声明一次
2.ES6-String新增方法
2.1 字符串的方法
includes(): 返回布尔值,表示是否找到了参数字符串
var str = "abc123"
console.log(str.indeOf("c") !=-1)//true
console.log(str.includes('c'))//true
startsWith(): 返回布尔值,表示参数字符串是否在源字符串的头部
var str = "abc123"
console.log(str.startsWith("a"));//true
endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
var str = "abc123";
console.log(str.endsWith("3"));
repeat(): 返回一个新字符串,表示将原字符串重复n次.
var str = "我爱你!";
console.log(str.repeat(100)); // 100次
2.2 字符串模板
var chars="不"
var str=`今天天气很${chars}好!`;
console.log(str);// 今天天气很不好!
3.ES6-Array新增
3.1 Array.from() 把伪数组转换为数组
第一个参数 伪数组
第二个参数 是一个回调函数,该回调函数内部写逻辑并且返回内容
var arg = {
0:100,
1:200,
2:300,
"a":99,
length:3
}
var arr = Array.from(arg,function(item){
console.log(item)
return item*10
})
console.log(arr) //[10000,20000,30000]
3.2 Array.of()把一组值转换成数组
var arr = Array.of(1, 3, 5, 7, 9);
console.log(arr);
3.3 find 根据条件,返回值
var oList = [
{id:1,name:'一',age:20},
{id:2,name:'ff',age:22},
{id:3,name:'we',age:24},
{id:4,name:'rg',age:26},
]
var strName = "f"
var person = oList.find(function(item){
return item.name.includes(strName)
})
console.log(person) //会返回符合条件的值
3.4 findIndex 根据条件,返回值的下标
var oList = [
{id:1,name:'一',age:20},
{id:2,name:'ff',age:22},
{id:3,name:'we',age:24},
{id:4,name:'rg',age:26},
]
var strName = "f"
//var person = oList.findIndex(function(item){
// return item.name.includes(strName)
//})
//console.log(person) //1
var index = oList.findIndex(function (item) {
return item.name.includes(strName)
})
oList.splice(index, 1);
console.log(oList); //删除
4. ES6-Function新增
4.1 函数的默认参数
function fn(name = 'qian'){
document.write(`hello${name}`) //注意括号
}
4.2 箭头函数(重点)
箭头函数,又叫做 拉姆达表达式 Lambda,是函数的语法糖,箭头函数一定是一个匿名函数
1.1计算2个数的和 普通函数
function cale(a,b){
return a + b
}
var res=cale(10,20)
console.log(res)
1.1计算2个数的和 箭头函数
var calc = (a,b)=>{
return a+b
}
var res=cale(10,20)
console.log(res)
2.1将一个数放大10被的普通函数
function show(n) {
return n * 10
}
2.2将一个数放大10被的箭头函数
var show = n => n * 10;
3.1返回一个对象的普通函数
function set(name){
var obj = {}
obj.name = name
return obj
}
3.2 返回一个对象的箭头函数
var set = name =>({name})
console.log(set("abc))
4.箭头函数常见写法
var arr = [1,2,3,4,5]
//升序
arr.sort((a,b)=>a-b)
arr.sort((a, b) => b - a);
// 每个数放大10被
arr.map(item => item * 10);
5.箭头函数的this指向(重点)
箭头函数内部的this,默认是根据函数所在的运行函数(上下文对象) , 在window下,this指向window
在定时器和延时器里,默认是window
在事件里,默认也是window
箭头函数的特性
当前只有一个参数 可以省略()
'当前只有一行代码 可以省略()
当前如果只有一行代码 需要返回值 可以省略()
箭头函数里面没有this
箭头函数没有arguments
总结:箭头函数里面的this指向父元素的this
注意:
- 箭头函数内部的this指向,不会被bind,call和apply改变
- 箭头函数,不能被new实例化
var Person = {
name:'刘德华',
showA:function (){
//console.log(this) //Person 对象里的普通方法的this,指向当前对象
var fn = ()=>{
console.log(this) //Person 箭头函数的this,指向上下文对象(环境变量)
}
fn()
},
showB:()=>{
//console.log(this) //window,对象里的箭头函数的this,默认是window
var fn = ()=>{
console.log(this);//window 箭头函数的this
}
fn()
}
}
Person.showA()
Person.showB()
person.showB.bind(Person)()//箭头函数内部的this指向,不会被bind,call,apply改变
循环的增强
for in 循环(对象)
for of 循环(数组)
//for in 遍历对象
//for of 遍历数组
var obj = {
name:"jack"
age:"18"
}
var arr = [1,2,3,4]
//for in
for(var i in obj){//对于对象遍历获取的是key
console.log(i) //获取key
console.log(obj[i]) //获取的是value
}
for(var i in arr){ //对于数组遍历拿到是下标(存在一定的问题,不建议使用)
console.log(i,arr[i])
}
//for of 遍历数组的
for(var item of arr){//遍历的是值
console.log(item)
}
//对于没有迭代器的对象是不能使用for of来遍历的 迭代器(用于迭代的对象)
//属于对象的方法 Object
//entries() 获取每个元素 包含键和值 keys() 获取所有的键 values()获取所有的值
for(var item of Object.keys(obj)){ //迭代对象
console.log(item)
}
for(var item of Object.values(obj)){ //迭代对象
console.log(item)
}
for(var item of Object.entries(obj)){ //迭代对象 entries 返回一个二维数组
console.log(item)
}
object的方法
keys 获取对象的所有的key
values 获取对象的所有的values
entries 获取对象的所有的键值对象(数组)
function 加强
对应默认参数 (支持没传值的时候 有一个默认值)
//后续在封装函数的时候 一定要用到
function sayHi(name = 'hello',age= '19'){
console.log(name)
console.log(age)
}
//如果你没有传值他也会有个默认值
sayHi() //hello 19
//如果你传值的就会将默认值替换
sayHi('jack') //jack 19
sayHi('jack',20) //jack 20
扩展运算符 *
打开对应的数组…
…[a,b,c] ===> a b c
解构(对象)
打开对应的对象(解除构造)提取到里面的值
//对象里面存在n个键值对象
var obj = {
name:'jack',
age:18
}
console.log(obj.name)
console.log(obj.age)
//es6新增了对应的解构 减少对应的obj
var {name,age,sex} = obj //称为解构
//得到对应的name 去对比obj里面是否存在相同1的一个属性名叫name 如果没有返回undefined 有就返回这个对应的值
console.log(obj.name) //jack
console.log(obj.age) // 18
console.log(obj,sex) //undefined
var {message} = {
message:'hello'
message:'world'
}
console.log(message)//hello