前端面試系列 JS 基礎知識點

2021-09-24 08:27:48 字數 3327 閱讀 2787

六種原始資料型別(原始型別儲存的都是值,是沒有函式可以呼叫的),"1".tostring() 為什麼能夠呼叫,因為"1"會強制轉換為string型別也就是物件型別(裝箱操作)。 js 的 number 型別是浮點型別的,在使用中會遇到某些 bug,比如 0.1 + 0.2 !== 0.3

null也並不是物件,雖然typeof null 為object。但是這只是 js 存在的乙個悠久 bug。在 js 的最初版本中使用的是 32 位系統,為了效能考慮使用低位儲存變數的型別資訊,000 開頭代表是物件,然而 null 表示為全零,所以將它錯誤的判斷為 object

基本資料型別是儲存在棧中的值,而引用資料型別是存在棧中的引用,查詢的時候通過這個棧中的引用來查詢對應中的堆中的具體的值。

想要知道為什麼0.1+0.2!=0.3 ,首先知道計算機用位來儲存及處理資料,每乙個二進位制數(二進位制串)都一一對應乙個十進位制數。十進位制整數轉二進位制方法:除2取餘;十進位制小數轉二進位制方法:乘2取整。所以十進位制0.1轉化為2進製乘以2的過程就是

0.1 * 2 = 0.2 取 0 0.2 * 2 = 0.4 取 0 0.4 * 2 = 0.8 取 0 0.8 * 2 = 1.6 取1 0.6 * 2 = 1.2 取 1 0.2 * 2 = 0.4 取 0

所以0.1的二進位制格式就是0.00011 無線迴圈,但計算機記憶體有限 在某個精度點直接捨棄。當然,代價就是,0.1在計算機內部根本就不是精確的0.1,而是乙個有捨入誤差的0.1 所以一開始計算之前0.1 就是不準確的 所以最終的結果0.1+0.2!=0.3

原始型別儲存的是具體的值,物件型別儲存的是位址的引用(指標)。

引數是物件的情況。

function

test(person)

return person

}const p1 =

const p2 = test(p1)

console.log(p1) // -> ?

console.log(p2) // -> ?

複製**

過程如下圖:

const person = function

() {}

const p1 = new person()

p1 instanceof person // true

var str = 'hello world'

str instanceof string // false

var str1 = new string('hello world')

str1 instanceof string // true

//對於原始型別來說,你想直接通過 instanceof 來判斷型別是不行的,當然我們還是有辦法讓 instanceof 判斷原始型別的

class primitivestring

}console.log('hello world' instanceof primitivestring) // true

複製**

let a = ,

tostring

() ,

[symbol.toprimitive]()

}1 + a // => 3

複製**

let a = ,

tostring

() }

a > -1 // true

複製**

function

foo()

var a = 1

foo()

const obj =

obj.foo()

const c = new foo()

複製**

// 自己實現bind

function.prototype.testbind = function(that)

}複製**

對於 === 來說就簡單多了,就是判斷兩者型別和值是否相同。

函式 a 內部有乙個函式 b,函式 b 可以訪問到函式 a 中的變數,那麼函式 b 就是閉包。

經典面試題:迴圈中使用閉包解決var定義函式的問題

for (var i = 1; i <= 5; i++) , i * 1000)

}// 6 6 6 6 6

// 解決方法1:閉包

for (var i = 1; i <= 5; i++) , j * 1000)

})(i)

}// 解決方法2:settimeout 的第三個引數,這個引數會被當成 timer 函式的引數傳入

for (var i = 1; i <= 5; i++) ,

i * 1000,i)

}// 解決方法3:let

for (let i = 1; i <= 5; i++) , i * 1000)

}複製**

深拷貝

let a = ,

name: '***'

}let b = json.parse(json.stringify(a))

console.log(b) //

複製**

function structuralclone(obj)  = new messagechannel()

port2.onmessage = ev => resolve(ev.data)

port1.postmessage(obj)

})}var obj =

}obj.b.d = obj.b

// 注意該方法是非同步的

// 可以處理 undefined 和迴圈引用物件

const test = async () =>

test()

複製**

// 自己實現的deepcopy

function deepclone(obj)

if (!isobject(obj))

let isarray = array.isarray(obj)

let newobj = isarray ? [...obj] :

reflect.ownkeys(newobj).foreach(key => )

return newobj

}複製**

前端面試知識點 CSS

css 1,垂直居中的方法這是我看過的比較好的方法 盒子 box 內容.flex1 3,display inline block中間出現空白的問題 底部在上面的正三角形 box 5 margin和padding的關係,百分比相對於誰 在margin是外邊距,padding是內邊距,有五個不同值,ma...

前端面試知識點目錄整理

1 html語義化標籤的理解 結構化的理解 能否寫出簡潔的html結構 seo優化。2 h5中新增的屬性,如自定義屬性data 類名classname等 新增表單元素 拖拽drag。3 h5中新增的api 修改的api 廢棄的api稍作了解 離線儲存 audio video 1 css選擇器 三大特...

前端面試知識點目錄整理

基本功考察 1.關於html 1 html語義化標籤的理解 結構化的理解 能否寫出簡潔的html結構 seo優化。2 h5中新增的屬性,如自定義屬性data 類名classname等 新增表單元素 拖拽drag。3 h5中新增的api 修改的api 廢棄的api稍作了解 離線儲存 audio vid...