【學習筆記】面試集錦【3】

一、實現深拷貝的方法
在對象中不含有function屬性時可以直接利用JSON.stringify(obj)將其轉換爲字符串,然後利用JSON.parse(str)轉換爲對象。
var obj = JSON.parse(JSON.stringify(objA));
但是當傳入的對象中包含有function作爲屬性值以及原型屬性(proto)、undefined作爲屬性值的屬性時,會自動將該屬性進行忽略。所以當對象中包含有上訴情況時將不能是應該方式進行深拷貝,需要使用自己寫深拷貝的函數。
JSON.stringify(obj,[function(key,val){} | []],indent);
後面的幾個參數都是可選的,第二個參數可以是function或者是數組,但是方法是傳入的參數將會是遍歷時的key,value,如果函數的返回值爲undefined,則將會忽略該屬性,即結果字符串中將不會包含該屬性。如果爲數組則只對數組中的指定項進行序列化,返回的字符串中也只包含這些屬性。
最後一個參數也是可選,表示轉換爲字符串時的縮進個數。
Object.assign()方法只能實現淺拷貝

二、JS中的類型轉換
1、對於邏輯操作&&和||要注意的地方
對於&&操作
a、當第一個數轉換爲boolean結果爲true時,返回值爲後一個參數,否則後第一個參數的值
b、當操作書中包含有null、undefined、NAN中的任意一個時返回則範圍結果爲其中一個。null && 1 返回結果爲null

對於||操作
a、當第一個參數爲true時返回第一個參數,如果爲false則返回第二個參數
b、當操作書中包含有null、undefined、NAN中的任意一個時返回則範圍結果爲其中一個。1 || null 返回結果爲null
同時注意||的優先級高於&&操作

2、Number和parseInt進行強制類型轉換時注意事項
Number轉換:
(1)對於字符串:
a、裏面包含的是正確的數值(只能是十進制整形或者浮點數),則返回數值,當裏面包含非數值時則返回NAN
b、空串返回:0
c、null返回0
d、undefined 返回 0
e、true返回1,false返回0

console.log(Number('hello CSSer!'));
console.log(Number('0×8'));
console.log(Number(''));
console.log(Number('020dd'));
console.log(Number('070'));
console.log(Number(true));

//結果如下:
  NaN
  NaN
  0
  NaN
  70
  1

(2)parseInt轉換
parseInt(str,radix)
str也是有幾種情況:
(1)忽略字符串前面的空格,直至找到第一個非空字符
(2)如果第一個字符不是數字符號或者負號,返回NaN
(3)如果第一個字符是數字,則繼續解析直至字符串解析完畢或者遇到一個非數字符號爲止
(4)如果上步解析的結果以0開頭,則將其當作八進制來解析;如果以x開頭,則將其當作十六進制來解析
(5)如果指定radix參數,則以radix爲基數進行解析,radix的進製爲2-36,超過這個範圍將不能正確解析,0會被當成十進制進行處理。

console.log(parseInt('hello CSSer!'));
console.log(Number('0×8'));
console.log(parseInt(''));
console.log(parseInt('020dd'));
console.log(parseInt('070'));
console.log(parseInt('22.5'));

//結果如下:
NaN
NaN
NaN
20
70
22
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章