<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        一些你可能不熟悉的JS知識點總結

        來源:懂視網 責編:小采 時間:2020-11-27 21:59:53
        文檔

        一些你可能不熟悉的JS知識點總結

        一些你可能不熟悉的JS知識點總結: 暫時性死區 只要塊級作用域存在let命令,它所聲明的變量就綁定這個區域,不再受外部的影響。這么說可能有些抽象,舉個例子: var temp = 123; if(true) { console.log(temp); let temp; } 結果: > ReferenceError: te
        推薦度:
        導讀一些你可能不熟悉的JS知識點總結: 暫時性死區 只要塊級作用域存在let命令,它所聲明的變量就綁定這個區域,不再受外部的影響。這么說可能有些抽象,舉個例子: var temp = 123; if(true) { console.log(temp); let temp; } 結果: > ReferenceError: te

        具體函數細節:

        Reflect.apply(target, this, arguments)

        // target:目標函數
        // this:綁定的上下文對象
        // arguments:函數的參數列表
        Reflect.apply(target, this, arguments)
        
        const arr = [2, 3, 4, 5, 6];
        let max;
        // ES6
        max = Reflect.apply(Math.max, null, arr)
        
        // ES5 
        max = Math.max.apply(null, arr);
        max = Function.prototype.apply.call(Math.max, null, arr);

        Reflect.construct(target, argumentsList[, newTarget])

        // 這個方法,提供了一種新的不使用new來調用構造函數的方法
        function A(name) {
         console.log('Function A is invoked!');
         this.name = name;
        }
        A.prototype.getName = function() {
         return this.name;
        };
        
        function B(age) {
         console.log('Function B is invoked!');
         this.age = age;
        }
        B.prototype.getAge = function() {
         return this.age;
        };
        
        
        // 測試 (這兩種是一致的)
        var tom = new A('tom');
        var tom = Reflect.construct(A, ['tom']);
        
        
        // jnney繼承了A的實例屬性,同時繼承了B的共享屬性
        // 簡單來說,A構造函數被調用,但是 jnney.__proto__ === B.prototype
        var jnney = Reflect.construct(A, ['jnney'], B);
        

        Reflect.defineProperty(target, propertyKey, attributes)

        這個方法和Object.definePropperty(屬性定義失敗,會拋出一個錯誤,成功則返回該對象)相似,不過Reflect.defineProperty(屬性定義失敗,返回false,成功則返回true)返回的是一個Boolean值。

        let obj = {};
        
        let obj1 = Object.defineProperty(obj, 'name', {
         enumerable: true,
         value: 'bjw' 
        });
        
        // 這里會返回false 因為我們上面定義name這個屬性是不可修改的,
        // 然后我們又在這里修改了name屬性,所以修改失敗返回值為false
        let result1 = Reflect.defineProperty(obj, 'name', {
         configurable: true,
         enumerable: true,
         value: 'happy'
        });
        console.log(result1); // false
        

        Reflect.deleteProperty(target, propertyKey)

        let obj = {
         name: 'dreamapple',
         age: 22
        };
        
        let r1 = Reflect.deleteProperty(obj, 'name');
        console.log(r1); // true
        let r2 = Reflect.deleteProperty(obj, 'name');
        console.log(r2); // true
        let r3 = Reflect.deleteProperty(Object.freeze(obj), 'age');
        console.log(r3); // false

        Reflect.get(target, propertyKey[, receiver])

        Reflect.set(target, propertyKey, value[, receiver])

        這個方法用來讀取/設置一個對象的屬性,target是目標對象,propertyKey是我們要讀取的屬性,receiver是可選的,如果propertyKeygetter函數里面有this值,那么receiver就是這個this所代表的上下文。

        Reflect.getOwnPropertyDescriptor(target, propertyKey)

        這個方法與Object.getOwnPropertyDescriptor方法類似,其中target是目標對象,propertyKey是對象的屬性,如果這個屬性存在屬性描述符的話就返回這個屬性描述符;如果不存在的話,就返回undefined。(如果第一個參數不是對象的話,那么Object.getOwnPropertyDescriptor會將這個參數強制轉換為對象,而方法 Reflect.getOwnPropertyDescriptor會拋出一個錯誤。)

        var obj = {age: 22}
        Reflect.getOwnPropertyDescriptor(obj, 'age')
        {value: 22, writable: true, enumerable: true, configurable: true}

        Reflect.getPrototypeOf(target)

        Reflect.setPrototypeOf(target, prototype)

        這個方法與Object.getPrototypeOf方法是一樣的,都是返回一個對象的原型,也就是內部的[[Prototype]]屬性的值。

        Reflect.setPrototypeOfObject.setPrototypeOf方法的作用是相似的,設置一個對象的原型,如果設置成功的話,這個對象會返回一個true;如果設置失敗,這個對象會返回一個false。

        Reflect.has(target, propertyKey)

        這個方法相當于ES5的in操作符,就是檢查一個對象上是否含有特定的屬性;我們繼續來實踐這個方法:

        function A(name) {
         this.name = name || 'dreamapple';
        }
        A.prototype.getName = function() {
         return this.name;
        };
        
        var a = new A();
        
        console.log('name' in a); // true
        console.log('getName' in a); // true
        
        let r1 = Reflect.has(a, 'name');
        let r2 = Reflect.has(a, 'getName');
        console.log(r1, r2); // true true

        Reflect.isExtensible(target)

        這個函數檢查一個對象是否是可以擴展的,也就是是否可以添加新的屬性。(要求target必須為一個對象,否則會拋出錯誤)

        let obj = {};
        let r1 = Reflect.isExtensible(obj);
        console.log(r1); // true
        // 密封這個對象
        Object.seal(obj);
        let r2 = Reflect.isExtensible(obj);
        console.log(r2); // false

        模塊化

        使用模塊化,可以為我們帶來以下好處:

      1. 解決命名沖突
      2. 提供復用性
      3. 提高代碼可維護性
      4. 立即執行函數

        在早期,使用立即執行函數實現模塊化,通過函數作用域解決了命名沖突、污染全局作用域的問題。

        AMD 和 CMD

        這兩種實現方式已經很少見到,具體的使用方式如下:

        // AMD
        define(['./a', './b'],function(a, b){
         // 模塊加載完畢可以使用
         a.do();
         b.do(); 
        });
        
        // CMD
        define(function(require, exports, module){
         // 加載模塊
         var a = require('./a'); 
        });

        CommonJS

        CommonJS最早是Node在使用,目前可以在Webpack中見到它。

        // a.js
        module.exports = {
         a: 1
        }
        
        // or 
        exports.a = 1;
        
        // 在b.js中可以引入
        var module = require('./a');
        module.a // log 1

        難點解析:

        // module 基本實現
        var module = {
         id: 'xxx',
         exports: {}
        }
        
        var exports = module.exports;
        // 所以,通過對exports重新賦值,不能導出變量

        ES Module

        ES Module 是原生實現模塊化方案。

        // 導入模塊
        import xxx form './a.js';
        import { xxx } from './b.js';
        
        // 導出模塊
        export function a(){}
        
        // 默認導出
        export default {};
        export default function(){}
        

        ES Module和CommonJS區別

      5. CommonJS支持動態導入,也就是require(${path}/xx.js),ES Module不支持
      6. CommonJS是同步導入,因為用于服務器端,文件都在本地,同步導入即使卡住主線程影響也不大。而ES Module是異步導入,因為用于瀏覽器,需要下載文件,采用同步導入會對渲染有很大影響
      7. CommonJS在導出時都是值拷貝,就算導出值變了,導入的值也不會改變。如果想更新值,必須重新導入一次。但是ES Module采用實時綁定的方式,導入導出的值都指向同一個內存地址,所以導入值會跟導出值變化
      8. ES Module 會編譯成 require/exports 來執行的
      9. 手寫簡單版本的Promise

        const PENDING = 'pending';
        const RESOLVED = 'resolved';
        const REJECTED = 'rejected';
        
        function MyPromise(fn) {
         const _this = this;
         _this.state = PENDING;
         _this.value = null;
         _this.resolvedCallbacks = [];
         _this.rejectedCallbacks = [];
        
        
         // resolve函數
         function resolve(value) {
         if (_this.state === PENDING) {
         _this.state = RESOLVED;
         _this.value = value;
         _this.resolvedCallbacks.map(cb => cb(_this.value));
         }
         }
        
         // rejected函數
         function reject(value) {
         if (_this.state === PENDING) {
         _this.state = REJECTED;
         _this.value = value;
         _this.rejectedCallbacks.map(cb => cb(_this.value));
         }
         }
        
         // 當創建對象的時候,執行傳進來的執行器函數
         // 并且傳遞resolve和reject函數
         try {
         fn(resolve, reject);
         } catch (e) {
         reject(e);
         }
        }
        
        // 為Promise原型鏈上添加then函數
        MyPromise.prototype.then = function (onFulfilled, onRejected) {
         const _this = this;
         onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : v => v;
         onRejected = typeof onRejected === 'function' ? onRejected : r => {
         throw r;
         }
         if (_this.state === PENDING) {
         _this.resolvedCallbacks.push(onFulfilled);
         _this.rejectedCallbacks.push(onRejected);
         }
         if (_this.state === RESOLVED) {
         onFulfilled(_this.value);
         }
         if (_this.state === REJECTED) {
         onRejected(_this.value);
         }
         return _this;
        }
        
        
        
        // 測試
        new MyPromise(function (resolve, reject) {
         setTimeout(() => {
         resolve('hello');
         }, 2000);
        }).then(v => {
         console.log(v);
        }).then(v => {
         console.log(v + "1");
        })

        這篇文章就介紹到這了,需要的朋友可以參考一下。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        一些你可能不熟悉的JS知識點總結

        一些你可能不熟悉的JS知識點總結: 暫時性死區 只要塊級作用域存在let命令,它所聲明的變量就綁定這個區域,不再受外部的影響。這么說可能有些抽象,舉個例子: var temp = 123; if(true) { console.log(temp); let temp; } 結果: > ReferenceError: te
        推薦度:
        標簽: 整理 知識 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 最近2019中文字幕免费直播| 99在线免费视频| 波多野结衣在线免费视频| 亚洲精品福利视频| 久久青草国产免费观看| 亚洲精品乱码久久久久久中文字幕| 色吊丝性永久免费看码| 国产亚洲精品拍拍拍拍拍| 青草青草视频2免费观看| 亚洲精品视频免费观看| 中文字幕永久免费| 亚洲AV无码一区二区三区系列| 99精品国产成人a∨免费看| 综合自拍亚洲综合图不卡区| 亚洲国产精品免费在线观看| 亚洲国产精品久久人人爱| 我想看一级毛片免费的| 在线观看亚洲视频| 亚洲熟妇中文字幕五十中出| 国内精品免费在线观看| 亚洲福利一区二区三区| 最近最新中文字幕完整版免费高清| MM1313亚洲国产精品| 亚洲中文字幕在线第六区| 久久黄色免费网站| 国产亚洲中文日本不卡二区| 国产一精品一aⅴ一免费| 成人黄网站片免费视频| 亚洲a级片在线观看| 免费日本黄色网址| 久久午夜夜伦鲁鲁片无码免费| 亚洲国产美女在线观看| 四虎影院永久免费观看| 国产精品1024在线永久免费| 亚洲第一成年网站大全亚洲| 国产一区在线观看免费| 日韩视频在线观看免费| 在线aⅴ亚洲中文字幕| 色噜噜AV亚洲色一区二区| 国产大片91精品免费观看不卡| 美女被免费网站在线视频免费|