var數組
1.預解析(變量提高) 2.能夠重複聲明變量
let函數
1.不支持預解析(必須先聲明,後使用) 2.不支持重複聲明 3.支持塊級做用域
1.舉例說明—預解析this
console.log(a);//undefind var a=2; console.log(b);//報錯,b is not defined。 let b=3;
因爲var存在預解析,因此不會報錯。let不存在預解析
code
console.log(a);//undefind var a=2; // 以上代碼至關於: var a; console.log(a); a=2;
2.舉例說明—重複聲明變量對象
var a=1; var a=2; console.log(a);//2 let b=1; let b=2; console.log(b);//報錯,Identifier 'b' has already been declared。b已經被聲明瞭
3.舉例說明—塊級做用域作用域
{ var a=1; let b=2; console.log(b);//2 { console.log(b);//2 } } console.log(a);//1 console.log(b);//報錯,b is not defined
const 常量字符串
1.初始化以後,內部值不可改,必須初始化賦值的問題。 2.不支持預解析 3.不容許重複聲明 4.支持塊級做用域
const舉例說明:string
const a; console.log(a);//報錯,Missing initializer in const declaration。a沒有賦值。 const b=1; b=2; console.log(b);//報錯, Assignment to constant variable.不能改變常量的值
1.對於 對象 解構賦值,變量名要和鍵名相同,順序不重要,用{}括起來it
(1)變量聲明並賦值時的解構
io
var obj = { a: 1, b: 2, c: "lzf" }; var {a,c,b} = obj; console.log( a,b,c );//1 2 "lzf"
(2)變量聲明 後 賦值時的解構
var obj = { a: 1, b: 2, c: "lzf" }; var a,b,c; ({a,b,c}=obj); console.log(a,b,c);//1 2 "lzf"
2. 對於 數組 解構賦值,按數組順序賦值,變量名不重要,用[ ]括起來
var attr=["a","b","c"]; var [x,y,z]=attr; console.log(x,y,z);// "a","b","c"
3. 默認值配置
var attr=["a",,"c"]; var [x=1,y=2,z=3]=attr; console.log(x,y,z);//a 2 c
4.佔位
var attr=["a","b","c"]; var [x=1,,z=3]=attr; console.log(x,z);//a c
5.重命名
var obj = { a: 1, b: 2, c: "lzf" }; var {a:x,c,b} = obj; console.log( x,b,c );//1 2 "lzf"
6.重命名而且設默認值
var obj = { a: 1, b: 2, c: "lzf" }; var {a:x,c,b,d:z=3} = obj; console.log( x,b,c,z);//1 2 "lzf" 3
var a=1; var b=10; [b,a]=[a,b]; console.log(a,b);//10 1
箭頭函數: 函數的簡短寫法
變體方式 只有一個參數省略括號 只有一條語句省略大括號和return 返回對象 須要 用 () 包起來 注意 沒有arguments 不能夠做爲構造函數 this綁定
舉例一:將函數表達式用箭頭函數表示
let a=function () {}; a(); //將以上函數表達式 用箭頭函數 表示 let fn=()=>{}; fn();
舉例二:只有一個 參數 省略括號, 沒有參數或者1個以上參數都不能夠省略
let a=(num) => { console.log(num); }; a(1);//1 //只有一個參數省略括號 let fn=num=>console.log(num); fn(2);//2
舉例三:函數體僅有一條語句,而且有返回值 能夠省略 {} 和 return
let a=(a,b) => { return a+b; }; a(1,2);//3 //函數體僅有一條語句而且有返回值, 省略 { } 和 return let fn=(a,b) => a+b; fn(1,3);//4
注意:若是 返回的是一個對象 ,則須要 () 包起來
let a=userName=>{ return { name : userName } } console.log( a("lzf") );//{name: "lzf"} //---------- 若是 返回的是一個對象 ,則須要 () 包起來 ------------- let fn=userName=>({ name : userName }) console.log( fn("hzq") );//{name: "hzq"}
舉例四:沒有arguments
let a=function () { console.log( arguments ); }; a(1,2,3,4,5);// Arguments(5) [1, 2, 3, 4, 5, callee: ƒ, Symbol(Symbol.iterator): ƒ] let fn=()=>console.log( arguments ); fn(1,2,3,4,5);//報錯,arguments is not defined。
舉例五:不能夠做爲構造函數
let fn=(a,b)=>a+b; var f=new fn(); //報錯,fn is not a constructor.
舉例六:this綁定,箭頭函數在哪聲明的,this就指向哪
let fn = () => {console.log( this );}; fn();//Window document.onclick = fn;//Window document.onclick = function(){ setTimeout(function(){ console.log( this ); },500) }//Window // document.onclick = function(){ // setTimeout( () => { // console.log( this ); // },500) // }//#document
1.默認參數
let add = function( a,b,c=20 ) { return a + b + c; }; console.log( add( 1,2,3 ) );//6 console.log( add( 1,0,2 ) );//3 console.log( add( 20,10 ) );//50
2.剩餘參數
let a = function(x,y,...r){ console.log( x,y ); console.log( r ); } a("a","b","c","d"); //運行結果: //a b // ["c", "d"] let fn = (...arg)=>{ console.log( arg ) } fn( 1,2,3,4,5 )//[1,2,3,4,5] let fn1 = (...arg)=>{ console.log( ...arg ) } fn1( 1,2,3,4,5 )//1,2,3,4,5
把集合變成參數的形式 push 數組 合併數組 字符串轉換數組 類數組轉變爲數組 擴展對象的屬性 注意 若是被擴展的內容中存在項是對象,那麼被擴展後依然是地址引用
舉例說明一:
var arr1 = [1,2,3]; console.log( arr1 );// [1, 2, 3] console.log( ...arr1 );// 1 2 3 var arr2 = [1,2,31,231,23,12,3,123]; console.log( Math.max(2,10) ) ;//10 console.log( Math.max(...arr2) ) ;//231
舉例說明二:push 數組
var arr = [1,2,3]; var arr2 = [4,5,6]; arr.push( ...arr2 ); console.log( arr );[1, 2, 3, 4, 5, 6]
舉例說明三:合併數組
var arr = [1,2,3]; var arr2 = [4,5,6]; console.log( [ ...arr,...arr2 ] );// [1, 2, 3, 4, 5, 6]
舉例說明四:字符串轉換數組
var str = "miaov"; console.log( str.split("") );// ["m", "i", "a", "o", "v"] console.log( [...str] );// ["m", "i", "a", "o", "v"]
舉例說明五:擴展對象的屬性
注意:若是被擴展的內容中存在項是對象,那麼被擴展後依然是地址引用。
var obj = { arr : [1,2] } var c = { name : "k", ...obj } c.arr.push( 3 ); console.log( c );//{name: "k", arr: Array(3)} console.log( obj );//{arr: Array(3)}
解決地址引用的方法
var obj = { arr : [1,2], name: "k" } //經過 JSON轉化爲字符串,再轉化爲對象。 var c = JSON.parse( JSON.stringify( obj ) ); c.arr.push(3,4,5,); console.log( c );//{arr: Array(5), name: "k"} console.log( obj );//{arr: Array(2), name: "k"}
此方法存在問題:
var obj = { arr : [1,2], name: "k", fn: function(){}, a: undefined, b: NaN } var c = JSON.parse( JSON.stringify( obj ) ); c.arr.push(3,4,5); //c中缺乏 fn,a,b console.log( c );//{arr: Array(5), name: "k", b: null} console.log( obj );//{arr: Array(2), name: "k", fn: ƒ, a: undefined, b: NaN}