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