亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

JavaScript深入淺出

Bosn 資深架構師
難度中級
時長 5小時28分
學習人數
綜合評分9.60
493人評價 查看評價
9.8 內容實用
9.5 簡潔易懂
9.5 邏輯清晰
  • //對于稀疏數組,一般并不含有從0開始的連續索引,一般的length這個屬性值比實際的元素個數多

    undefined

    var arr1 = [undefined];

    undefined

    var arr2 = new Array(1);

    undefined

    0 in arr1

    true

    0 in arr2

    false

    1 in arr2

    false

    arr2

    [empty]length: 1__proto__: Array(0)

    var arr2 = new Array(3,2)

    undefined

    arr2

    (2) [3, 2]

    0 in arr2

    true

    //上面發現一個很奇怪的現象,其實你在用new創建數組的時候,如果你只輸入一個數字,那么這個時候就會默認這個數字是你的數組長度,但是如果你輸入了一大堆的東西就會認為是一個數組里面的元素

    undefined

    //當然上面不是我們關注的重點,重點是我們如果只創建的話其實沒有任何默認的賦值,甚至是undefined都沒有,而只是單純的申請了一點點的空間,所以用in方法的時候顯示false

    undefined

    var arr3 = [1,2,3];

    undefined

    arr3.length = 100

    100

    arr[99] = 1;

    VM8114:1 Uncaught ReferenceError: arr is not defined

    ? ? at <anonymous>:1:1

    (anonymous) @ VM8114:1

    arr3[99] = 1;

    1

    99 in arr3

    true

    98 in arr3

    false

    //上面給99賦值了所以有in,98沒有

    查看全部
  • //上面記錄的時候有點沒有頭腦,下面在記錄的時候一定要分清楚先后的順序,最好每個章節一起學習,并且要及時的復習

    undefined

    //這一章要學習數組,在JavaScript中的數組首先是一個“弱類型”的數組,就是說你可以在其中定義很多的東西,不一定非要是數字類型

    undefined

    var arr = [1,null,true,undefined,[1,1,2]];

    undefined

    //里面也可以定義對象,

    undefined

    //一、創建數組

    undefined

    //就像上面直接創建

    undefined

    var a = [,,];

    undefined

    //上面的方法不建議,創建了“兩個”undefined,數組創建的長度是從0~2的23次方

    undefined

    //2、還可以用object的方法創建

    undefined

    var arr = new Array(100,false);//可以在里面直接加

    undefined

    arr

    (2) [100, false]

    delete arr[0]

    true

    //但是刪除之后,長度是不變的,只是刪除的地方變成了undefined

    undefined

    //push方法

    undefined

    var arr[];

    VM2648:1 Uncaught SyntaxError: Unexpected token '['

    var arr = [];

    undefined

    arr.[0] = 1

    VM2722:1 Uncaught SyntaxError: Unexpected token '['

    arr[0]= 1

    1

    arr.push(1)

    2

    //unshift方法

    undefined

    //unshift實在數組的頭部添加元素

    undefined

    arr.unshift(1)

    3

    arr

    (3) [1, 1, 1]

    //in

    undefined

    //in方法可以判斷數字是否在數組里面

    undefined

    1 in arr

    true

    //pop函數,刪除掉尾部的元素,也可以用length-1的方法

    undefined

    arr.pop()

    1

    arr

    (2) [1, 1]

    //shift()函數是在頭部刪除元素

    undefined

    arr.shift

    ? shift() { [native code] }

    arr.shift()

    1

    arr

    [1]

    6162:1 Unchecked runtime.lastError: The message port closed before a response was received.

    //以上可以看出來數組是動態的

    undefined

    //數組的遍歷:

    undefined

    //第一種方法就是for循環,這里重要的是forin循環,要注意的是數組也作為一個對象,其實里面的每個元素也可以理解為數組的屬性,但是同時原型鏈上的屬性也是作為一個數組的屬性會被輸出出來,這樣的話就會產生一些問題

    undefined

    arr.prototype.x = 1

    VM4710:1 Uncaught TypeError: Cannot set property 'x' of undefined

    ? ? at <anonymous>:1:17

    (anonymous) @ VM4710:1

    Array.prototype.x = 1

    1

    Array.prototype.x = 'in'

    "in"

    for(i in arr){console.log(arr[i])}

    VM4960:1 1

    VM4960:1 in

    undefined

    //可以看到原型鏈上的屬性也被輸出出來了,而且要注意的是數組作為一個對象它的元素的名字就是相應的索引,而值就是里面的值

    undefined

    //當然可以用hasownproperty的方式判斷

    undefined

    for(i in arr){if(arr.hasOwnProperty(i){console.log(arr[i]);})}

    VM5688:1 Uncaught SyntaxError: Unexpected token '{'

    for(i in arr){if(arr.hasOwnProperty(i)){console.log(arr[i]);}}

    查看全部
  • 標簽屬性和標簽函數自定義的應用,以及序列化的應用(序列化就是在對象和json之間進行轉換,stringfied和parse)

    查看全部
  • //不能刷新,不能返回,不然全沒了

    undefined

    //對象標簽

    undefined

    //下面一個查看class的標簽

    undefined

    var toString = Object.prototype.toString;//宏定義成一個方便后續使用,以前也講過用with

    undefined

    function getType(o){return toString.call(o).slice(8,-1);}//這個是為了截取下來類型

    undefined

    toString.call(null)

    "[object Null]"

    //如果上面沒有截取就是顯示一個帶有括號的字符串

    undefined

    getType(null)

    "Null"

    getType(1)

    "Number"

    getTp

    VM18518:1 Uncaught ReferenceError: getTp is not defined

    ? ? at <anonymous>:1:1

    (anonymous) @ VM18518:1

    getType(new Number(1))

    "Number"

    //會發現上面給的不是object而是number,是因為這個是一個傳入的參數

    undefined

    getType([1,2])

    "Array"

    //extensible標簽表示對象是否可以擴展,是否可以繼續添加屬性

    undefined

    var obj = {x:1,y:2};

    undefined

    6008:1 Unchecked runtime.lastError: The message port closed before a response was received.

    //當然這個extensible是一類標簽,他下面有很多方法來進行控制,首先是isExtensible還有seal還有freeze,我們會通過一個案例來進行判斷

    undefined

    Object.isExtensible(obj)

    true

    Object.preventExtensions(obj)//這個是主要函數,防止擴展

    {x: 1, y: 2}

    Object.isExtensible(obj)

    false

    obj.z = 10

    10

    obj.z

    undefined

    //上面就會發現不能擴展了

    undefined

    Object.isSealed(obj)

    false

    Object.isSealed(obj)//這個函數是查看是否可以刪除,sale是封裝的意思

    false

    Object.seal(obj)

    {x: 1, y: 2}

    Object.isSealed(obj)

    true

    Object.getOwnPropertyDescriptor(obj)

    undefined

    Object.getOwnPropertyDescriptor(obj,'x')

    {value: 1, writable: true, enumerable: true, configurable: false}

    //上面就會發現里面的configureable都變成了false

    undefined

    Object.freeze(obj)//這個是凍結函數,這個可以進行將屬性凍結住,這樣這個對象下的所有屬性都不可以被改寫了

    {x: 1, y: 2}

    Object.getOwnPropertyDescriptor(obj,'x')

    {value: 1, writable: false, enumerable: true, configurable: false}

    //會發現上面的writable變成了false

    undefined

    //?。?!但是我們都是只凍結這個對象并不會凍結它的原型鏈

    undefined

    //

    undefined

    //

    undefined

    //

    undefined

    //下面序列化的一種方法

    undefined

    //所謂的序列化就是將obj的所有屬性變成一個json對象,這樣方便后臺進行操作

    undefined

    var obj = {val:undefined,a:NaN,b:Infinity,c:new Date()};

    undefined

    JSON.stringify(obj)//這個就是序列化的函數

    "{"a":null,"b":null,"c":"2021-03-02T12:05:19.349Z"}"

    //會發現輸出的結果里面不會顯示undefined的屬性,nun和infinity都會變成null,date會被另一種格式輸出

    undefined

    //單數不管怎么說,都是json的格式輸出出來了

    undefined

    //當然也可以逆變換,就是將json的格式變成obj形式

    undefined

    var obj2 = JSON.parse('{"x":1}');

    undefined

    obj2

    {x: 1}

    //注意json格式的書寫

    undefined

    //當然序列化也可以自定義,這個情況下就是需要在里面定義一個tojson的函數

    undefined

    var obj3 = {

    ? ? x:1,

    ? ? y:2,


    }

    undefined

    var obj3 = {

    ? ? x:1,

    ? ? y:2,

    ? ? o:{

    ? ? o1:1,

    ? ? o2:2,

    ? ? toJSON:function(){return this.o1+this.o2;}

    ? ??


    },

    }

    undefined

    obj3.o.o1

    1

    //上面在屬性里面又另外添加了一個toJSON的屬性,所以再次序列化的時候就會調用里面的這個函數

    undefined

    JSON.stringify(obj3)

    "{"x":1,"y":2,"o":3}"

    //可以看到上面的o就是哦

    undefined

    //可以看到上面的o就是o1+o2

    undefined

    //以前講變量類型的時候只講過基本類型之間的轉換,但是對象也可以轉換成基本類型,這個涉及到對象的兩個方法,一個是toString方法,一個是valueOf方法,這兩個方法是將對象轉換成基本類型的常用方法,而且是可以自己進行調用的,你只需要設置

    undefined

    obj3

    {x: 1, y: 2, o: {…}}

    obj3.toString()

    "[object Object]"

    obj.toString() = function(){return this.x+this.y;};

    VM25614:1 Uncaught ReferenceError: Invalid left-hand side in assignment

    ? ? at <anonymous>:1:5

    (anonymous) @ VM25614:1

    obj.toString = function(){return this.x+this.y;};

    ? (){return this.x+this.y;}

    //上面就是對tostring的定義

    undefined

    obj3.toString = function(){return this.x+this.y;};

    ? (){return this.x+this.y;}

    "Result"+obj3;//這個時候就會對這個對象進行隱士的轉換成基本類型

    "Result3"

    +obj3

    3

    obj3.valueOf = function(){return this.x*this.y;};

    ? (){return this.x*this.y;}

    //上面就是將對象轉換成基本類型里面的數字,所以當我們想要轉換成數字的時候,例如進行+obj3的操作時候,就會先調用valueOf這個函數,如果報錯或者不存在就會尋找tostring這個函數,如果不存在就報錯

    undefined

    +obj3

    2

    //這個時候就會變成2

    undefined

    查看全部
  • http://img1.sycdn.imooc.com//603e24b70001cd9c08740557.jpg可以

    查看全部
  • //會發現上面是不能修改了configurable所以一定要進行判斷,在這里還有一個configurable和writable不同值情況下的操作情況,有些情況可以被操作,有些不能

    undefined

    //這集講解屬性的標簽

    undefined

    //一般都有writable表示是否可以寫入,enumerable表示是否可以被forin枚舉到,configurable表示是否可以刪除掉

    undefined

    //下面我們介紹一種可以進行訪問的函數,這個函數可以查看當前屬性下的所有的標簽

    undefined

    var person{};

    VM16631:1 Uncaught SyntaxError: Unexpected token '{'

    Object.defineProperty(person,'name',{

    ? ? configurable : false;

    ? ??


    })

    VM16689:2 Uncaught SyntaxError: Unexpected token ';'

    Object.defineProperty(person,'name',{

    ? ? configurable : false,

    ? ? writable: true,

    ? ? enumerable:false,

    ? ? value:"Yangdainyi",

    ? ??


    })

    VM16747:1 Uncaught ReferenceError: person is not defined

    ? ? at <anonymous>:1:23

    (anonymous) @ VM16747:1

    Object.defineProperty(person,'type',{

    ? ? value : "OBject",

    ? ? writable:true,

    ? ? enumerable:true,

    ? ? configuarable:false,


    })

    VM16824:1 Uncaught ReferenceError: person is not defined

    ? ? at <anonymous>:1:23

    (anonymous) @ VM16824:1

    //上面在person下創建了兩個屬性,我們可以用keys去訪問person下所有的屬性,會發現只有type,是因為name2的enumerable是false

    undefined

    Object.keys(person)

    VM16922:1 Uncaught ReferenceError: person is not defined

    ? ? at <anonymous>:1:13

    (anonymous) @ VM16922:1

    Object.defineProperties(person,{



    ? ? salary:{value:50000,enumerable:true,writable:true},

    ? ? luck:{

    ? ? ? ? get:function(){


    ? ? ? ? return Math.random()>0.5? 'good':'bad';

    },

    ? ? ?promote:{

    ? ? ? ? set:function(level){

    ? ? ? ? this.salary *= 1+level*0.1;//給自己加工資,這個下面是會更改當下的salary的


    }

    ? ? ? ? ? ??

    } ,?


    }


    })

    VM16972:1 Uncaught ReferenceError: person is not defined

    ? ? at <anonymous>:1:25

    (anonymous) @ VM16972:1

    //上面在person下創建了兩個屬性,我們可以用keys去訪問person下所有的屬性,會發現只有type,是因為name2的enumerable是false

    查看全部
  • //讀寫對象的屬性

    undefined

    //1、屬性讀寫

    undefined

    var obj = {x:2,y:3}

    undefined

    obj.x

    2

    //下面是屬性繼承和屬性枚舉的知識,首先是關于屬性繼承要求是你在創建的時候就要說明的,比如說是

    undefined

    //上面是兩種的方式

    undefined

    //當然也可以for in 去遍歷,但是問題就是會把原型鏈上的也弄出來,而且順序不一定

    undefined

    //還可以用hasOwnProperty

    undefined

    //這集講的是關于get和set的方法

    undefined

    //上集由于腦袋問題沒有錄上,氣死了

    undefined

    var man = {name:'Boso',weibo:'@Bosn',get age(){return new Date().getFullYear()-2000;},set age(val){console.log('Age can\'t be set to'+val);}}

    undefined

    console.log(man.age)

    VM7522:1 21

    undefined

    man.age

    21

    man.age = 100

    VM7469:1 Age can't be set to100

    100

    //這個里面就是有一個get和set進行賦值

    undefined

    //下面是一種更加高級的做法

    undefined

    var man = {

    ? ? weibo:'@Bosn',


    }

    undefined

    6006:1 Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause(). https://goo.gl/LdLk22

    var man = {

    ? ? weibo:'@Bosn',

    ? ? $age:null,//這個情況下就是將age作為一個可以改變的變量放在里面

    ? ? get age(){

    ? ? if(this.$age==undefined){

    ? ? ? ? this.$age = new Date().getFullYear()-2000;

    ? ? }

    ? ? return this.$age;


    },//這個千萬不要忘記添加上,因為里面定義的函數也是作為一個元素放在里面

    ? ? set age(val){

    ? ? ?val = +val;//這里面的+操作是為了變成數字,隱式轉換

    ? ? ?if(!isNaN(val)&&val>0&&val<150){

    ? ? ? ? this.$age = +val;

    }else{

    ? ? throw new Error('Incorrect val' + val);


    }

    }

    }

    undefined

    man.age

    21

    man.age = 100

    100

    man.age

    100

    man.age = 160


    function foo(){}

    undefined

    Object.defineProperty(foo.prototype,)

    VM8890:1 Uncaught TypeError: Property description must be an object: undefined

    ? ? at Function.defineProperty (<anonymous>)

    ? ? at <anonymous>:1:8

    (anonymous) @ VM8890:1

    Object.defineProperty(foo.prototype,'z',{get:function(){return 1;}});

    {constructor: ?}

    var obj = new foo();

    undefined

    obj.z = 1

    1

    obj.z = 10

    10

    obj.z

    1

    Object.defineProperty(obj,'z',{value:100,configurable:true});

    foo {z: 100}

    obj.z

    100

    delete obj.z

    true

    obj.z

    1

    //因為上面刪除掉了原來的本身obj上的z所以只能向上尋找z

    undefined

    //另外有一個上面刪掉的內容,就是create這個繼承的東西

    undefined

    var o = {};

    undefined

    Object.defineProperty(o,'x',{value:1});

    {x: 1}

    var n = Object.create(o);

    undefined

    n.x

    1

    o.x = 100

    100

    o.x

    1

    //會發現上面依舊是1,是因為在默認情況下o里面的x是不可writeable的

    undefined

    //如果要改變這種狀態可以先創建一個x,這樣在原型鏈上的x就不會被先訪問到

    undefined

    Object.cra

    undefined

    Object.defineProperty(n,'x',{value:1,writable:true});

    {x: 1}

    n.x = 100

    100

    n.x

    100

    //就可以更改了

    查看全部
  • Object.getOwnPropertyDescriptor({pro:true},'pro')

    value:屬性值

    writable:該屬性是否可寫,可修改true/false

    enumerable:該屬性是否可被枚舉,在for in中出現(是否可遍歷true/false)

    configurable:該屬性的標簽是否可改變,是否可用delete將該屬性刪除true/false

    查看全部
  • get/set與原型鏈:

    http://img1.sycdn.imooc.com//603cacec0001698908890510.jpg

    http://img1.sycdn.imooc.com//603cacf40001d87708820497.jpg

    查看全部
  • 驗證對象的屬性:hasOwnProperty? ? ?obj.hasOwnProperty('a')

    驗證對象的屬性和對象原型鏈內的屬性:in? ? ?'a' in obj

    查看全部
  • 嚴格模式:

    http://img1.sycdn.imooc.com//603c9eb90001e6dd13060692.jpg

    查看全部
  • try語句如果拋出異常,則執行catch語句,否則不執行,無論有沒有異常,都執行finally語句;try語句必須跟catch或finally語句中至少一個組合使用。
    try catch語句的嵌套語句執行順序:
    1)如果內部嵌套的try語句拋出異常,但內部沒有相配套的catch語句,先執行內部的finally語句,然后跳到最近一層的catch語句執行。
    2)如果內部嵌套的try語句拋出異常,內部有相配套的catch語句,先執行此語句處理異常,再執行內部的finally語句。不會再在外部處理異常。
    3)如果內部嵌套的try語句拋出異常,內部有相配套的catch語句,并且catch語句也拋出異常,如果內部的catch語句有對異常的處理,先執行異常處理語句,然后執行內部的finally語句,最后執行離內部catch語句拋出異常最近一層的catch語句處理異常。
    http://img1.sycdn.imooc.com//603c9aa50001c50f13070684.jpg

    查看全部
  • 9

    查看全部
  • //function

    undefined

    //對于函數有兩種思路,首先是直接聲明并配置好,就是我們一般的做法,但是也可以

    undefined

    var fe = fuction(){};

    VM16933:1 Uncaught SyntaxError: Unexpected token '{'

    var fe = function(){};

    undefined

    //但是這個時候就不能在它之前進行調用

    undefined

    //for

    undefined

    //for in語句

    undefined

    var p;

    undefined

    var obj = {x:1,y:2}

    undefined

    for(p in obj){

    }

    undefined

    //上面的forin 語句可以調用一個obj里面的一些屬性對象,但是問題就是順序是不確定的,而且會受到原型鏈的影響,當enumerable為false時候不會出現

    undefined

    //with語句是一個用來限制作用域的語句,它的作用首先就是用with把語句限制在一定的范圍里面,然后在這個范圍里面有一個塊函數可以進行操作

    undefined

    with({x:1}){

    console.log(x);}

    VM18409:2 1

    undefined

    //會發現上面其實就不再需要進行調用obj。x了

    undefined

    //但是上面的那個也很雞肋,因為完全可以先把你的作用域定義給一個函數,然后再在這個函數下進行相關操作

    undefined

    查看全部
  • //運算符

    undefined

    //比較少見的有一個,運算符

    undefined

    var val = (1,2,3)

    undefined

    5804:1 Unchecked runtime.lastError: The message port closed before a response was received.

    val

    3

    //,其實是每個都會計算,但是只輸出最后的一個

    undefined

    //2另外就是刪除這個

    undefined

    var obj = {x:1};

    undefined

    obj.x

    1

    Object.defineProperties(obj,'x'{

    ? ? ? ? ? ? ? ? ? ? ? ? })

    VM13336:1 Uncaught SyntaxError: missing ) after argument list

    Object.defineProperties(obj,'x'{

    ? ? ? ? ? ? ? ? ? ? ? ? })

    VM13340:1 Uncaught SyntaxError: missing ) after argument list

    Object.defineProperties(obj,'x',{configurable

    ? ? ? ? ? ? ? ? ? ? ? ? })

    VM13393:1 Uncaught ReferenceError: configurable is not defined

    ? ? at <anonymous>:1:34

    (anonymous) @ VM13393:1

    Object.defineProperty(obj,'x'{})

    VM13539:1 Uncaught SyntaxError: missing ) after argument list

    Object.defineProperty(obj,'x',{})

    {x: 1}

    Object.defineProperty(obj,'x',{

    ? ? configurable : false,


    })

    {x: 1}

    delete obj.x

    false

    //這個時候就會發現里面的configurable是true

    undefined

    //in判斷符

    undefined

    window.x = 1

    1

    x in window

    true

    function Foo(){}

    undefined

    Foo

    ? Foo(){}

    Foo.prototype.x = 1;

    1

    var obj = new Foo()


    undefined

    obj.x

    1

    obj.hasOwnProperty('x');//判斷在obj里面是否含有x這個屬性,因為x是在obj的prototype里面,所以也不會被檢測到

    false

    obj.__proto__.hasOwnProperty('x')

    true

    查看全部

舉報

0/150
提交
取消
課程須知
1.您至少學習了本站“JS入門”、“JS進階”兩門基礎課程。 2.如您具備一定實踐經驗對學習有很大幫助。 3.如您沒有腳本編程開發經驗,學習過程有可能會受挫部分內容或示例代碼,請“暫時略過不懂的部分,后面章節會闡述”,當然想透徹學習,還需大量實踐來體會知識的內涵。
老師告訴你能學到什么?
結合實例,深入解析以下知識內容: 1. 數據類型、表達式和運算符、語句; 2. 對象、數組、變量、函數; 3. this、閉包和作用域; 4. OOP; 5. 正則與模式匹配。

微信掃碼,參與3人拼團

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復購買,感謝您對慕課網的支持!