問題先導(dǎo)
html標(biāo)簽的
src
屬性和href
屬性的區(qū)別?【html
】css選擇器有哪些?這些選擇器的優(yōu)先級如何判斷?【
css
】js的基本數(shù)據(jù)類型有哪些?有何區(qū)別?【
js
】-
合并兩個有序數(shù)組【
算法
】給定兩個有序整數(shù)數(shù)組
nums1
和nums2
,請你將nums2
合并到nums1
中,使nums1
成為一個有序數(shù)組。
知識梳理
html標(biāo)簽的src
屬性和href
屬性的區(qū)別?
src
屬性是source的縮寫,意為來源,一般作為媒體元素HTMLDediaElement
的媒體資源映射URL。比如圖片、腳本的資源路徑:
<img src="images/like.gif">
<iframe src="inner.html">
<script src="index.min.js"></script>
src
加載媒體資源時是阻塞式的,也就是頁面的其他資源會暫停處理,這就是為什么一般把script
腳本標(biāo)簽放到文檔末尾加載的一個原因。
而href
是Hypetext Reference
的縮寫,意為超文本引用,由于是非媒體資源,外部引用,也就是頁面無需呈現(xiàn)出來的資源,所以加載這種資源的時候是非阻塞式的。比如link
和a
標(biāo)簽:
<link rel="stylesheet" src="style/main.css">
<a href="./home/login">login</a>
總結(jié)來說就是,src
屬性是媒體資源的路徑映射,是阻塞式加載的,而href
是超鏈,是非阻塞式的。
我們可以理解為媒體資源是需要實實在在顯示在頁面上的,是DOM結(jié)構(gòu)中的實實在在的數(shù)據(jù),因此會阻塞加載,而超鏈相當(dāng)于一個屬性,一條引用,并不需要把真實的資源呈現(xiàn)到頁面上,也就無需阻塞頁面加載了。
值得注意的一問題是,js腳本并不是媒體資源,也不是DOM需要的數(shù)據(jù),為什么js
腳本要用src
而css
就可以用href
呢?實際上,這是設(shè)計之初的決定,可能設(shè)計者認(rèn)為js腳本的執(zhí)行會改變頁面,也就是改變DOM,當(dāng)然需要隨頁面一起加載,而CSS只是頁面的樣式,并不會改變DOM,也就屬于超鏈了,從這層含義理解,就知道是否阻塞頁面和引用的資源大小無關(guān)了,而是和是否實際改變了頁面DOM有關(guān)。
標(biāo)簽:HTML、資源加載
css選擇器有哪些?如何判斷優(yōu)先級?
四類選擇器
css選擇器可以分為四大類:
- 基本選擇器
- 分組選擇器
- 組合選擇器
- 偽選擇器
最常用的就是基本選擇器,一般來說有五種基本選擇器:
- 通用選擇器:
*
,匹配所有元素 - 元素選擇器:使用元素名稱進行元素匹配,比如
p
、a
- 類選擇器:通過類名匹配元素,比如
.class
- 屬性選擇器:通過元素的屬性來匹配元素,如
a[href]
-
id
選擇器:通過元素id來匹配元素,如#app
。值得注意的是,id選擇器不是匹配一個元素而是多個(當(dāng)然我我們不希望頁面有相同id的元素)。
這五種基本選擇器是另外幾種選擇器使用的基礎(chǔ)。
為了擴展選擇器的適用范圍,比如我希望同時選擇p
元素和類為red
的元素,這時就需要把基本選擇器組合起來,我們使用,
把選擇器分開,就得到了選擇器的組合,這就是分組選擇器:
p, .red {
color: red;
}
同時,有時候為了選擇器更精確,也就是縮寫選擇器的范圍,我們就需要使用組合選擇器,組合選擇器主要有四種(兩后代兩兄弟):
- 后代選擇器:使用空格進行組合,比如
#app div
- 直接子元素組合器:使用
>
進行組合,比如div > p
- 兄弟選擇器:使用
~
進行組合,比如p ~ p
能匹配到p
元素之后的兄弟元素。(注意,只能匹配到之后的兄弟元素) - 緊鄰兄弟選擇器:有時候為了選擇緊鄰的兄弟元素,我們使用
+
來進行組合,比如p + a
此外,還有些元素比較特殊,比如被訪問過的a
標(biāo)簽,懸浮狀態(tài)下的div
等等,這些都是某些場景下的特殊狀態(tài),為了捕獲到這些具有特殊狀態(tài)的標(biāo)簽,我們需要使用偽類選擇器,這些偽類描述了不同狀態(tài)的標(biāo)簽,比如:hover
表示鼠標(biāo)懸浮狀態(tài)下的標(biāo)簽,a:visited
表示被訪問過的a
標(biāo)簽,div:first-child
表示div
的第一個子元素。
除了偽類,還有一種元素稱之為偽元素,偽元素是真實存在的元素,但又不能被html表達(dá)出來,比如p
元素的首字母,首行,這種元素稱不上元素,因為只是元素的一部分,但又是真實存在的,因此稱為偽元素,目前html提供了五種偽元素選擇器:
-
::brefore
:插入元素之前的內(nèi)容 -
::after
:插入元素之后內(nèi)容 -
::first-letter
:元素的首字母 -
::first-line
:元素的首行 -
::selection
:元素被選中的部分
而偽類是記錄特殊狀態(tài)的元素,目前有幾十種,這里不再一一列舉。
選擇器優(yōu)先級
由于我們編寫css時可能會有多個選擇器匹配到同一個元素,而又具有不同的樣式,這時候就需要判斷哪個選擇器優(yōu)先級更高,就選哪個選擇器指定的樣式。
我們知道css叫層疊樣式表,也就是樣式是層疊覆蓋的,如果兩個選擇器的權(quán)重一致,則后面的選擇器會覆蓋前面的選擇器。此外,繼承而來的樣式相當(dāng)于樣式的初始化,優(yōu)先級是最低的。
選擇器的權(quán)重參考值如下所示,權(quán)重越高,優(yōu)先級越高:
- 元素選擇器:元素選擇器、偽元素選擇器,權(quán)重為1
- 類選擇器:類選擇器、偽類選擇器、屬性選擇器,權(quán)重為10
- id選擇器:權(quán)重為100
- 內(nèi)聯(lián)樣式:權(quán)重為1000
-
!important
標(biāo)記權(quán)重值最高
總結(jié)來說就是:!important
> 內(nèi)聯(lián)樣式 > id選擇器 > 類/屬性選擇器 > 元素選擇器。而通配符選擇器是沒有權(quán)重的。
標(biāo)簽:css基礎(chǔ)
js數(shù)據(jù)類型有哪幾種?有何區(qū)別?
目前最新的ECMAScript
標(biāo)準(zhǔn)定義了9中數(shù)據(jù)類型。
其中,有7種基本數(shù)據(jù)類型:
- undefined:未定義
- null:空對象
- boolean:布爾
- number:數(shù)字
- string:字符串
- bigint:大整數(shù)。es6新增的類型,一般用于描述大于
2^53 - 1
的整數(shù),這原本是 Javascript中可以用Number
,但如果不使用BigInt()
函數(shù)或整數(shù)字面量n
來封裝數(shù)字,返回類型還會是number
- symbol:符號。symbol也是es6新增的基本類型,由
Symbol()
返回一個唯一的值,所以symbol類型永遠(yuǎn)不會重復(fù)。
2種引用類型:
- Object:對象。
- Function:函數(shù)。
我們可以簡單的把Object理解為實例,而Function理解為未實例化的構(gòu)造器,也就是其他語言常說的類。
為何將數(shù)據(jù)類型劃分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型?這是因為它們在內(nèi)存中的存儲方式是不一樣的,
- 基本數(shù)據(jù)類型由于占用空間不會太大,且具有相對固定的空間大小,因此是直接存放在棧(stack)中的
- 引用數(shù)據(jù)類型由于占用空間大、占用空間大小不穩(wěn)定,如果頻繁創(chuàng)建會造成性能問題,所以實體數(shù)據(jù)將存放到堆(heap)數(shù)據(jù)結(jié)構(gòu)中,而在棧中只用記錄該數(shù)據(jù)的堆地址即可,使用的時候再根據(jù)堆地址去堆內(nèi)存中查找。
擴展:從數(shù)據(jù)結(jié)構(gòu)和內(nèi)存來比較棧和堆,
堆和棧的概念存在于數(shù)據(jù)結(jié)構(gòu)中和操作系統(tǒng)內(nèi)存中:
- 棧結(jié)構(gòu)中的數(shù)據(jù)存取方式為先進后出。
- 堆是一個優(yōu)先隊列,是按優(yōu)先級來進行排序的,優(yōu)先級可以按照大小來規(guī)定。完全二叉樹是堆的一種實現(xiàn)方式。
在操作系統(tǒng)中,內(nèi)存被分為棧區(qū)和堆區(qū):
- 棧區(qū)內(nèi)存由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
- 堆區(qū)內(nèi)存一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由垃圾回收機制回收。
標(biāo)簽:js數(shù)據(jù)類型
合并兩個有序數(shù)組
給定兩個有序整數(shù)數(shù)組
nums1
和nums2
,請你將nums2
合并到nums1
中,使nums1
成為一個有序數(shù)組。
注意題目已經(jīng)告知兩個數(shù)組已經(jīng)是有序的了,所以我們可以使用雙指針法就能從兩個數(shù)組中找打最大值,一個指針指向nums1
末端,一個指針指向mums2
末端,比較兩個數(shù)組的最大值,并放到數(shù)組末端,直到nums2
放置結(jié)束即可。
function merge(nums1, m, muns2, n) {
let k = m + n - 1
let p1 = m -1, p2 = n - 1
while(p2 >= 0) {
if(p1 < 0){
nums1[k--] = nums2[p2--]
} else {
nums[k--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
}
}
}
標(biāo)簽:算法、LeetCode