1.引用類型有哪些?非引用類型有哪些?
- 引用類型包括對象,函數(shù),數(shù)組,正則。他們由于被貯存在堆(heap)中,然后變量只是貯存一個指針或者說是一個內存的地址,這個指針指向或者這個地址指向的才是他們真正的內容。
- 非引用類型有 string,number,boolean,null,undefined.
2.如下代碼輸出什么?為什么?
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false, 兩個變量的雖然內容看上去一樣,但是
他們都賦值時都分別開辟了空間,地址肯定不一樣。
console.log(obj1 = obj2);// 讓obj1的地址指向 obj2 的地址。
console.log(obj1 == obj2);// ture 地址一樣,所以他們相等。
3.如下代碼輸出什么? 為什么?
var a = 1
var b = 2
var c = { name: '饑人谷', age: 2 }
var d = [a, b, c]
var aa = a
var bb = b
var cc = c
var dd = d
a = 11
b = 22
c.name = 'hello'
d[2]['age'] = 3 // 運行之前d的內容是[1,2,{name:饑人谷,age:2}],運行之后變?yōu)閈n [1,2,{name:hello,age:3}]
console.log(aa) // 輸出1 ,因為第一次賦值時aa=a=1 ,這是一個非引用量,所以,即使a后來發(fā)生了改變,但已經(jīng)不管aa什么事情了。
console.log(bb) // 輸出2 ,同樣的道理。
console.log(cc)// cc=c=一個地址, 然后c.name發(fā)生改變,但是地址沒有變,所以cc輸出的是{name:hello, age:3},之前忘了d[2]['age']=3對c的改變了。
console.log(dd)// dd=d=一個地址,然后d內容發(fā)生改變,dd也發(fā)生改變,變?yōu)閇1,2,{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) // 將n=a=1,傳入,輸出++n=2
f2(c) // 將obj=c=一個地址,傳入 ++obj.age, 輸出 {name:'jirengu',age:3}
f1(c.age) //此時,c.age=3,所以,運行結果是 4.
console.log(a) // a=1 ,此時所有運行函數(shù),并沒有修改a的值,a不變。
console.log(c) // 輸出結果是{name:'jirengu',age:3} ,f1(c.age)操作的是n的值,并沒有操作c.age的值。
5.過濾如下數(shù)組,只保留正數(shù),直接在原數(shù)組上操作
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)
i--
}
}
}
filter(arr)
console.log(arr) // [3,1,2]
6.過濾如下數(shù)組,只保留正數(shù),原數(shù)組不變,生成新數(shù)組
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var newArr=[]
var j=0
for(var i=0;i<arr.length;i++){
if(arr[i]>0){
newArr[j]=arr[i]
j++
}
}
return newArr
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
7.寫一個深拷貝函數(shù),用兩種方式實現(xiàn)
- 淺拷貝
var obj={
name:"lalala",
age:150,
friends:{
boy:"xiaoxiao",
girl:"dada"
}
}
function shadowCopy(obj){
var obj2={}
for(var key in obj){
obj2[key]=obj[key]
}
return obj2
}
var newobj=shadowCopy(obj)
console.log(newobj)
- 深拷貝:遞歸思想
var obj={
name:"lalala",
age:150,
friends:{
boy:"xiaoxiao",
girl:"dada"
}
}
function copy(oldobj){
var newobj={}
for(var key in oldobj){
var a=oldobj[key]
if(a!==null && typeof a=== 'object'){
newobj[key]=copy(oldobj[key])
console.log(1)
}else {
newobj[key]=oldobj[key]
console.log(2)
}
}
return newobj
}
var obj2=copy(obj)
console.log(obj2)
- 深拷貝:JSON
var obj={
name:"lalala",
age:150,
friends:{
boy:"xiaoxiao",
girl:"dada"
}
}
function deepCopy(oldobj){
newobj=JSON.parse(JSON.stringify(oldobj))
return newobj
}
var obj2=deepCopy(obj)
console.log(obj2)