js高級進階

1.Object.definePorperty
2.js的執(zhí)行機制
  1. js是單線程的
  2. js的事件循環(huán)(Event Loop)是js的執(zhí)行機制


    image.png
3. js繼承(原型繼承,借用構(gòu)造函數(shù)繼承,組合繼承(原型繼承+借用構(gòu)造函數(shù)))
  function Person(){
       this.name = "xiaoju";
       this.age = 18;
       this.sex = "男"
     }
     function Student(){
       this.score = 18;
     }

     Student.prototype = new Person(); // 原型繼承,無法設(shè)置參數(shù)
     var s1 = new Student();
     console.log(s1);
 function Animal(species, color) { 
        this.species = species;
        this.color = color;
     }
   Animal.prototype.sayHi = function(){
        console.log(this.name)
      }
  
   function Cat(species, color, score) {
        Animal.call(this, species, color, score); // 借用構(gòu)造函數(shù),方法的繼承借用構(gòu)造函數(shù)繼承不了
        this.score = score;
     }
      let instance = new Cat("人類", "green", 100);
      alert(instance.species);
      alert(instance.color);
 function Animal(species, color) { 
        this.species = species;
        this.color = color;
     }
   Animal.prototype.sayHi = function(){
        console.log(this.name)
      }
  
   function Cat(species, color, score) {
        Animal.call(this, species, color, score); 
        this.score = score;
     }

 Cat.prototype = Animal.prototype; // 借用構(gòu)造函數(shù)繼承,可以繼承原型的方法
 Cat.constructor = Cat;
 Cat.prototype.exam = function(){
     console.log("考試);
  }
 let instance = new Cat("人類", "green", 100);
 let instance  = new Animal("貓","brone"); // 通過Cat.prototype = Animal.prototype的訪問可以實現(xiàn)Animal也可以訪問Cat原型的方法,唯一不便的就是所有的實例的原型都共享同樣的方法

__________修改后___________
Cat.prototype = new Animal();  // 這樣的話Cat實例就是單獨繼承父類型的方法,也有自己獨立的方法

原型圖.png

4.##### 函數(shù)聲明與函數(shù)表達式

// 函數(shù)聲明,存在函數(shù)聲明提升
alert(sum(10,11);
function sum(a,b){
return a+b;
}
// 函數(shù)表達式
alert(sum(a,b); // 報錯. sum
var sum = function(a,b){
 return a+b;
}
call,apply,bind的使用
var obj ={
  0:100,
  1:10,
  2:20,
  3:30,
  length:4
}
Array.prototype.push.call(obj,30); // 將數(shù)組的方法用在對象上面
Array.prototype.splice.call(obj,0,2);
console.log(obj);
________bind______
var obj = {
  name: "xiaoju",
  exam: function(){
    setInterval(function(){
      console.log(this.name);
    }.bind(this),1000);
  }
}
obj.exam(); // bind可以使this指向調(diào)用詞法作用域,

求數(shù)組的最大元素

var arr = [2,3,4,5];
Math.max(arr[0],arr[1],arr[2]);
Math.max.apply(Math,arr);
Math.max.apply(null,arr);
Math.call(Math,arr[0],arr[1],arr[2]);

附:判斷一個對象是不是數(shù)組

var obj = {name:"23",age:18};
console.log(Object.prototype.toString.call(obj) === '[Object Array]'); // false
________另一種_______
var obj = {name:"23",age:18};
console.log(Array.isArray(obj)); // fasle
高階函數(shù)
  1. 函數(shù)作為參數(shù)
深拷貝與淺拷貝

深拷貝與淺拷貝的最大區(qū)別在于深拷貝改變拷貝后的值,其原來的值也會改變歉嗓。當然深拷貝與淺拷貝只針對引用類型這樣的復(fù)雜類型剂桥。
// 淺拷貝

 let obj = {
            name: "xiaoju",
            age: 23,
            hobby: ["photography", "cooking", "sking"],
            dog: {
                name: "小A",
                age: 2
            }
        }
        // let temp = obj;
        let temp = {};
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                temp[key] = obj[key]

            }
        }

        temp.hobby[0] = "xiaoshitou";   // 這里對拷貝后對象中數(shù)組進行修改
        temp.age = 24; // 這里對拷貝后對象中的一般類型的值進行修改
        console.log(temp);
        //age: 24;// 拷貝后的一般類型的值發(fā)生改變
        // dog: {name: "小A", age: 2}
        // hobby: (3) ["xiaoshitou", "cooking", "sking"] // 改變拷貝后對象里面的數(shù)組的值
        // name: "xiaoshitou"
—————我是華麗的分割線——————
        console.log(obj);
        //age: 23   // 而原來的對象的一般類型的值不會發(fā)生改變紊扬,所以深拷貝只是針對與引用類型的值
        // dog: {name: "小A", age: 2}
        // hobby: (3) ["xiaoshitou", "cooking", "sking"] // 原來的對象的數(shù)組的值也會改變。因為它們指向的是同一塊內(nèi)存地址
        // name: "xiaoju"

那么如何進行深拷貝呢

   function deepCopy(obj, objCopy) {
            var copy = {};
            for (var prop in obj) {
                let temp = obj[prop];
                if (temp instanceof Object) {
                    objCopy[prop] = {};
                    deepCopy(temp, objCopy[prop]); // 用遞歸實現(xiàn)引用類型的值進行多層次的拷貝
                } else if (temp instanceof Array) {
                    objCopy[key] = [];
                    deepCopy(temp, objCopy[prop])
                } else {
                    objCopy[prop] = obj[prop];
                }
            }
        }
        var obj = {
            name: "nanlan",
            age: 23,
            hobby: ["photography", "skating", "drawing"],
            eaxm: {
                project: "computer",
                time: "60"
            }
        }
        var obj1 = {};

        deepCopy(obj, obj1);
        obj1.hobby[0] = "playing"
        obj1.eaxm.project = "science";

        console.log(obj); // 拷貝后的對象數(shù)組和對象均發(fā)生改變,不會影響原來的對象
        // name: "nanlan",
        // age: 23,
        //     hobby: ["photography", "skating", "drawing"],
        //     eaxm: {
        //         project: "computer",
        //         time: "60"
        //     }

為多個相同的元素做批處理的方法

  <ul id="list">
       <li>11</li>
       <li>22</li>
       <li>33</li>
       <li>44</li>
       <li>55</li>
   </ul>
    <script>
       function loadTree(parent,callback){
          for(var i = 0; i<parent.children.length;i++){
              var child = parent.children[i];
              callback(child);
            //   loadTree(child);
          }
       }
      var dom = document.getElementById("list");

       loadTree(dom,function(element){
           console.log(element.innerText)
       });
正則表達式
test()
    var reg = /ab[a-z]/; // 這里可以寫為  new RegExp('ab[a-z]','i'); // i 表示忽略大小寫斧抱,g匹配全局兄朋。
    var str  = 'abd';
    console.log(reg.test(str)); // 返回一個true 或者是false
exec()
       var str = '張三:2500,李四:3000掐禁,王五:5000';
        var  reg = /\d+/gi;
        var content = reg.exec(str);
        console.log(content); // 返回匹配的結(jié)果,只匹配一次
test()
    var str = '張三:2500,李四:3000,王五:5000';
        var  reg = /\d+/g;
        console.log(str.match(reg)); // 返回匹配的結(jié)果颅和,可以匹配多次

貪婪模式與惰性模式
*+是貪婪模式傅事,后面加個?就是惰性模式
貪婪模式——在匹配成功的前提下峡扩,盡可能多的去匹配:從字符串的最前面開始匹配蹭越,如果不匹配就從最后刪除一個,直到匹配成功為止
惰性模式——在匹配成功的前提下教届,盡可能少的去匹配:從字符串的最前面開始匹配响鹃,如果不匹配就加一個,直到匹配位置

js模塊化

好處

  1. 避免命名沖突
  2. 更好的分離
  3. 高復(fù)用高可維護性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末案训,一起剝皮案震驚了整個濱河市买置,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌强霎,老刑警劉巖忿项,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡轩触,警方通過查閱死者的電腦和手機寞酿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脱柱,“玉大人伐弹,你說我怎么就攤上這事≌ノ” “怎么了惨好?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柠逞。 經(jīng)常有香客問我昧狮,道長,這世上最難降的妖魔是什么板壮? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任逗鸣,我火速辦了婚禮,結(jié)果婚禮上绰精,老公的妹妹穿的比我還像新娘撒璧。我一直安慰自己,他們只是感情好笨使,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布卿樱。 她就那樣靜靜地躺著,像睡著了一般硫椰。 火紅的嫁衣襯著肌膚如雪繁调。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天靶草,我揣著相機與錄音蹄胰,去河邊找鬼。 笑死奕翔,一個胖子當著我的面吹牛裕寨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播派继,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼宾袜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驾窟?” 一聲冷哼從身側(cè)響起庆猫,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纫普,沒想到半個月后阅悍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體好渠,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡昨稼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年节视,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片假栓。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡寻行,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匾荆,到底是詐尸還是另有隱情拌蜘,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布牙丽,位于F島的核電站简卧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏烤芦。R本人自食惡果不足惜举娩,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望构罗。 院中可真熱鬧铜涉,春花似錦、人聲如沸遂唧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盖彭。三九已至纹烹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間召边,已是汗流浹背铺呵。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掌实,地道東北人陪蜻。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像贱鼻,于是被迫代替她去往敵國和親宴卖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,106評論 0 21
  • $HTML邻悬, HTTP症昏,web綜合問題 1、前端需要注意哪些SEO 2父丰、 的title和alt有什么區(qū)別 3肝谭、HT...
    Hebborn_hb閱讀 4,584評論 0 20
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,093評論 1 32
  • 誰都會受傷的 招架不住 到病人堆里落戶 還不得不摘下 最后一片遮羞布 讓眼一覽無余 讓心經(jīng)歷痛楚 我曾經(jīng)以為自己 ...
    阿杰的詩閱讀 156評論 2 2
  • 聽完了明朝那些事兒掘宪,我就想寫宋朝那些事兒。 我覺得創(chuàng)作是一件非常棒的事情攘烛。我覺得自己時間緊迫魏滚,躍躍欲試!弄清楚自己...
    青青梗閱讀 199評論 0 0