JS基礎入門篇(四十三)— ES6(一)

1.var , let , const

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.不能改變常量的值

2.解構賦值

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

3.解構賦值的應用,交換兩個變量的值

var a=1;
    var b=10;
    [b,a]=[a,b];
    console.log(a,b);//10 1

4.箭頭函數

箭頭函數: 函數的簡短寫法

變體方式
        只有一個參數省略括號
        只有一條語句省略大括號和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

5.函數參數

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

6.擴展運算符

把集合變成參數的形式
    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}
相關文章
相關標籤/搜索