####ES6
let const var 三者的区别
### 1. let const 不能重复声明变量
let a = 12 ; let a = 10 ; console.log( a ) 报错
var a = 10 ; var a = 6 ; console.log( a )--->a=6; 后者把前者覆盖了
const a = 10 ; const a = 4 ; console.log ( a ) 报错
#### 2.let const 块级作用域
if( true ) { let a = 10 ; console.log( a ) --->10成立} console.log( a )--->不成立 报错
if( true ) { const a = 10 ; console.log ( a ) --->10 成立} console.log( a ) --->不成立 报错
if (true ) { var a = 8 ; console.log( a ) --->8} console.log( a )--->8 成立
### 3.let const 不支持变量提升
console.log ( a ) let a = 10 ; a--->报错
console.log ( b ) const b = 12 ; b--->报错
console.log ( c ) var c = 13 ; c---->undefined
### 4. const 不能先声明,后变量
let a ; a = 10 ; console.log ( a ) ----->10 成立
const b ; b = 12 ; console.log ( b ) ---->报错 只能边声明 ,边变量
var c ; c = 13 ; console.log ( c ) --->13成立
###数组的解构
如 :1. 数组
var arr=[ " css "," js "," jq "," node.js "," react "] ;
var [ a , b , c , d , e ] = arr ;
console.log( a ) ;//--->css , console.log( b ) ;//--->js --------》数组的解构是根据数组的顺序进行解构
2. 多维数组
var arr = [ " aa" , " bb " , " cc " ,[ " dd '' , '' ee '' , [ '' ff '' , '' gg '' ] ] ];
var [ a , b , c , [d , e , [ f , g ] ] ] = arr ;
console.log( a ) ; //--->aa console.log( d ) ; //--->dd ; console.log( f ) ; //---->ff
###对象的解构
var obj = { id : 123 , tt : " 对象的解构 " , data : " 是根据属性名来解构的 " } ;
var { id , tt , data } = obj ;
console.log( id ) ; //---->123 依次类推
###模板自符串
var str = ` hello world ` ; console.log ( str ) ; //--->反引号
var c = " 1904A " , k = " react " ; var con = "hello 欢迎来到 "+ c +" 班 , 我们正在学 " + k ; console.log ( con ) ; //--->hello 欢迎来到1904A班 , 我们正在学 react ;
var con1 =` hello 欢迎来到 ${ c } 班 , 我们正在学 ${ k } `; console.log ( con1 ) ; //---->跟上面输出的结果是一样的的;
用反引号时 ` ` , es6添加的写法 ${ 内容 } ;
### 数组新增的方法
### 1. find( ) ---->查找符合条件的方法,找到满足条件的第一条后,停止查找 ,后面的条件不再去查找
var obj = [ { id : 1 , title : " 张三 " , age : 19 } , { id : 2 , title : " 李四 " , age : 25 } , { id : 3 , title : " 王麻子 " , age : 26 } ] ;
var arr = obj . find ( function ( value , index , array ) { return value . age >25 } ) ; -------》value :是当前的元素的每一项 index : 是当前每一项元素的索引值,也就是下标 array : 是当前数组的本身 他们也可以简写 v , i , a
console.log ( arr ) ; //--->输出结果{ id : 3 , title : " 王麻子 " , age : 26 }
### 2. findIndex () --->跟find() 方法差不多的效果,只不过他输出的结果是当前元素的下标
引用find() 方法中的例子 var obj ;
var arr1 = obj . findIndex ( function ( v , i , a ) { return age >25 } ) ;
console.log ( arr1 ) ; //---->输出的结果是 2
### 3. includes() --->表示当前数组中是否含有该元素, 有的话返回true , 否的话 返回 false ;
var arr2 = [ "aa " , " bb " , " cc " , " dd " ] ;
var acc = arr2 . includes ( " aa " ) ;
console.logg( acc ) ; //---> 输入结果,有的话输出true, 没有的话输出 false ;
### 4. forEach( ) 数组遍历
引用find()方法中的例子 var obj ;
var arr3 = obj . forEach ( function ( v , i , a ) { console.log( v ) } ) ; //--->输出每一项的元素
### 5. filter ( ) 过滤数组 , 返回值的是满足条件的新的数组
引用find()方法中的例子
var arr4 = obj . filter ( function ( v , i , a ) { return v . age > 20 } ) ;
console.log ( arr4 ) ; // --->输出结果是 age为大于20的25,26 一个新的数组 ;
### 6. map( ) 把原数组的数据修改后,返回一个新的数组
引用find ( ) 方法中的例子
var arr5 = obj . map ( function ( v , i , a ) { var p = v . age + 10 ; v . age = p ; return v ; } ) ;
console.log( arr5 ) ; //--->输出的结果为obj中的所有的age都加了个10 ;
### 7. every ( ) 必须满足所有的条件,才能执行,返回true , 要是有一个条件不满足,就返回一个false
引用find()方法中的例子
var arr6 = obj .every ( function( v , i , a ) { return v . age > 20 } ) ;
console.log ( arr6 ) ; //----> 输出结果为false , 第一个条件没有满足
### 8. some( ) 只要满足一个条件,就会返回一个true , 只有所有的条件都不满足,才会返回一个false
引用find( )方法中的例子
var arr7 = obj . some ( function ( v , i , a ){ return v . age > 25 } ) ;
console.log( arr7 ) ; //---->输出结果为true
### 9. 浅复制 ---->原来的数据会随着修改的数据一起改变
var arr8 = [ " a " , " b " , " c " ] ; var a = [ . . . arr8 ] ; console.log ( a ) ; //---> a = [ " a " , " b " , " c " ]
let aa = arr8 ; aa[ 0 ] = 100 ; console.log ( aa ) ;//---> aa = [ " 100 " , " b " , " c " ]
### 10. 深度复制 ---->原来的数据不会随着修改后的数据一起改变
引用 浅复制 中的 arr8
var cc = JSON .parse ( JSON . stringity ( arr8 ) ) ;
console.log ( cc ) ; //---->cc = [ " a " , " b " , " c " ]
### 函数的扩展
### 1. 参数的默认值
function add ( a ) { return a } ; var ad = add ( ) ; console.log( ad ) ; //---> 当不给函数里面传递实参的时候, 调用函数显示 undefined
function add ( a = 10 ) { return a } ; var ad = add ( a ) ; console.log ( ad ) ; //--->当不给函数里面传递实参的时候, 调用函数显示10
function add ( a = 10 ) { return a } ; var ad = add ( 2 ) ; console.log ( ad ) ; //---> 2 当给函数传入实参的时候显示实参,如果没有传入实参,就显示形参的默认值
### 2. 多余的参数
function add ( a , b ) {
console.log ( a ) ; //--->2
console.log ( b ) ; //--->4
console.log ( c ) ; //--->6
} ;
add ( 2 , 4 , 6 , 8 ) ;//--->多出来了一个实参8
function add1 ( a , b , ...c ) {
console.log( a ) ; //--->1
console.log( b ) ; //--->2
console.log ( c ) ;//--->[ 3 , 4 , 5 , 6 ] 以数组形式储存
}
add1 ( 1 , 2 , 3 , 4 , 5 , 6 ) ;
### 箭头函数
箭头函数的写法
###当没有参数时
( ) = > { } < ========= >function ( ) { }
###当有一个参数,并且有一个返回值时
var ff = a = > a < ======== > var ff = function ( a ) { return a }
###当有多个参数的时候
var ff = ( a , b ) = > { return a + b ; } ==> console.log ( ff ( 1 , 2 ) ) ; < ====== > var ff = function ( a , b ) { return a + b } ;
###特点 :1. 在箭头函数中没有arguments 对象
2. 不可以在构造函数中使用
3. this的指向问题 ,箭头函数指向定义时的对象 ,而function函数指向调用使用它的对象
如:1. var obj = {
title : " 李四 " ,
data : " hello " ,
fn : function () {
console.log ( this .title ) ;//---->李四
console.log ( this ) ; //--->指向当前的函数obj
}
}
obj . fn ( ) ; //---->李四
2. var obj1 = { title : " hello world " } ;
var obj2 = {
title : " 你好 " ,
fn : function ( a , b ) { //-------->可以直接写成是箭头函数,就可以直接改变this的指向了 ( ) = > { }
console.log( this .title );
console.log ( a ) ;
console.log ( b ) ;
}
}
obj2 . fn ( ) ; //---->你好 this的指向是当前使用它的对象obj2
obj2 . fn . call ( obj1 , 1 , 2 ) ; //--->hello world a : 1 b : 2 this的指向是obj1
obj2 .fn . apply ( obj1 , [ 1 , 2 ] ) ; //--->hello world a : 1 b : 2 this的指向是obj1
obj2 . fn = obj2 . fn .bind ( obj1 ) ;
obj2 . fn ( ) ; //--->hello world this的指向是obj1
### 改变this的指向有 箭头函数 、call 、 apply、bind
call和apply的区别 :
call 后面的参数随便写 ,apply 后面是数组
###注:定时器里的函数this的指向是window
###对象的扩展
### 1. 属性的简洁表示法
var id = 123 , title = " hello world " ;
var obj = { id , title } ;
console.log ( obj ) ; //---->obj = { id : 123 , title : "hello world " }
### 2. 方法名也可以简写
var obj = {
id : 123 ,
id1 : 456 ,
title : " hello world " ,
[ " title " + 1 ] : " 这是多种写法 " ,
code ( ) { // ======= > code : function ( ) { }
console.log ( this .id ) ;
}
}
obj . code ( ) ; //----> 123
console.log ( obj [ " id " + 1 ] ) ; //---> 456
console .log ( obj . title1 ) ; //---->输出结果 这是多种写法
var t = " title1" ; //--->将obj.title1 赋值给了 t
console.log ( obj [ t ] ) ; //---> 输出结果 这是多种写法
###对象的新方法 Object . assign ( ) 用于将源对象的所有属性复制到目标对象中
var a = Object . assign ( { } , { id : 1 , title : " one " } , { id : 2 , title : " two " , data : " hello " } ) ;
//--------------------第一个空对象是 :目标对象 第二个和第三个是 :源对象
//------------------ 源对象先进行合并 , 相同的属性后者覆盖前者 ,不同的属性添加 ,最后在跟目标对象合并(复制)
console.log ( a ) ; // --->{ id : 2 , title : " two " , data : " hello " }
### Es6新增的数据结构 map set
### set 对象允许你有储存任何类型的唯一值,无论是原始值或是对象引用
如 : var arr = [ " aa " , " bb " , " cc " ] ;
var myset = new Set ( arr ) ; //---->将数组转换为set形式的对象
myset .add ( " dd " ) ;
var str = [ ... myset ] ; //--->将对象形式的set在转换为数组
console.log ( str ) ; //--->[ " aa " , " bb " , " cc " , " dd " ]
还有 delete ( ) 删除 clear( ) 清空 has ( ) 有true,否false size 是他的长度
### map 对象跟set的方法都差不多
get ( ) set ( ) clear ( ) delete ( ) size has ( )
var obj = { id : 1 , title : " hello " } //======>有键值对 id , title 是键(key) ; 1 , hello 是指(value)
### promise 对象
promise对象:是异步变成的一种解决方案
特点: 1. 一旦改变 , 不会再变 ;
2. 不会受到外部因素影响 ;
缺点 : 1. 一旦创建 ,立即执行 , 不可以取消 ;
2. 不给加回调函数 , 内部执行结果 ,不会返回到外部 ;
3. 如果执行回调函数 , 那么promise 已经完成 , 对上下文不太友好 ;
promise的常用方法:1. then( )调用resolve方法时 , 获取成功之后的数据 ;
2. catch( )调用reject方法时 , 获取势失败后的数据 ;
3. all( )调用几个promise回调成功之后的统一处理 ;