js數據類型是js中的基礎知識點,也是前端面試中一定會被考察的內容。本文旨在知識的梳理和總結,希望讀者通過閱讀本文,能夠對這一塊知識有更清晰的認識。文中如果出現錯誤,請在評論區指出,謝謝。
js數據類型都有什么?
答:js數據類型一共有7種,兩大類:原始類型,引用類型(對象)
原始類型包括:boolean, null,undefined,number,string,symbol
為什么1.toString會報錯?
答:js中點有兩種,小數點和訪問對象屬性的點,如果一個表達式中有兩個以上的點,那么第二個及后面的點會被js引擎當作是訪問對象屬性的點。而第一個點會有兩種情況,js引擎在解讀以數字開頭的第一個點時,會被當成小數點進行處理,而'toString()’會被作為一個不合法的浮點數來解釋,所以報錯。
而1.2.toString()則不會報錯。
symbol是什么數據類型?
答:原始數據類型。symbol是ES6引入的一種新的原始數據類型,表示獨一無二的值。symbol值由Symbol函數生成。
為什么0.1+0.2 !== 0.3?
答:我們在控制台中打印0.1+0.2的時候,可以看到結果為0.30000000000000004。而不是0.3。這是因為在計算機中,數字無論是定點數還是浮點數都是以二進制的方式進行存儲的。而0.1和0.2轉換成二進制后會無限循環,JavaScript使用Number類型表示數字,遵循IEEE754標准。在進行運算時,先轉換二進制,由於IEEE754尾數位數限制,多余部分舍棄,這樣在進制之間的轉換中進度已經損失,由於指數位數不相同,運算時需要對接運算,也可能產生精度損失,所以計算結果出現偏差。解決問題的最常用的方法就是將浮點數轉化為整數計算。
null是對象類型么?
答:null是原始數據類型,雖然typeof null === ‘object’,但是這是js的一個歷史遺留Bug。
說一說對象類型和原始類型的不同
答:對象類型,也叫做引用類型。與原始類型不同的是,對象類型是在計算機內存中幫我們開辟一個空間來存放值,這個空間會有一個地址(指針)。例如:
const a = []
對於常量a來說,假設內存地址為#001,那么在地址#001的位置存放了值[],常量a存放了地址#001,所以
const a = {}
b = a
b[‘key’] = ‘value'
console.log(a[‘key']) //‘value'
當我們給變量b賦值的時候,是將a存放的內存地址(指針)復制給了b。所以a和b指向了同一個內存空間,這樣當內存空間存放的值放生了變化時,a和b同時被影響。
請說明p1,p2的值
function test(person){
person.age =26
person = {
name:'yyy’,
age:30
}
return person
}
const p1 = {
name:'yck’,
age:25
}
const p2 = test(p1)
console.log(p1)// -> ?
console.log(p2)// -> ?
答:
p1->{name: "yck", age: 26}
p2 ->{name: "yyy", age: 30}
函數傳參是傳遞對象指針的副本,到函數內部修改參數的屬性這步,當前的p1值也被修改了,但是放我們重新為person分配了一個對象時,person擁有了一個新的地址,也就和p1沒有任何關系了。
說一下js類型判斷的方法
1.typeof 對於原始類型來說,除了null都可以顯示正確類型(null->object)
2.typeof 對於對象來說,除了函數都會顯示object(function -> function)
3.instanceof 可以判斷某個變量是否是每個對象的實例。
4.比較理想的方法是 Object.prototype.toString.call(variable)
如何判斷一個對象是空對象
1.Object.keys({}).length === 0
2.JSON.stringify({}) === ‘{}'
類型轉換
轉布爾值
1.在條件判斷時,除了undefined, null,false,NaN,’’,0,-0,其他所有值都轉化為true,包括空對象
對象轉原始類型順序
1.判斷是否為原始類型,如果不是,繼續下一步
2.調用x.valueOf(),如果轉換為基礎類型就返回轉換的值,如果沒有,繼續下一步
3.調用x.toString(),如果轉換為基礎類型就返回轉換的值,如果沒有,繼續下一步
4.報錯
四則運算中的類型轉換
1.加法運算,如果一方為字符串或者引用類型,那么會轉換為字符串進行運算
2.加法運算,如果一方為布爾類型,那么會轉換為數字進行計算(引用類型,字符串除外)。
3.加法運算,undefined與任何值相加,值都為NaN(字符串,引用類型相加除外)
4.加法運算,如果一方為null, 那么會轉化為數字進行運算,null值為0(字符串,引用類型相加除外)
5.加法運算,如果一方為數字, 那么會轉化為數字進行運算(字符串,引用類型相加除外)
== 和===的區別
== 當比較的兩者類型不同時會進行類型轉換,
- 1==‘1’ //true 此情景 string轉number
- null == undefined //true 如果僅需要過濾掉null, undefined 兩種屬性時可以利用此特性
- [] == ! [] //true 因為對象轉基本類型后做比較 false == fase 0 == 0
- [] == ![] //true
- [] == false //true
- '' == false //true
- '' == Number(false) //true
- '' == 0 //true
- Number('') == 0 //true
- 0 == 0 //true