1.引用類型有哪些?非引用類型有哪些
引用類型: 對象 object 數組 函數 正則
非引用類型(基本類型): number string boolean null underfined symbol
2.如下代碼輸出什么?為什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);//false, 雖然指向的空間內容相同,但是是屬于兩片不同區域的對象,地址也會不一樣
console.log(obj1 = obj2);// 復制obj2指向對象的地址給obj1, 輸出 object={a: 1,b:2}
console.log(obj1 == obj2); // 比較兩個地址相等,指向的也是同一片區域 ,輸出true
3.如下代碼輸出什么? 為什么
var a = 1
var b = 2
var c = { name: '饑人谷', age: 2 }
var d = [a, b, c] // d數組包含a b 還有c對象
var aa = a // aa=a=1
var bb = b // bb=b=2
var cc = c // cc復制了指向對象的地址c, 可對對象操作
var dd = d //同上
a = 11 // a賦值為11
b = 22 // b 賦值為 22
c.name = 'hello' //對對象的內容改動 ,name: '饑人谷' 改成 name: 'hello'
d[2]['age'] = 3 // 改動d數組中的c中的age為3
console.log(aa) // 1
console.log(bb) // 2
console.log(cc) // var cc= { name: 'hello' , age: 3}
//改錯:d[2]['age'] = 3 也改變了cc指向的對象的屬性值 age: 3
所以 age: 3,不是2
console.log(dd) // var dd= [1,2, cc:{name:'hello', age: 3}]
4.如下代碼輸出什么? 為什么
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a)
//var n=a; var a=1; 所以 n=1;
++n //++n 輸出2 , 然后n變為2 , 但a還是1, 輸出a=1
f2(c)
// var obj = c = { name: 'jirengu', age: 2 }
++obj.age // 輸出 age: 3 , 是對對象的age +1, 那么輸出c就會內容變
化, 輸出 var c = { name: 'jirengu', age: 3 }
f1(c.age)
//f1(c.age) 隱式語句: var n=c.age; c.age發生變化后 為3,所以n=3
//輸出 ++n為4 ,所以var c = { name: 'jirengu', age: 3 }
console.log(a) //輸出 a=1
console.log(c) // 輸出 var c = { name: 'jirengu', age: 3 }
5.過濾如下數組,只保留正數,直接在原數組上操作
- splice() 方法用于插入、刪除或替換數組的元素。
- 注意:這種方法會改變原始數組!。
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
for(var i=0; i<arr.length; i++){
if(arr[i]<0){
arr.splice(i,1) //從負數的那個位置刪除1個元素
i--
}
}
filter(arr)
console.log(arr) // [3,1,2]
6.過濾如下數組,只保留正數,原數組不變,生成新數組
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var newarr=[];
for(var i=0; i<arr.length; i++){
if( arr[i]>0 ){
newarr.push(arr[i]); //數組.push() 給數組添加元素
}
}
return newarr;
}
var arr2 = filter(arr) //newarr的屬性給arr2
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
7.寫一個深拷貝函數,用兩種方式實現
- //hasOwnProperty:是用來判斷一個對象是否有你給出名稱的屬性或對象。
方法1
function copy(obj){
var newObj={}; //開辟新空間
for(var key in obj){
if(obj.hasOwnProperty(key)) //判斷有個對象是否有屬性或對象
if(typeof obj[key]==='null' || typeof obj[key]==='underfined' || typeof obj[key]==='string' || typeof obj[key]==='number' || typeof obj[key]==='boolean' ){ //判斷對象中的屬性全是基本類型時
newObj[key]= obj[key]; // 屬性復制到新空間對象
}
else{
newObj[key] = copy(obj[key]);
}//如果對象中有嵌套對象 ,再遞歸嵌套對象的屬性
}
}
return newObj;
}
var obj1 = {
name: 'ruoyu',
sex: 'male',
age: 30,
friend: {
name: 'hello,
age: 100
}
}
var obj3= copy(obj1);
obj1.name =wowo;
console.log(obj3);
方法2:
var obj1={
name:'teng',
age: 30,
friend: {
name: 'hello',
age: 100,
}
}
function copy(obj){
var newobj= JSON.parse(JSON.stringify(obj));
return newobj;
}
var obj3= copy(obj1);
console.log(obj3);
//JSON.stringify(obj) 對象轉換成字符串
JSON.parse(JSON.stringify(obj)); 將轉換來的字符串(此時的字符串已經不是之前的字符串) ,再生成為對象