摘要:在給一個目標對象為構(gòu)造函數(shù)的代理對象構(gòu)造實例時觸發(fā)該操作,比如在執(zhí)行時。
1、元素上下垂直居中的方式有哪些?
元素水平垂直居中的方式有哪些? absolute加margin方案 fixed 加 margin 方案 display:table 方案 行內(nèi)元素line-height方案 flex 彈性布局方案 transform 未知元素寬高解決方案 absolute加margin方案 div{ position: absolute; width: 100px; height: 100px; left: 50%; top: 50%: margin-top: -50px; margin-left: -50px; } fixed 加 margin 方案 div{ position: fixed; width: 100px; height: 100px; top: 0; right:0; left: 0; bottom: 0; margin: auto; } display:table 方案 div{ display: table-cell; vertical-align: middle; text-align: center; width: 100px; height: 100px; } 行內(nèi)元素line-height方案 div{ text-align: center; line-height: 100px; } flex 彈性布局方案 div{ display: flex; align-items: center; justify-content:center } transform 未知元素寬高解決方案 div{ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) }2、var let const的區(qū)別及使用場景?
首先3個都是js聲明變量所用 Var var 所聲明的變量,作用域為該語句所在的函數(shù)內(nèi),且存在變量提升 console.log(a) // 變量提升,var a 被提至所在作用域頂部, 所以這里輸出的值為 undefined var a = "JS" for (var i = 0; i <10; i++) { setTimeout(function() { // 同步注冊回調(diào)函數(shù)到 異步的 宏任務(wù)隊列。 console.log(i); // 執(zhí)行此代碼時,同步代碼for循環(huán)已經(jīng)執(zhí)行完成 }, 0); } 10 ... 10 // 10個10 console.log(i) // i 作用域全局 輸出10 后面聲明的會覆蓋之前聲明的變量 var a = "JS" var a = "JavaScript" Let let 所聲明的變量,作用域為該語句的代碼塊內(nèi),不存在變量提升 console.log(a) // 變量沒有被提升, 輸出 ReferenceError: a is not defined let a = "JavaScript" for (let i = 0; i <10; i++) { setTimeout(function() { // 同步注冊回調(diào)函數(shù)到 異步的 宏任務(wù)隊列。 console.log(i); // 執(zhí)行此代碼時,同步代碼for循環(huán)已經(jīng)執(zhí)行完成 }, 0); } 1...10 // 1到10 console.log(i) // i作用域for 塊級內(nèi),輸出 i is not defined 不允許重復聲明 let a = "JavaScript" let a = "JS" // "a" has already been declared Const const 包含let 所有特性, 區(qū)別是const聲明的變量是一個只讀的不可修改的 這里注意,const保證的不是所聲明的值不得改動, 而是變量指向的內(nèi)存不可改動 代碼示例 const a = { content: "JavaScript" } a.content = "JS" // JS a = { content: "JS" // 這里改變了內(nèi)存, 所以報錯 Assignment to constant variable } 三句話總結(jié) 使用var聲明的變量,其作用域為該語句所在的函數(shù)內(nèi),且存在變量提升現(xiàn)象,后面的覆蓋前面的 使用let聲明的變量,其作用域為該語句所在的代碼塊內(nèi),不存在變量提升, 不能重復聲明 使用const聲明的是常量,在后面出現(xiàn)的代碼中不能再修改該常量的內(nèi)存3、如何理解es6中的類?
首先,JS作為一門非面向?qū)ο笳Z言,在es6之前,并沒有提供對類的支持,我們常用的做法是通過構(gòu)造函數(shù)來模擬類的實現(xiàn), 通過將屬性及方法定義在原型上共享給其實例 簡單實現(xiàn): function JS(name) { this.name = name } JS.prototype.getName = function(){ console.log(this.name) } const child = new JS("測試") ES6 中的Class es6中的class只是一個語法糖,class的寫法只是讓對象原型看起來更加清晰 簡單使用: class JS { constructor(name) { this.name = name } getName() { console.log( this.name ) } } const child = new JS("測試") 每個類中都有一個constructor方法,如果沒有顯示定義, 會默認添加一個空的constructor,等同于ES5中的構(gòu)造函數(shù), 類的所有方法都是定義在類的prototype屬性上面,二者的主要區(qū)別在于Class必須使用new調(diào)用, ES5中構(gòu)造函數(shù)不使用new也可以調(diào)用, class 中新增靜態(tài)方法(static)關(guān)鍵字, 靜態(tài)方法不能被繼承只有通過類本身來調(diào)用 class JS { constructor(name) { this.name = name } static getName() { // static 方法只有類本身能調(diào)用,實例不能繼承 console.log(this.name) } } Extends 繼承 class 也可以通過extends 關(guān)鍵字實現(xiàn)繼承 代碼示例: class JS { constructor(name) { this.name = name } getName() { console.log(this.name) } } class Css extends Js{ constructor() { super(); } } const child = new Css("測試") child.getName() // "測試" extends 注意點 使用extends 繼承時,子類構(gòu)造函數(shù)中必須調(diào)用super(), 代表調(diào)用父類的構(gòu)造函數(shù) super雖然代碼父類的constructor,但是返回的子類的實例 super作為函數(shù)調(diào)用時,代表類的構(gòu)造函數(shù) super作為對象調(diào)用時, 在普通方法中,指向父類的原型對象, 靜態(tài)方法中指向父類4、如何理解es6中的Promise?
js是單線程的,也就是說一次只能完成一個任務(wù),為了解決這個問題,js將任務(wù)的執(zhí)行模式分為兩種, 同步和異步, 在es5中我們處理異步只能通過的回調(diào)的方式進行處理,在多層異步中,回調(diào)會一層一層嵌套,也就是所謂的回調(diào)地獄,promise就是異步編程的一種解決方案 Promise 特點: 對象的狀態(tài)不受外界影響, promise對象代表一個異步操作,有三種狀態(tài)pendding(進行中), fulfilled(成功), rejected(失敗) 一旦狀態(tài)改變,就不會再變, 狀態(tài)的改變只有兩種可能, pendding => fulfilled及pendding => rejected 基本用法: const promise = new Promise( function(resolve,reject){ // ... some code if(/* 異步操作成功 */){ resolve(value); // 將狀態(tài)從pendding變成fulfilled }else{ reject(error); // 將狀態(tài)從pendding變成rejected } } ); promise 生成實例后可以使用then方法接收resolved狀態(tài)和rejected狀態(tài)的回調(diào)函數(shù) promise.then(()=>{ console.log("resolved") },()=>{ console.log("rejected") }) promise原型上具有catch方法, catch方法是rejection的別名, 用于指定發(fā)生錯誤時的回調(diào)函數(shù) promise.then(()=>{ console.log("resolved") },()=>{ console.log("rejected") }).catch((err)=>{ console.log("catch") }) promise原型上具有finally方法,用于不管promise對象最后的狀態(tài)如何,都會執(zhí)行的操作 promise.then(()=>{ console.log("resolved") },()=>{ console.log("rejected") }).finally((err)=>{ console.log("end") }) Promise.all Promise.all方法用于將多個 Promise 實例,包裝成一個新的 Promise 實例 簡單使用: const p = Promise.all([p1,p2,p3]); 特點: 參數(shù)都是promise實例,如果不是會調(diào)用promise.resolve方法將其轉(zhuǎn)為promise實例 p的獎態(tài)由傳入的promise實例的狀態(tài)決定 promise實例狀態(tài)都變成fulfilled,p狀態(tài)為fulfilled promise實例狀態(tài)一個變成rejected,p狀態(tài)為rejected6、如何理解es6中的Proxy?
如何理解es6中的Proxy? 試題解析:對proxy的理解,可能會延伸到vue的雙向綁定 Proxy(代理) 定義 可以理解為為目標對象架設(shè)一層攔截,外界對該對象的訪問,都必須通過這層攔截 簡單示例: const obj = new Proxy({}, { get: (target, key, receiver) => { return "JS" console.log(`get ${key}`) }, set: (target, key, value, receiver) => { console.log(`set ${key}`) }, }) obj.name = "JS" // set name // JS obj.name // 這里進入get的回調(diào)函數(shù),所有直接返回 JS 從上面的示例中可以看出,Proxy存在一種機制,可以對外界的讀寫操作進行改寫 Proxy 實例方法 proxy除了代理get,set操作,還能代理其它的操作,如下 handler.getPrototypeOf() // 在讀取代理對象的原型時觸發(fā)該操作,比如在執(zhí)行 Object.getPrototypeOf(proxy) 時。 handler.setPrototypeOf() // 在設(shè)置代理對象的原型時觸發(fā)該操作,比如在執(zhí)行 Object.setPrototypeOf(proxy, null) 時。 handler.isExtensible() // 在判斷一個代理對象是否是可擴展時觸發(fā)該操作,比如在執(zhí)行 Object.isExtensible(proxy) 時。 handler.preventExtensions() // 在讓一個代理對象不可擴展時觸發(fā)該操作,比如在執(zhí)行 Object.preventExtensions(proxy) 時。 handler.getOwnPropertyDescriptor() // 在獲取代理對象某個屬性的屬性描述時觸發(fā)該操作,比如在執(zhí)行 Object.getOwnPropertyDescriptor(proxy, "foo") 時。 handler.defineProperty() // 在定義代理對象某個屬性時的屬性描述時觸發(fā)該操作,比如在執(zhí)行 Object.defineProperty(proxy, "foo", {}) 時。 handler.has() // 在判斷代理對象是否擁有某個屬性時觸發(fā)該操作,比如在執(zhí)行 "foo" in proxy 時。 handler. get () // 在讀取代理對象的某個屬性時觸發(fā)該操作,比如在執(zhí)行 proxy.foo 時。 handler.set() // 在給代理對象的某個屬性賦值時觸發(fā)該操作,比如在執(zhí)行 proxy.foo = 1 時。 handler.deleteProperty() // 在刪除代理對象的某個屬性時觸發(fā)該操作,比如在執(zhí)行 delete proxy.foo 時。 handler.ownKeys() // 在獲取代理對象的所有屬性鍵時觸發(fā)該操作,比如在執(zhí)行 Object.getOwnPropertyNames(proxy) 時。 handler.apply() // 在調(diào)用一個目標對象為函數(shù)的代理對象時觸發(fā)該操作,比如在執(zhí)行 proxy() 時。 handler.construct() // 在給一個目標對象為構(gòu)造函數(shù)的代理對象構(gòu)造實例時觸發(fā)該操作,比如在執(zhí)行new proxy() 時。 為什么要使用Proxy 攔截和監(jiān)視外部對對象的訪問 降低函數(shù)或類的復雜度 在復雜操作前對操作進行校驗或?qū)λ栀Y源進行管理7、如何理解es6中的decorator?
Decorator是ES7中的提案,概念借鑒于python, 它作用于一個目標類為其添加屬性于方法 我們用一個比喻來理解Decorator, 把孫悟空看成是一個類,那么棒子就是裝飾器為其裝備的武器 代碼理解: @stick class Monkey{ } function stick(target){// 第一個參數(shù)就是目標類的本身 target.ATK = 100000 } Monkey.ATK // 為悟空裝備了棒子,攻擊力提高了100000 // 如果一個參數(shù)不夠用,可以在裝飾器外層再包一層 function stick(atk){ return function(targt){ target.ATK = atk } } @stick(200000) // 這樣我們就為悟空增加了200000攻擊力 class Monkey{ } Decorator 不僅能修飾類,也能修飾類的方法 class Monkey{ @setName name(){ this.name = "孫悟空" } } Decorator 只能修飾類及類的方法,不能修飾于函數(shù),因為存在函數(shù)提升 Mixin 在修飾器基礎(chǔ)上,我們可以實現(xiàn)mixin(混入),意思在一個對象中混入另一個對象的方法 代碼示例: export function mixins(...list){ return function(target){ Object.assign(target.prototype,...list) } } const skill = { shapeshifting(){ console.log("72變") } } @mixins(skill) class Monkey{ } Object.assign(Monkey.prototype, skill) const swk = new Monkey() swk.shapeshifting() // 72變 使用Decorator的好處 擴展功能,相對于繼承增加了更多的靈活性 代碼可讀性更高,裝飾器正確命名相當于注釋8、Es6中新增的數(shù)據(jù)類型有哪些?使用場景?
Es6中新增的數(shù)據(jù)類型有哪些?使用場景? es6中新增一種原始數(shù)據(jù)類型Symbol,最大的特點是唯一性,Symbol值通過Symbol函數(shù)生成, 在es5中對象的屬性都是字符串,我們使用他人定義的對象,然后去新增自己的屬性,這樣容易起沖突覆蓋原有的屬性, Symbol也可以看成為一個字符串,不過這個字符能保證是獨一無二的 基本示例: // Object const obj = { name:"JS" } obj.name ="JS每日一題" // Symbol const name = Symbol("name") // 這里的參數(shù)沒有特殊意義,可以看成為Symbol加了一個標記 obj[name]="JS每日一題" Symbol用法 Symbol 目前有多種寫法 // 一 const title = Symbol() const obj = {} obj[title]="JS每日一題" // 二 const obj = { [title]:"JS每日一題" } // 三 Object.defineProperty(obj,title,{value:"JS每日一題"}) obj[title] // 輸出的結(jié)果都為JS每日一題 這里注意一下, Symbol 做為屬性名時,不能用點去讀取 obj.title // undefined Symbol作為屬性名,只有通過Object.getOwnPropertySymbols 方法返回 const attrs = Object.getOwnPropertySymbols(obj) // [Symbol[title]] Symbol.for() 如果我們想要重復Symbol可以使用Symbol.for, Smybol.for()及Smybol()的區(qū)別在于Symbol.for()會先去查找全局下有沒有聲明過,如果有就返回該值,沒有就新建一個,Symbol()每一次調(diào)用都會新建一個 代碼理解: const title = Symbol.for("JS每日一題") .... Symbol.for("JS每日一題") //調(diào)用多次都是使用的第一次聲明的值 Symbol.for("JS每日一題") === Symbol.for("JS每日一題") // true const title =Symbol("JS每日一題") Symbol("JS每日一題") === Symbol("JS每日一題") // false 總結(jié) Symbol的特點 獨一無二 不能隱式轉(zhuǎn)換 不能與其它數(shù)據(jù)類型做運算 不能使用點運算符進行操作9、簡述一下你為什么要使用vue?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/101267.html
摘要:筆記說明重學前端是程劭非前手機淘寶前端負責人在極客時間開的一個專欄,每天分鐘,重構(gòu)你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的可以加入的專欄學習原文有的語音,如有侵權(quán)請聯(lián)系我,郵箱。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的可以...
摘要:筆記說明重學前端是程劭非前手機淘寶前端負責人在極客時間開的一個專欄,每天分鐘,重構(gòu)你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的可以加入的專欄學習原文有的語音,如有侵權(quán)請聯(lián)系我,郵箱。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的可以...
摘要:筆記說明重學前端是程劭非前手機淘寶前端負責人在極客時間開的一個專欄,每天分鐘,重構(gòu)你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的可以加入的專欄學習原文有的語音,如有侵權(quán)請聯(lián)系我,郵箱。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的可以...
摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業(yè)務(wù)工作時也會不定期更...
摘要:因為工作中一直在使用,也一直以來想總結(jié)一下自己關(guān)于的一些知識經(jīng)驗。于是把一些想法慢慢整理書寫下來,做成一本開源免費專業(yè)簡單的入門級別的小書,提供給社區(qū)。本書的后續(xù)可能會做成視頻版本,敬請期待。本作品采用署名禁止演繹國際許可協(xié)議進行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
摘要:無序列表無序列表是一個項目的列表,此列項目使用粗體圓點典型的小黑圓圈進行標記。可以取值為實心黑圓點空心圓點實心黑方點。有序列表有序列表同樣也是一列項目,列表項目使用數(shù)字進行標記。自定義列表自定義列表是項目及其注釋的組合。 前端基礎(chǔ)知識學習記錄(二) 1、HTML 輸入類型 元素的輸入類型: 1、定義供文本輸入的單行輸入字段; 2、定義密碼字段(password字段中的字符會被做掩碼處理...
閱讀 3686·2021-11-12 10:36
閱讀 3831·2021-09-22 15:48
閱讀 3542·2019-08-30 15:54
閱讀 2592·2019-08-29 16:44
閱讀 2363·2019-08-29 16:08
閱讀 2407·2019-08-29 16:06
閱讀 1280·2019-08-29 15:21
閱讀 3171·2019-08-29 12:39