六種原始資料型別(原始型別儲存的都是值,是沒有函式可以呼叫的),"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...