你應該知道的前端小知識

2021-01-07 尚學堂前端學院

1.JS為什麼單線程

一個簡單的原因就是,js在設計之初只是進行一些簡單的表單校驗,這完全不需要多線程,單線程完全可以勝任這項工作。即便後來前端發展迅速,承載的能力越來越多,也沒有發展到非多線程不可的程度。

而且還有一個主要的原因,設想一下,如果js是多線程的,在運行時多個線程同時對DOM元素進行操作,那具體以哪個線程為主就是個問題了,線程的調度問題是一個比較複雜的問題。

HTML5新的標準中允許使用new Worker的方式來開啟一個新的線程,去運行一段單獨的js文件腳本,但是在這個新線程中嚴格的要求了可以使用的功能,比如說他只能使用ECMAScript, 不能訪問DOM和BOM。這也就限制死了多個線程同時操作DOM元素的可能。

2.使用css寫出一個三角形角標

元素寬高設置為0,通過border屬性來設置,讓其它三個方向的border顏色為透明或者和背景色保持一致,剩餘一條border的顏色設置為需要的顏色。

3.水平垂直居中

我一般只使用兩種方式 定位 或者 flex,我覺得夠用了。

父級控制子集居中

4. css一行文本超出...

5.多行文本超出顯示...

6.IOS手機容器滾動條滑動不流暢

7.修改滾動條樣式

隱藏div元素的滾動條

div::-webkit-scrollbar 滾動條整體部分

div::-webkit-scrollbar-thumb 滾動條裡面的小方塊,能向上向下移動(或往左往右移動,取決於是垂直滾動條還是水平滾動條)

div::-webkit-scrollbar-track 滾動條的軌道(裡面裝有Thumb)

div::-webkit-scrollbar-button 滾動條的軌道的兩端按鈕,允許通過點擊微調小方塊的位置。

div::-webkit-scrollbar-track-piece 內層軌道,滾動條中間部分(除去)

div::-webkit-scrollbar-corner 邊角,即兩個滾動條的交匯處

div::-webkit-resizer 兩個滾動條的交匯處上用於通過拖動調整元素大小的小控制項

注意此方案有兼容性問題,一般需要隱藏滾動條時我都是用一個色塊通過定位蓋上去,或者將子級元素調大,父級元素使用overflow-hidden截掉滾動條部分。暴力且直接。

8.解決ios audio無法自動播放、循環播放的問題

ios手機在使用audio或者video播放的時候,個別機型無法實現自動播放,可使用下面的代碼hack。

9.隱藏頁面元素

display-none: 元素不會佔用空間,在頁面中不顯示,子元素也不會顯示。

opacity-0: 元素透明度將為0,但元素仍然存在,綁定的事件仍舊有效仍可觸發執行。

visibility-hidden:元素隱藏,但元素仍舊存在,佔用空間,頁面中無法觸發該元素的事件。

10.前端工程化

一提到前端工程化很多人想到的都是webpack,這是不對的,webpack僅僅是前端工程化中的一環。在整個工程化過程中他幫我們解決了絕大多數的問題,但並沒有解決所有問題。

前端工程化是通過工具提升效率,降低成本的一種手段。

近些年被廣泛的關注和探討,究其原因主要是因為現代化前端應用功能要求不斷提高,業務邏輯日益複雜,作為當下網際網路時代唯一不可或缺的技術,前端可以說是佔據了整個開發行業的半壁江山。從傳統的網站,到現在的H5,移動App,桌面應用,以及小程序。前端技術幾乎是無所不能的全面覆蓋。

在這些表象的背後呢,實際上是行業對開發人員的要求發生了天翻地覆的變化,以往前端寫demo,套模板,調頁面這種刀耕火種的方式已經完全不符合當下對開發效率的要求,前端工程化就是在這樣一個背景下被提上檯面,成為前端工程師必備的手段之一。

一般來說前端工程包含,項目初始化,項目開發,集成,構建,打包,測試,部署,監控等流程。工程化就是以工程的角度來解決這些問題。比如項目初始化我們一般使用

npm init, 創建頁面模板使用plop,我們喜歡使用ES6+開發,但是需要通過babel編碼成ES5,持續集成的時候我們使用git/ci,但是為了保持開發規範我們引入了ESLint,部署一般使用git/cd或者jenkins等等。

前端工程化是一個比較大的話題,後面我們會單開話題來講。

11.contenteditable

html中大部分標籤都是不可以編輯的,但是添加了contenteditable屬性之後,標籤會變成可編輯狀態。

不過通過這個屬性把標籤變為可編輯狀態後只有input事件,沒有change事件。也不能像表單一樣通過maxlength控制最大長度。我也忘記我在什麼情況下用到過了,後面想起來再補吧。

12.calc

這是一個css屬性,我一般稱之為css表達式。可以計算css的值。最有趣的是他可以計算不同單位的差值。很好用的一個功能,缺點是不容易閱讀。接盤俠沒辦法一眼看出20px是啥。

13.Date對象

獲取當前時間毫秒值

創建Date對象的兼容性問題。

14.Proxy和Object.defineProperty區別

Proxy的意思是代理,我一般叫他攔截器,可以攔截對象上的一個操作。用法如下,通過new的方式創建對象,第一個參數是被攔截的對象,第二個參數是對象操作的描述。實例化後返回一個新的對象,當我們對這個新的對象進行操作時就會調用我們描述中對應的方法。

Proxy區別於Object.definedProperty。

Object.defineProperty只能監聽到屬性的讀寫,而Proxy除讀寫外還可以監聽屬性的刪除,方法的調用等。

通常情況下我們想要監視數組的變化,基本要依靠重寫數組方法的方式實現,這也是Vue的實現方式,而Proxy可以直接監視數組的變化。

Proxy是以非入侵的方式監管了對象的讀寫,而defineProperty需要按特定的方式定義對象的屬性。

15.Reflect

他是ES2015新增的對象,純靜態對象也就是不能被實例畫,只能通過靜態方法的方式調用,和Math對象類似,只能類似Math.random()的方式調用。

Reflect內部封裝了一系列對對象的底層操作,一共14個,其中1個被廢棄,還剩下13個。

Reflect的靜態方法和Proxy描述中的方法完全一致。也就是說Reflect成員方法就是Proxy處理對象的默認實現。

Proxy對象默認的方法就是調用了Reflect內部的處理邏輯,也就是如果我們調用get方法,那麼在內部,proxy就是將get原封不動的交給了Reflect,如下。

Reflect和Proxy沒有絕對的關係,我們一般將他們兩個放在一起講是為了方便對二者的理解。

那為什麼會有Reflect對象呢,其實他最大的用處就是提供了一套統一操作Object的API。

判斷對象是否存在某一個屬性,可以使用in操作符,但是不夠優雅,還可以使用

Reflect.has(obj, name); 刪除一個屬性可以使用delete,也可以使用

Reflect.deleteProperty(obj, name); 獲取所有屬性名可以使用Object.keys, 也可以使用

Reflect.ownKeys(obj); 我們更推薦使用Reflect的API來操作對象,因為他才是未來。

16.解析get參數

通過replace方法獲取url中的參數鍵值對,可以快速解析get參數。

17.解析連接url

可以通過創建a標籤,給a標籤賦值href屬性的方式,獲取到協議,pathname,origin等location對象上的屬性。

18.localStorage

localStorage是H5提供的永久存儲空間,一般最大可存儲5M數據,並且支持跨域隔離,他的出現極大提高了前端開發的可能性。 localStorage的使用很多人都知道setItem,getItem, removeItem, 但他也可以直接以成員的方式操作。

localStorage滿了的情況下仍繼續存儲並不會覆蓋其他的值,而是直接報錯

(QuotaExceededError),並且當前存儲的值也會被清空。瀏覽器支持每個域名下存儲5M數據。

19.sessionStorage

sessionStorage和localStorage的區別是,存在當前會話,很多人理解的是瀏覽器關閉,這是不對的,假設你在A頁面存儲了sessionStorage,新開選項卡將A頁面的連結粘貼進去打開頁面,sessionStorage也是不存在的。

所以sessionStorage存在的條件是頁面間的跳轉,A頁面存儲了sessionStorage,他要通過超連結或者location.href或者window.open來打開另一個同域頁面才能訪問sessionStorage。

這一點在原生嵌套H5的開發模式中尤為重要,如果以新開webview的方式打開頁面,很可能sessionStorage就沒有了。

20.會話cookie

cookie在設置的時候如果不設置過期時間,就表示是個會話cookie,以前我以為關閉瀏覽器會話cookie就消失了,然而...喜提bug一個。

在多數情況下windows系統或者安卓系統確實是這樣的。但是在macOS系統或者ios系統中,關閉瀏覽器並不會清除掉會話cookie,結束瀏覽器進程才行。

21.標籤模板字符串

模板字符串支持在前面添加一個函數,第一個參數是一個有固定內容組成的數組,後面參數依次為傳入的變量,函數返回值為模板字符串真正展示的值。不過這個功能個人感覺沒啥用。

22.字符串常用的幾個方法

includes(); 字符串中是否包含某個字符串,這個不說了,其實就是indexOf的替代方案,用起來更優雅,

startsWith(); 字符串是否為某個字符串開始,我一般用它判斷url是否有http

endsWith(); 字符串是否為某個字符串結尾。判斷後綴名的時候尤其有效。

repeat(number); 得到一個重複number次的字符串。額...我也不知道什麼時候有用,一般我用它造測試數據。

'abc'.padEnd(5, '1'); // abc11; 用給定的字符串在尾部拼接到指定長度,第一個參數為長度,第二個參數為用於拼接的值。

'abc'.padStart(5, '1'); // 11abc; 用給定的字符串在首部拼接到指定長度第一個參數為長度,第二個參數為用於拼接的值。首部補0?

23.數組快速去重

應該很多人都知道這個,數組轉換成Set, 再轉換為數組,不過這種去重方式只能去除基本數據類型組成的數組。

24.Object.keys, values, entries

一般我們常用Object.keys,返回一個對象的鍵組成的數組,其實還有Object.values,返回對象值組成的數組,Object.entries 將對象轉成數組,每個元素是鍵值對組成的數組,可以使用此功能快速將對象轉為Map

25.Object.getOwnPropertyDescriptors

獲取對象的描述信息

Object.assign 複製時,將對象的屬性和方法當做普通屬性來複製,並不會複製完整的描述信息,比如this。

使用 Object.getOwnPropertyDescriptors 獲取完整描述信息

26.BigInt

JavaScript可以處理的最大數字是2的53次方 - 1,這一點我們可以在Number.MAX_SAFE_INTEGER 中看到。

更大的數字則無法處理,ECMAScript2020引入BigInt數據類型來解決這個問題。通過把字母n放在末尾, 可以運算大數據。

BigInt可以使用算數運算符進行加、減、乘、除、餘數及冪等運算。它可以由數字和十六進位或二進位字符串構造。此外它還支持 AND、OR、NOT 和 XOR 之類的按位運算。唯一無效的位運算是零填充右移運算符。

BigInt是一個大整數,所以他不能用來存儲小數。

27.??合併空運算符

假設變量a不存在,我們希望給系統一個默認值,一般我們會使用||運算符。但是在javascript中空字符串,0,false都會執行||運算符,所以ECMAScript2020引入合併空運算符解決該問題,只允許在值為null或未定義時使用默認值。

28.?可選鏈運算符

業務代碼中經常會遇到這樣的情況,a對象有個屬性b, b也是一個對象有個屬性c,我們需要訪問c,經常會寫成 a.b.c,但是如果f不存在時,就會出錯。

ECMAScript2020定義可選鏈運算符解決該問題,通過在.之前添加一個?將鍵名變成可選

29.import

import是ECMAScript2015當中定義的一套ES Module模塊系統,語法特性絕大多數瀏覽器已經支持了,通過給script標籤添加type=module的屬性就可以使用ES Module的標準去執行javascript代碼了。

在ES Module規範下,會採用嚴格模式(use strict)運行javascript代碼。每個ES Module都運行在單獨的作用域中,也就意味著變量間不會互相干擾。外部js文件是通過CORS的方式請求的,所以要求我們外部的js文件地址要支持跨域請求,也就是文件伺服器要支持CORS。我們可以在任意網站控制臺輸入下面代碼。

可以發現在network中請求了

ES Module的script標籤會延遲腳本加載,等待網頁請求完資源之後才執行,和使用deffer的方式加載資源相同。

需要注意的是,import {} from 'xx' 導入模塊的時候,並不是對象的解構,而是import的固定語法,這一點很多人容易弄錯。

並且ECMAScript2020中import開始支持動態導入功能,在此之前import只能寫在模塊代碼的頂部,一開始就要聲明模塊依賴的其它模塊。支持動態引入後就可以按需引入對應的模塊,這個功能我們早在SPA中就已經用到了。動態導入返回的是一個Promise。

a.js

b.js

30. 0.1 + 0.2 === 0.3 // false

在JS當中,Number類型實際上是double類型,運算小數時存在精度問題。因為計算機只認識二進位,在進行運算時,需要將其他進位的數值轉換成二進位,然後再進行計算

小數用二進位表達時是無窮的。

雙精度浮點數的小數部分最多支持53位二進位位,所以兩者相加後,因浮點數小數位的限制而截斷的二進位數字,再轉換為十進位,就成了 0.30000000000000004,這樣在進行算術計算時會產生誤差。

ES6 在Number對象上面,新增一個極小的常量Number.EPSILON。根據規格,它表示 1 與大於 1 的最小浮點數之間的差。對於64位浮點數來說,大於1的最小浮點數相當於二進位的1.00..001,小數點後面有連續51個零。這個值減去1之後,就等於2的-52次方。

Number.EPSILON實際上是 JavaScript 能夠表示的最小精度。誤差如果小於這個值,就可以認為已經沒有意義了,即不存在誤差了。

引入一個這麼小的量的目的,在於為浮點數計算,設置一個誤差範圍。我們知道浮點數計算是不精確的。

Number.EPSILON可以用來設置「能夠接受的誤差範圍」。比如,誤差範圍設為 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果兩個浮點數的差小於這個值,我們就認為這兩個浮點數相等。

作者:隱冬來源:掘金著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

相關焦點

  • 邏輯思維能力不強的女生是否應該學習前端知識
    首先,從事前端崗位也需要編程,而且需要掌握的知識面也比較廣,隨著移動網際網路和大數據的發展,前端崗位對於編程的要求也在不斷提升,不僅需要掌握Web前端開發知識,還需要掌握移動端的開發知識,這部分內容還是比較多的,涉及到Android開發、iOS開發和各種移動平臺的二次開發。
  • Web前端知識體系梳理,值得收藏
    你如何去合理的篩選、梳理這些獲得的信息,又如何去知道自己現在還缺什麼信息?到這裡就應該提出本文的主題 —— 知識體系 。其實無論針對哪個知識領域,它都是有一套完整的、成型的知識體系和標準作為支撐的,例如數學、建築、醫學、機械等等,當然包括計算機編程,其中肯定包括前端開發。
  • 前端開發者應該知道的 CSS 小技巧
    (點擊上方公眾號,可快速關注)英文:Matt Smith  譯文:伯樂在線專欄作者 - cucr如有好文章投稿,請點擊 → 這裡了解詳情如需轉載,發送「轉載」二字查看說明一些小技巧讓你的:.nav li:not(:last-child) {     border-right: 1px solid #666;}當然,你可以使用.nav li + li 或者 .nav li:first-child ~ li, 但是使用 :not() 的意圖特別清晰,CSS選擇器按照人類描述它的方式定義邊框。
  • Web前端初學者應該知道的學習內容(上)
    今天我就為準備學習Web前端的初學者們準備了這篇Web前端的學習秘訣,讓我們一起來看一看! 2、Web前端開發 HTML-CSS:開發一個網站,你首先要知道的是 HTML (由它構成一個網頁)和 CSS
  • 前端開發的初學者是否需要學習後端知識
    首先,前端開發可以劃分為三個開發階段,第一個階段的前端開發任務往往由後端開發人員來完成,此時的前端開發並不複雜,任務量也相對比較小,第二個階段是Web2.0時代,前端開發的團隊規模有了明顯的擴大,前端開發崗位得到了快速的發展,整個Web開發也開始走角色化開發路線,第三個階段是移動網際網路時代背景下
  • 學習前端編程難嗎,分享職業生涯心得,讓你知識快速成長
    分享職業生涯心得,讓你知識快速成長學習前端編程難嗎,我能學會嗎?我英文不好能不能學習前端編程?我的回答是:能!我可以肯定的告訴你,我們學習前端編程,又不是學習外語,雖然說裡面代碼很多都是英文代表的,你就把它當作一個符號,實在不明白怎麼回事,我們不是還有一個非常強大的中英文互譯軟體嗎!其實代碼中的英文是沒有多少的,最多也就不超過一千個常用的英文單詞,經常的代碼裡敲敲,時間長就記住了。你不要一看到一堆英文代碼的時候就覺得頭要暈掉了,完全沒有必要。
  • 你應該知道的育嬰小知識
    你應該知道的育嬰小知識 嬰兒推車在外有以下缺點: (1)、孩子的肺成了汽車尾氣的吸塵器,你可知道嬰兒推車的高度是汽車尾氣濃度最大的位置,可能會使孩子吸進更多的尾汽與灰塵。 (2)、孩子在嬰兒推車坐時,其視線大多是大人的腿、鞋,而仰頭看事物,容易使陽光直射眼內,而陽光中的青光對孩子的眼睛傷害極大。
  • 小白如何學習web前端開發知識
    在掌握基礎模塊的基礎上,Web前端工程師還必須進一步將技能層次化、系統化,從而能夠視線頁面架構、移動頁面開發等等任務。不僅新人小白需要努力,就連已經入職0~3年的前端開發工程師,也需要不斷學習了解前端高階知識和技能,不斷修煉自身武功。
  • 「知了堂」成都前端開發培訓怎麼選?這5點你應該知道!
    因此,參加前端培訓就成了快速就業的捷徑,那麼,在成都前端開發培訓機構哪家好?怎麼選擇更靠譜?建議大家可以考慮以下幾個方面:1、是否可以在線下面授和與小班教學?當前成都的網絡前端培訓機構數量眾多,層次多樣。
  • 學好前端,這5點你必須要知道!
    有的時候自認為學會了,其實只是學會了一些皮毛,再深層一點的知識就無法掌握了。 如果一直抱著這樣的心態學習,也許你會好不容易「啃」完了前端知識,覺得該學的都學會了,但是出去找工作,就一問三不知。 面試屢次碰壁後,便得出「前端工作太難找了」,「前端工作已飽和」之類的消極結論。
  • 寫給想成為前端工程師的同學們―前端工程師是做什麼的?
    然而這並不能怪我,因為C語言的教程並沒有任何一言半語來告訴我這一點,我也不知道學習了C語言的語法之後接下來還應該學習些什麼。相對來說,Web開發更吸引我,因為不需要安裝任何環境,只需要在文本編輯器裡面輸入一些字符,保存後打開瀏覽器,馬上就能看到豐富的視覺效果,這就是前端的優勢,你所做的努力立即就能看得見。
  • 前端新手教程!如何快速入門web前端
    所以這篇文章我想分享一些初學者應該怎麼學web,怎麼入門的個人經驗。心態和個人的一些學習方法先說心態問題,經常看到網上很多說前端容易,所以想來學習的。其實,目前隨著前後端分離,前端也逐漸趨向工程化,並不是嵌套在後端項目中寫寫htmlcss就可以的了,需要學習的東西也越來越多。
  • 你應該知道的 NPM 知識都在這!
    ,提升前端技能)作者:程式設計師成長指北 公號 / koala為什麼寫這篇文章很多 Node.js 開發者,都知道有 package.json 這個文件,也多少都了解一些 npm 知識,但是可能沒有系統的學習過,這部分的知識對於開發一個  cli 工具,發布自己的 npm 包都很常用,開發中也會經常用到npm script內容,系統的學習一下確實會有所幫助
  • 各種前端框架 您應該選擇哪個?
    用編程的話來說,所有操作都可以分為前端和後端。前者用於處理網站或應用程式的客戶端,而後者則用於伺服器端。前端開發人員的主要關注點包括用戶界面(UI),響應式Web設計,可訪問性和兼容性。所有這些都不容易管理-特別是對於初學者。幸運的是,如今有很多前端框架可以幫助您!在此詳細指南中,我們將向您介紹最流行的前端框架。擁有所有信息肯定會幫助您做出正確的選擇。
  • 一名合格的前端開發工程師應該掌握的8個技能
    近幾年來,Web前端發展迅速,從業人員薪資一再飆升吸引了人們的廣泛加入。不過隨著網際網路技術的發展以及企業需求升級,想要成為高薪Web前端工程師變得不再簡單,前端人員所需要掌握的技能也在增多,接下來千鋒廣州HTML5大前端培訓小編就給大家分享一個合格前端人員必備的技能。
  • 前端小知識——地圖坐標轉換
    LBS,基於位置的服務(Location Based Service),近年來已經無處不在,尤其是我們前端,相信或多或少都有接觸一些地圖API服務,比如高德、百度啊、谷歌啊~ 但是用的時候可能看到下面這些字眼:比如BD09、火星坐標、WGS84……不由得還是蒙圈了啊
  • 你應該收藏的web前端面試題
    當然,初始化樣式會對SEO有一定的影響,但魚和熊掌不可兼得,但力求影響最小的情況下初始化。  選擇器{屬性1:值1;屬性2:值2;……}9.你做的頁面在哪些流覽器測試過?這些瀏覽器的內核分別是什麼?數據格式簡單, 易於讀寫, 佔用帶寬小{'age':'12', 'name':'back'}   2016年Web前端面試題目匯總以下是收集一些面試中經常會遇到的經典面試題以及自己面試過程中無法解決的問題,通過對知識的整理以及經驗的總結,重新鞏固自身的前端基礎知識,如有錯誤或更好的答案,歡迎指正。
  • 前端小知識:為什麼你寫的 height:100% 不起作用?
    (點擊上方公眾號,可快速關注)作者:JiaXinYihttps://segmentfault.com/a/1190000012707337這個知識不算冷門的,但是用的時候可能還是會有些懵逼,不能生效時搜一搜就能找到答案了,但是你真的懂了嗎?
  • 前端工程師面臨巨大危機,前端真的會被淘汰嗎?看看大咖們怎麼說
    真正的前端開發並不是傻瓜式的網頁生成可以取代的,在這個前端開發快速發展的網際網路時代,你還認為前端開發只是切網頁的,那你就大錯特錯了。其實是前後端分離後產物,現在的後端只負責產出數據,那麼和頁面相關的邏輯轉換就需要前端繼續實施了,更高級的就需要知道框架的選型以及業務模塊的封裝。
  • 如何系統的學習前端?這裡都幫你整理好了
    別焦慮,今天千鋒廣州小編就來給大家系統的分析講一下如何如何系統的學習前端。入門前端開發主要需要學習 HTML,CSS 和 JavaScript 三大件。之後學習前端主流框架的使用,並基於已學內容開發一個小項目進行實戰。當你把這些學習並理解透徹以後,也就算真正地入門前端了。