當前位置:首頁 » 網頁前端 » 前端筆記真實事件
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

前端筆記真實事件

發布時間: 2023-02-24 13:39:13

1. 整理涵蓋很全很廣的前端知識點

HTML、CSS相關

html5新特性、語義化

瀏覽器渲染機制、重繪、重排

網頁生成過程:

重排(也稱迴流): 當 DOM 的變化影響了元素的幾何信息( DOM 對象的位置和尺寸大小),瀏覽器需要重新計算元素的幾何屬性,將其安放在界面中的正確位置,這個過程叫做重排。 觸發:

重繪: 當一個元素的外觀發生改變,但沒有改變布局,重新把元素外觀繪制出來的過程,叫做重繪。 觸發:

重排優化建議:

transform 不重繪,不迴流 是因為 transform 屬於合成屬性,對合成屬性進行 transition/animate 動畫時,將會創建一個合成層。這使得動畫元素在一個獨立的層中進行渲染。當元素的內容沒有發生改變,就沒有必要進行重繪。瀏覽器會通過重新復合來創建動畫幀。

css盒子模型

所有 HTML 元素可以看作盒子,在CSS中, "box model" 這一術語是用來設計和布局時使用。 CSS 盒模型本質上是一個盒子,封裝周圍的 HTML 元素,它包括:邊距,邊框,填充,和實際內容。 盒模型允許我們在其它元素和周圍元素邊框之間的空間放置元素。

css樣式優先順序

!important>style>id>class

什麼是BFC?BFC的布局規則是什麼?如何創建BFC?BFC應用?

BFC 是 Block Formatting Context 的縮寫,即塊格式化上下文。 BFC 是CSS布局的一個概念,是一個環境,裡面的元素不會影響外面的元素。 布局規則:Box是CSS布局的對象和基本單位,頁面是由若干個Box組成的。元素的類型和display屬性,決定了這個Box的類型。不同類型的Box會參與不同的 Formatting Context 。 創建:浮動元素 display:inline-block position:absolute 應用: 1.分屬於不同的 BFC 時,可以防止 margin 重疊 2.清除內部浮動 3.自適應多欄布局

DOM、BOM對象

BOM(Browser Object Model) 是指瀏覽器對象模型,可以對瀏覽器窗口進行訪問和操作。使用 BOM,開發者可以移動窗口、改變狀態欄中的文本以及執行其他與頁面內容不直接相關的動作。 使 JavaScript 有能力與瀏覽器"對話"。 DOM (Document Object Model) 是指文檔對象模型,通過它,可以訪問 HTML 文檔的所有元素。 DOM 是 W3C (萬維網聯盟)的標准。 DOM 定義了訪問 HTML 和 XML 文檔的標准: "W3C 文檔對象模型(DOM)是中立於平台和語言的介面,它允許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。" W3C DOM 標准被分為 3 個不同的部分:

什麼是 XML DOM ? XML DOM 定義了所有 XML 元素的對象和屬性,以及訪問它們的方法。 什麼是 HTML DOM? HTML DOM 定義了所有 HTML 元素的對象和屬性,以及訪問它們的方法。

JS相關

js數據類型、typeof、instanceof、類型轉換

閉包(高頻)

閉包是指有權訪問另一個函數作用域中的變數的函數 ——《JavaScript高級程序設計》

當函數可以記住並訪問所在的詞法作用域時,就產生了閉包,

即使函數是在當前詞法作用域之外執行 ——《你不知道的JavaScript》

原型、原型鏈(高頻)

原型: 對象中固有的 __proto__ 屬性,該屬性指向對象的 prototype 原型屬性。

原型鏈: 當我們訪問一個對象的屬性時,如果這個對象內部不存在這個屬性,那麼它就會去它的原型對象里找這個屬性,這個原型對象又會有自己的原型,於是就這樣一直找下去,也就是原型鏈的概念。原型鏈的盡頭一般來說都是 Object.prototype 所以這就是我們新建的對象為什麼能夠使用 toString() 等方法的原因。

特點: JavaScript 對象是通過引用來傳遞的,我們創建的每個新對象實體中並沒有一份屬於自己的原型副本。當我們修改原型時,與之相關的對象也會繼承這一改變。

this指向、new關鍵字

this 對象是是執行上下文中的一個屬性,它指向最後一次調用這個方法的對象,在全局函數中, this 等於 window ,而當函數被作為某個對象調用時,this等於那個對象。 在實際開發中, this 的指向可以通過四種調用模式來判斷。

new

作用域、作用域鏈、變數提升

繼承(含es6)、多種繼承方式

(1)第一種是以 原型鏈的方式來實現繼承 ,但是這種實現方式存在的缺點是,在包含有引用類型的數據時,會被所有的實例對象所共享,容易造成修改的混亂。還有就是在創建子類型的時候不能向超類型傳遞參數。

(2)第二種方式是使用 借用構造函數 的方式,這種方式是通過在子類型的函數中調用超類型的構造函數來實現的,這一種方法解決了不能向超類型傳遞參數的缺點,但是它存在的一個問題就是無法實現函數方法的復用,並且超類型原型定義的方法子類型也沒有辦法訪問到。

(3)第三種方式是 組合繼承 ,組合繼承是將原型鏈和借用構造函數組合起來使用的一種方式。通過借用構造函數的方式來實現類型的屬性的繼承,通過將子類型的原型設置為超類型的實例來實現方法的繼承。這種方式解決了上面的兩種模式單獨使用時的問題,但是由於我們是以超類型的實例來作為子類型的原型,所以調用了兩次超類的構造函數,造成了子類型的原型中多了很多不必要的屬性。

(4)第四種方式是 原型式繼承 ,原型式繼承的主要思路就是基於已有的對象來創建新的對象,實現的原理是,向函數中傳入一個對象,然後返回一個以這個對象為原型的對象。這種繼承的思路主要不是為了實現創造一種新的類型,只是對某個對象實現一種簡單繼承,ES5 中定義的 Object.create() 方法就是原型式繼承的實現。缺點與原型鏈方式相同。

(5)第五種方式是 寄生式繼承 ,寄生式繼承的思路是創建一個用於封裝繼承過程的函數,通過傳入一個對象,然後復制一個對象的副本,然後對象進行擴展,最後返回這個對象。這個擴展的過程就可以理解是一種繼承。這種繼承的優點就是對一個簡單對象實現繼承,如果這個對象不是我們的自定義類型時。缺點是沒有辦法實現函數的復用。

(6)第六種方式是 寄生式組合繼承 ,組合繼承的缺點就是使用超類型的實例做為子類型的原型,導致添加了不必要的原型屬性。寄生式組合繼承的方式是使用超類型的原型的副本來作為子類型的原型,這樣就避免了創建不必要的屬性。

EventLoop

JS 是單線程的,為了防止一個函數執行時間過長阻塞後面的代碼,所以會先將同步代碼壓入執行棧中,依次執行,將非同步代碼推入非同步隊列,非同步隊列又分為宏任務隊列和微任務隊列,因為宏任務隊列的執行時間較長,所以微任務隊列要優先於宏任務隊列。微任務隊列的代表就是, Promise.then , MutationObserver ,宏任務的話就是 setImmediate setTimeout setInterval

原生ajax

ajax 是一種非同步通信的方法,從服務端獲取數據,達到局部刷新頁面的效果。 過程:

事件冒泡、捕獲(委託)

event.stopPropagation() 或者 ie下的方法 event.cancelBubble = true; //阻止事件冒泡

ES6

Vue

簡述MVVM

MVVM 是 Model-View-ViewModel 縮寫,也就是把 MVC 中的 Controller 演變成 ViewModel。Model 層代表數據模型, View 代表UI組件, ViewModel 是 View 和 Model 層的橋梁,數據會綁定到 viewModel 層並自動將數據渲染到頁面中,視圖變化的時候會通知 viewModel 層更新數據。

談談對vue生命周期的理解?

每個 Vue 實例在創建時都會經過一系列的初始化過程, vue 的生命周期鉤子,就是說在達到某一階段或條件時去觸發的函數,目的就是為了完成一些動作或者事件

computed與watch

watch 屬性監聽 是一個對象,鍵是需要觀察的屬性,值是對應回調函數,主要用來監聽某些特定數據的變化,從而進行某些具體的業務邏輯操作,監聽屬性的變化,需要在數據變化時執行非同步或開銷較大的操作時使用

computed 計算屬性 屬性的結果會被緩存,當 computed 中的函數所依賴的屬性沒有發生改變的時候,那麼調用當前函數的時候結果會從緩存中讀取。除非依賴的響應式屬性變化時才會重新計算,主要當做屬性來使用 computed 中的函數必須用 return 返回最終的結果 computed 更高效,優先使用

使用場景 computed :當一個屬性受多個屬性影響的時候使用,例:購物車商品結算功能 watch :當一條數據影響多條數據的時候使用,例:搜索數據

v-for中key的作用

vue組件的通信方式

父子組件通信

父->子 props ,子->父 $on、$emit` 獲取父子組件實例 parent、 parent 、children Ref 獲取實例的方式調用組件的屬性或者方法 Provide、inject` 官方不推薦使用,但是寫組件庫時很常用

兄弟組件通信

Event Bus 實現跨組件通信 Vue.prototype.$bus = new Vue() Vuex

跨級組件通信

$attrs、$listeners Provide、inject

常用指令

雙向綁定實現原理

當一個 Vue 實例創建時,Vue會遍歷data選項的屬性,用 Object.defineProperty 將它們轉為 getter/setter並且在內部追蹤相關依賴,在屬性被訪問和修改時通知變化。每個組件實例都有相應的 watcher 程序實例,它會在組件渲染的過程中把屬性記錄為依賴,之後當依賴項的 setter 被調用時,會通知 watcher重新計算,從而致使它關聯的組件得以更新。

v-model的實現以及它的實現原理嗎?

nextTick的實現

vnode的理解,compiler和patch的過程

new Vue後整個的流程

思考:為什麼先注入再提供呢??

答:1、首先來自祖輩的數據要和當前實例的data,等判重,相結合,所以注入數據的initInjections一定要在 InitState 的上面。2. 從上面注入進來的東西在當前組件中轉了一下又提供給後代了,所以注入數據也一定要在上面。

vm.[Math Processing Error]mount(vm.mount(vm.options.el) :掛載實例。

keep-alive的實現

作用:實現組件緩存

鉤子函數:

原理: Vue.js 內部將 DOM 節點抽象成了一個個的 VNode 節點, keep-alive 組件的緩存也是基於 VNode 節點的而不是直接存儲 DOM 結構。它將滿足條件 (pruneCache與pruneCache) 的組件在 cache 對象中緩存起來,在需要重新渲染的時候再將 vnode 節點從 cache 對象中取出並渲染。

配置屬性:

include 字元串或正則表達式。只有名稱匹配的組件會被緩存

exclude 字元串或正則表達式。任何名稱匹配的組件都不會被緩存

max 數字、最多可以緩存多少組件實例

vuex、vue-router實現原理

vuex 是一個專門為vue.js應用程序開發的狀態管理庫。 核心概念:

你怎麼理解Vue中的diff演算法?

在js中,渲染真實 DOM 的開銷是非常大的, 比如我們修改了某個數據,如果直接渲染到真實 DOM , 會引起整個 dom 樹的重繪和重排。那麼有沒有可能實現只更新我們修改的那一小塊dom而不要更新整個 dom 呢?此時我們就需要先根據真實 dom 生成虛擬 dom , 當虛擬 dom 某個節點的數據改變後會生成有一個新的 Vnode , 然後新的 Vnode 和舊的 Vnode 作比較,發現有不一樣的地方就直接修改在真實DOM上,然後使舊的 Vnode 的值為新的 Vnode 。

diff 的過程就是調用 patch 函數,比較新舊節點,一邊比較一邊給真實的 DOM 打補丁。在採取 diff 演算法比較新舊節點的時候,比較只會在同層級進行。 在 patch 方法中,首先進行樹級別的比較 new Vnode 不存在就刪除 old Vnode old Vnode 不存在就增加新的 Vnode 都存在就執行diff更新 當確定需要執行diff演算法時,比較兩個 Vnode ,包括三種類型操作:屬性更新,文本更新,子節點更新 新老節點均有子節點,則對子節點進行 diff 操作,調用 updatechidren 如果老節點沒有子節點而新節點有子節點,先清空老節點的文本內容,然後為其新增子節點 如果新節點沒有子節點,而老節點有子節點的時候,則移除該節點的所有子節點 老新老節點都沒有子節點的時候,進行文本的替換

updateChildren 將 Vnode 的子節點Vch和oldVnode的子節點oldCh提取出來。 oldCh和vCh 各有兩個頭尾的變數 StartIdx和EndIdx ,它們的2個變數相互比較,一共有4種比較方式。如果4種比較都沒匹配,如果設置了 key ,就會用 key 進行比較,在比較的過程中,變數會往中間靠,一旦 StartIdx>EndIdx 表明 oldCh和vCh 至少有一個已經遍歷完了,就會結束比較。

你都做過哪些Vue的性能優化?

你知道Vue3有哪些新特性嗎?它們會帶來什麼影響?

更小巧、更快速 支持自定義渲染器 支持搖樹優化:一種在打包時去除無用代碼的優化手段 支持Fragments和跨組件渲染

模板語法99%保持不變 原生支持基於class的組件,並且無需藉助任何編譯及各種stage階段的特性 在設計時也考慮TypeScript的類型推斷特性 重寫虛擬DOM 可以期待更多的編譯時提示來減少運行時的開銷 優化插槽生成 可以單獨渲染父組件和子組件 靜態樹提升 降低渲染成本 基於Proxy的觀察者機制 節省內存開銷

檢測機制 更加全面、精準、高效,更具可調試式的響應跟蹤

實現雙向綁定 Proxy 與 Object.defineProperty 相比優劣如何?

React

1、react中key的作用,有key沒key有什麼區別,比較同一層級節點什麼意思?

2、你對虛擬dom和diff演算法的理解,實現render函數

虛擬DOM 本質上是 JavaScript 對象,是對 真實DOM 的抽象表現。 狀態變更時,記錄新樹和舊樹的差異 最後把差異更新到真正的 dom 中 render函數:

3、React組件之間通信方式?

Context 提供了一個無需為每層組件手動添加 props ,就能在組件樹間進行數據傳遞的方法.如果你只是想避免層層傳遞一些屬性,組件組合( component composition )有時候是一個比 context 更好的解決方案。 5. 組件組合缺點:會使高層組件變得復雜

4、如何解析jsx

5、生命周期都有哪幾種,分別是在什麼階段做哪些事情?為什麼要廢棄一些生命周期?

componentWillMount、componentWillReceiveProps、componentWillUpdate在16版本被廢棄,在17版本將被刪除,需要使用UNSAVE_前綴使用,目的是向下兼容。

6、關於react的優化方法

使用return null而不是CSS的display:none來控制節點的顯示隱藏。保證同一時間頁面的DOM節點盡可能的少。

不要使用數組下標作為key 利用 shouldComponentUpdate 和 PureComponent 避免過多 render function ; render 裡面盡量減少新建變數和bind函數,傳遞參數是盡量減少傳遞參數的數量。 盡量將 props 和 state 扁平化,只傳遞 component 需要的 props (傳得太多,或者層次傳得太深,都會加重 shouldComponentUpdate 裡面的數據比較負擔),慎將 component 當作 props 傳入

使用 babel-plugin-import 優化業務組件的引入,實現按需載入 使用 SplitChunksPlugin 拆分公共代碼 使用動態 import ,懶載入 React 組件

7、綁定this的幾種方式

8、對fiber的理解

9、setState是同步還是非同步的

10、Rex、React-Rex

Rex的實現流程

用戶頁面行為觸發一個 Action ,然後 Store 調用 Recer ,並且傳入兩個參數:當前 State 和收到的 Action 。 Recer 會返回新的 State 。每當 state 更新之後, view 會根據 state 觸發重新渲染。

React-Rex:

Provider :從最外部封裝了整個應用,並向 connect 模塊傳遞 store 。 Connect :

11、對高階組件的理解

高階組件是參數為組件,返回值為新組件的函數。 HOC 是純函數,沒有副作用。 HOC 在 React 的第三方庫中很常見,例如 Rex 的 connect 組件。

高階組件的作用:

12、可以用哪些方式創建 React 組件?

React.createClass()、ES6 class 和無狀態函數

13、 React 元素與組件的區別?

組件是由元素構成的。元素數據結構是普通對象,而組件數據結構是類或純函數。

Vue與React對比?

數據流:

react 主張函數式編程,所以推崇純組件,數據不可變,單向數據流,

vue 的思想是響應式的,也就是基於是數據可變的,通過對每一個屬性建立Watcher來監聽,當屬性變化的時候,響應式的更新對應的虛擬dom。

監聽數據變化實現原理

組件通信的區別:jsx和.vue模板。

性能優化

vuex 和 rex 之間的區別?

從實現原理上來說,最大的區別是兩點:

Rex 使用的是不可變數據,而 Vuex 的數據是可變的。 Rex 每次都是用新的 state 替換舊的 state ,而 Vuex 是直接修改

Rex 在檢測數據變化的時候,是通過 diff 的方式比較差異的,而 Vuex 其實和Vue的原理一樣,是通過 getter/setter 來比較的(如果看 Vuex 源碼會知道,其實他內部直接創建一個 Vue 實例用來跟蹤數據變化)

瀏覽器從輸入url到渲染頁面,發生了什麼?

網路安全、HTTP協議

TCP UDP 區別

Http和Https區別(高頻)

GET和POST區別(高頻)

理解xss,csrf,ddos攻擊原理以及避免方式

XSS ( Cross-Site Scripting , 跨站腳本攻擊 )是一種代碼注入攻擊。攻擊者在目標網站上注入惡意代碼,當被攻擊者登陸網站時就會執行這些惡意代碼,這些腳本可以讀取 cookie,session tokens ,或者其它敏感的網站信息,對用戶進行釣魚欺詐,甚至發起蠕蟲攻擊等。

CSRF ( Cross-site request forgery ) 跨站請求偽造 :攻擊者誘導受害者進入第三方網站,在第三方網站中,向被攻擊網站發送跨站請求。利用受害者在被攻擊網站已經獲取的注冊憑證,繞過後台的用戶驗證,達到冒充用戶對被攻擊的網站執行某項操作的目的。

XSS避免方式:

CSRF 避免方式:

DDoS 又叫分布式拒絕服務,全稱 Distributed Denial of Service ,其原理就是利用大量的請求造成資源過載,導致服務不可用。

2. 前端js之event事件(一)

前言:有些事情看上去簡單甚至於平淡無奇,比如說愛情或者我們的生活可實際上卻很復雜。js裡面的event也是一樣,不信就列印一下一個平淡無奇的onclick裡麵包含的event,只要在方法內傳入參數event,或者e,還有ev然後列印,你就會發現一個新的天地。

核心內容:多種事件的運用場景解析

開始了

1吹牛逼

2吹牛逼

3也許我別來,你自然無恙

A:復雜多樣的滑鼠事件

應用:滑鼠事件很多,平時用個點擊就以為用過那就大錯特錯了,滑鼠事件不僅有原生的點擊,雙擊,移動,進入,移出,懸浮,可以列印event裡面的type查看,還有一些比如jq封裝的事件,這些事件而且會相互觸發,比如移動move是最容易被其他事件觸發,或者原生的拖拽事件,不僅有自己的事件,而且會觸發元素上的很多其他事件。

B:為什麼會這樣呢?

解析:第一本身不同事件類型但是相近的滑鼠操作就會同時觸發,第二在多層dom結構中的事件,由於本身事件的冒泡機制,由最底層的元素向上冒泡,到父元素到document到window,以至於類似事件不同方法但是同時觸發

C:怎麼解決

辦法:比如現象一:只想觸發最底層的元素的點擊事件,不觸發其父元素的點擊事件,解決方案阻止冒泡。現象二:類型相近事件相互觸發,導致方法重復執行,解決方案在易促發的事件的方法中可以加入條件判斷,是否已經執行過相同操作,如果有要麼直接return,如果還有其他操作判斷,可以將可能重復的那個操作進行重置。現象三:原生方法事件以及簡單事件相互交叉影響導致最後滑鼠事件失靈,定義的方法不能執行,頁面不可控制,解決方案單個功能實現後進行方法設為null如dom.onclick=null,然後設置dom對象釋放捕獲。

event事件實在太多太復雜了,正如人生一樣,可是有時候多一點細心多一點耐心,沒事多打打斷點和測試,我們會看得更加清晰,正如我若別來,你自然無恙,越是糾結,越是沉淪,往往簡單最好。

事件人生,人生事件,簡單復雜,復雜簡單,一正一反,經歷了自然會成長,花香了自然蝶飛舞。

3. 《web前端筆記30》css三欄布局、左右兩欄寬度固定,中間自適應

三欄布局一般指的是頁面中一共有三欄, 左右兩欄寬度固定,中間自適應的布局 ,三欄布局的具體實現:

利用浮動和負邊距來實現。父級元素設置左右的 padding,三列均設置向左浮動,中間一列放在最前面,寬度設置為父級元素的寬度,因此後面兩列都被擠到了下一行,通過設置 margin 負值將其移動到上一行,再利用相對定位,定位到兩邊。

4. 前端的touch事件有哪些呢

// 手指在Body中點擊時的記錄var startX, startY;$("body").on("touchstart", function(e) { startX = e.originalEvent.changedTouches[0].pageX; // 記錄 最初點擊時第一個觸摸點的x坐標 startY = e.originalEvent.changedTouches[0].pageY; // 記錄 最初點擊時第一個觸摸點的y坐標});// 阻止touchmove時的body默認事件$('body').on('touchmove', function(e) { e.preventDefault();
});// 記錄/操作 當手指離開的操作 $('body')在操作的時候換成具體的選擇器如$('#box')$("body").on("touchend", function(e) { var moveEndX = e.originalEvent.changedTouches[0].pageX; // 手指離開時的x坐標 var moveEndY = e.originalEvent.changedTouches[0].pageY; // 手指離開時的y坐標 var X = moveEndX - startX; // 離開時的x坐標 - 開始觸摸的x坐標 = 橫向偏移值 var Y = moveEndY - startY; // 離開時的y坐標 - 開始觸摸的y坐標 = 縱向偏移值 if ( Math.abs(X) > Math.abs(Y) && X > 0 ) { // 從左到右 alert("left 2 right");
} else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) { // 從右到左 alert("right 2 left");
} else if ( Math.abs(Y) > Math.abs(X) && Y > 0) { // 從上到下 alert("top 2 bottom");
} else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) { // 從下到上 alert("bottom 2 top");
} else{ alert("just touch");
}
});

5. web前端的事件原理是什麼呢

在web控制項發生事件時,客戶端採用提交的形式將數據交回服務端,服務端先調用Page_Load事件,然後根據傳回的狀態信息自動調用服務端事件自動傳回是當我們在點擊客戶端控制項時,採用提交表單的形式將數據直接傳回到務端
只有通過自動傳回才能實現服務端事件的機制,如果沒有自動回傳機制就只能調用客戶端事件,而不能調用服務端事件

6. 《web前端筆記7》js字元—獲取、查找、遍歷、提取、替換方法總結

(1)字元串就是零個或多個排在一起的字元。

(2)放在單引號或雙引號之中。 'abc' "abc"。

(3)單引號字元串的內部,可以使用雙引號。

(4)雙引號字元串的內部,可以使用單引號。

(5)反引號`` :反引號允許跨行。

反引號允許字元串跨越多行並可以使用

${…} 在字元串中嵌入表達式。

(1)charAt 方法返回指定位置的字元,參數是從0開始編號的位置。

找一個字元串中的某個位置是那個字元串。

charCodeAt:返回字元串指定位置的 Unicode 碼點(十進製表示)

(2)[]

字元串可以被視為字元串數組,因此可以用數組的方括弧運算符,用來返回某個位置的字元

但是字元串只是數組的相似性而已實際上、沒辦法改變字元串中的某個字元

length 只是返回了字元串的長度,該屬性沒辦法改變

字元串使用Unicode字元集,js內部所有的都是Unicode表示的。

JavaScript中的字元串使用的是 UTF-16 編碼。

toLowerCase() 和 toUpperCase()方法可以改變大小寫。

String對象是js原生提供的三個包裝對象之一。用來生成字元串對象。

(1)構造函數

字元串對象是一個類數組對象,很像數組,但不是真正的數組。

(2)將任意的值轉成字元

用於連接兩個字元串,返回一個新字元串,不改變原字元串。

從原字元串取出子字元串並返回,不改變原字元串。

它的第一個參數是子字元串的開始位置,

第二個參數是子字元串的結束位置(不含該位置)。

如果省略第二個參數,則表示子字元串一直到原字元串結束。

用於從原字元串取出子字元串並返回,不改變原字元串,跟slice方法很相像。

它的第一個參數表示子字元串的開始位置,

第二個位置表示結束位置(返回結果不含該位置)

如果省略第二個參數,則表示子字元串一直到原字元串結束。

區別:slice 和 substring的區別?

slice:

如果參數是負值,表示從結尾開始倒數計算的位置,即該負值加上字元串長度。

如果第一個參數大於第二個參數(正數情況下),slice()方法返回一個空字元串。

substring:

如果第一個參數大於第二個參數,substring方法會自動更換兩個參數的位置。

如果參數是負數,substring方法會自動將負數轉為0。

由於這些規則違反直覺,因此不建議使用substring方法,應該優先使用slice。

總結:獲取子字元串,使用 slice 或 substring。

用於確定一個字元串在另一個字元串中第一次出現的位置,

返回結果是匹配開始的位置。如果返回-1,就表示不匹配。

indexOf方法還可以接受第二個參數,表示從該位置開始向後匹配。

lastIndexOf

lastIndexOf方法的用法跟indexOf方法一致,主要的區別是lastIndexOf從尾部開始匹配,indexOf則是從頭部開始匹配。

總結:查找子字元串時,使用 indexOf 或 includes/startsWith/endsWith 進行簡單檢查。

endsWith 用來判斷當前字元串是否是以另外一個給定的子字元串「結尾」的,根據判斷結果返回 true 或 false。

用於去除字元串兩端的空格,返回一個新字元串,不改變原字元串。

toLowerCase方法用於將一個字元串全部轉為小寫,

toUpperCase則是全部轉為大寫。

它們都返回一個新字元串,不改變原字元串

split方法按照給定規則分割字元串,返回一個由分割出來的子字元串組成的數組。

如果分割規則為空字元串,則返回數組的成員是原字元串的每一個字元。

如果省略參數,則返回數組的唯一成員就是原字元串。

split方法還可以接受第二個參數,限定返回數組的最大成員數。

返回一個新字元串,表示將原字元串重復n次。

字元串補全長度的功能。如果某個字元串不夠指定長度,

會在頭部或尾部補全。padStart()用於頭部補全,padEnd()用於尾部補全。

trimStart()消除字元串頭部的空格,

trimEnd()消除尾部的空格。

返回一個由替換值(replacement)替換部分或

所有的模式(pattern)匹配項後的新字元串。

模式可以是一個字元串或者一個正則表達式,

替換值可以是一個字元串或者一個每次匹配都要調用的回調函數。

如果pattern是字元串,則僅替換第一個匹配項.

web前端筆記4-有講 如果感興趣、請參考之前文章

7. 前端大屏項目自適應(個人筆記)

仔細觀察 網易有數 , 網路suger ,他們都採用了css3的縮放transform: scale(X)屬性,看到這是不是有種豁然開朗的感覺。
於是我們只要監聽瀏覽器的窗口大小,然後控制變化的比例就好了。

以React的寫法為例

監聽window的resize事件最好加個節流函數debounce

然後一個簡單的組件就封裝好了

樣式文件index.less

只要把頁面放在這個組件中,就能實現跟大廠們類似的效果。這種方式下不管屏幕有多大,解析度有多高,只要屏幕的比例跟你定的比例一致,都能呈現出完美效果。而且開發過程中,樣式的單位也可以直接用px,省去了轉換的煩惱~~~
最後附上npm鏈接: https://www.npmjs.com/package/react-scale-box

8. React 合成事件與原生事件

專心搞前端的第14天
在看《深入react技術棧》的時候試了下2.1章的在react中使用原生事件。發現一些寫法不好使了,所以查了下文檔,順便粗略看了下事件。在此做下記錄。

原書在ref的用法已不再支持,使用React.createRef()後寫了示例如下:

在jsx中書寫的事件是合成事件,如果要獲取原生事件需使用e.nativeEvent。react並沒有將真實事件綁定在元素上,而是將真實事件委託至了document中。

所以如果在原生事件中使用stopPropagation阻止冒泡的話,合成事件不再觸發。如果在合成事件中使用stopPropagation。其實使用的並不是原生的stopPropagation。無法阻止原生事件觸發。

9. 前端學習筆記style,currentStyle,getComputedStyle的區別和用法

getComputedStyle與style的區別

我們使用element.style也可以獲取元素的CSS樣式聲明對象,但是其與getComputedStyle方法還有有一些差異的。

只讀與可寫
正如上面提到的getComputedStyle方法是只讀的,只能獲取樣式,不能設置;而element.style能讀能寫,能屈能伸。

獲取的對象范圍
getComputedStyle方法獲取的是最終應用在元素上的所有CSS屬性對象(即使沒有CSS代碼,也會把默認的祖宗八代都顯示出來);而element.style只能獲取元素style屬性中的CSS樣式。因此對於一個光禿禿的元素<p>,getComputedStyle方法返回對象中length屬性值(如果有)就是190+(據我測試FF:192, IE9:195, Chrome:253, 不同環境結果可能有差異), 而element.style就是0。