1.引用類型有哪些?非引用類型有哪些
- 引用類型包括:數組、對象、正則、函數
- 非引用類型(即基本類型):數值、布爾值、null、undefined和Symbol(ES6)
2.如下代碼輸出什么?為什么
Paste_Image.png
- 輸出:
false [object Object] { a: 1, b: 2 } true
- 原因:
var obj1 = {a:1, b:2};//0x0001 var obj2 = {a:1, b:2};//0x0002 //此時,obj1和obj2是兩個對象,所保存的地址不一樣,輸出false console.log(obj1 == obj2); //obj1=obj2: 讓obj1和obj2指向一個內存地址,輸出0x0002地址的數據 console.log(obj1 = obj2); //此時,obj1和obj2保存的地址都是0x0002,輸出true console.log(obj1 == obj2);
3.如下代碼輸出什么? 為什么
Paste_Image.png
- 輸出:
1 2 [object Object]{ name: 'hello', age: 3 } [1,2,[object Object]{ name: 'hello', age: 3 }]
- 緣由:
1.aa和bb都是基本類型數據,變量保存的是棧內存地址,改變a的值和aa沒有關系; 2.cc和dd都是引用類型,變量保存的是堆內存地址(相當于保存遙遠內存區段的地址),改變對象的屬性值只是改變對象指向的內存區段里的數據,所以對象保存地址不變,輸出仍是地址指向的內存區段里面的數據;這時由于name和age兩個屬性值變化,所以輸出內容有所變化。
4.如下代碼輸出什么? 為什么
Paste_Image.png
- 輸出
1 [object Object]{ name: 'jirengu', age: 3 }
- 原因:
- 函數f1里面的n是新的變量,和a沒有關系(a仍為1)
- 函數f2里面的obj保存的地址和c的地址一樣,改變這個地址指向的內容age的值 也就是改變了c對象的屬性age值(所以age=3)
- 函數f1(c.age)和f1(a)一樣,函數里面的變量n是一個新的變量,與原來的變量沒有關系(所以age仍為3)
5.過濾如下數組,只保留正數,直接在原數組上操作
Paste_Image.png
function filter(arr){
for(let i=arr.length-1;i>=0;i--) {
if(arr[i]<=0){
arr.splice(i,1);
}
}
}
6.過濾如下數組,只保留正數,原數組不變,生成新數組
Paste_Image.png
function filter(arr) {
let newArr = [];
//ES5
for (let key in arr) {
if (arr[key] > 0) {
newArr.push(arr[key]);
}
}
//ES6
// for(let [key,value] of arr.entries()) {
// if(value>0){
// newArr.push(value);
// }
// }
//ES8的方法
// for(let value of Object.values(arr)) {
// if(value>0){
// newArr.push(value);
// }
// }
return newArr;
}
7.寫一個深拷貝函數,用兩種方式實現
//淺拷貝
const f1 = (obj) => {
let newObj = {};
for(let key in obj){
newObj[key] = obj[key];
}
// es8引入了跟Object.keys配套的Object.values和Object.entries,作為遍歷一個對象的補充手段。
// for(let [key,value] of Object.entries(obj)){
// newObj[key] = value;
// }
return newObj;
}
//深拷貝
const f2 = (obj) => {
let newObj = {};
for(let key in obj) {
if(typeof obj[key] === "object"){
newObj[key] = f2(obj[key]);
} else {
newObj[key] = obj[key];
}
}
// es8引入了跟Object.keys配套的Object.values和Object.entries,作為遍歷一個對象的補充手段。
// for(let [key,value] of Object.entries(obj)){
// if(typeof obj[key] === "object"){
// newObj[key] = f2(value);
// } else {
// newObj[key] = obj[value];
// }
// }
return newObj;
}
深拷貝和淺拷貝的區別: 1.深拷貝是完全拷貝,不但對象地址變了,對象的內部屬相對象(或其它引用類型)的地址也變了;改動其中一個對象的屬性對象的屬性值,另外一個不變。 2.淺拷貝中:新對象的內部屬性對象和原對象內部屬性對象的地址一樣;改動其中一個對象的屬性對象的屬性值,另外一個也同時變化。 深拷貝和淺拷貝的相同點: 對于對象中的基本數據類型值,執行兩種拷貝效果一致。拷貝后改動其中一個對象,另外一個不變