1.引用類型有哪些?非引用類型有哪些?
(1)引用類型:指的是那些保存在堆內(nèi)存中的對象,變量中保存的實際上只是一個指針,這個指針執(zhí)行內(nèi)存中的另一個位置,由該位置保存對象
- 對象
- 數(shù)組
- 函數(shù)
- 正則
(2)基本類型:指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段
- 數(shù)值
- 布爾值
- null
- undefined
2.如下代碼輸出什么? 為什么
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
console.log(aa) //1
console.log(bb) //2
console.log(cc) //{ name: 'hello', age: 2 }
console.log(dd) //[1,2,{name: 'hello', age: 3}]
原因:
- a,b都是基本類型,aa=a只是在內(nèi)存中開辟了一塊新空間,并不會相互影響,所以一開始aa的值就是1,和后面a重新賦值沒有關(guān)系。b也同理。
- 但是c和d不一樣,數(shù)組和對象都是引用類型,原來的c中存儲的是這個對象的指針,而c.name = ‘hello’ 是改變了指針?biāo)竷?nèi)容的值,所以c要變。d也是同理
3.如下代碼輸出什么? 為什么
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a)
f2(c)
f1(c.age)
console.log(a) //1
console.log(c) //{ name: 'jirengu', age: 3 }
原因:
f1(a)在執(zhí)行的時候會變成
function f1(a){
var n = a;
++n;
}
這時候a的值并沒有改變。而c是引用類型,執(zhí)行f2(c)。復(fù)制的是指針,所以要變化。c.age是基本類型,不會變化。
3.過濾如下數(shù)組,只保留正數(shù),直接在原數(shù)組上操作
<script>
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 = i-1;
}
}
}
filter(arr)
console.log(arr) // [3,1,2]
</script>
4.過濾如下數(shù)組,只保留正數(shù),原數(shù)組不變,生成新數(shù)組
<script>
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var a1 = new Array();
for(var i = 0;i<arr.length;i++){
if(arr[i]>0){
a1.splice(i,0,arr[i]);
}
}
return a1;
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
</script>
5.寫一個深拷貝函數(shù),用兩種方式實現(xiàn)
- 第一種:JSON
<script>
function deepCopy(obj){
return JSON.parse(JSON.stringify(obj));
}
</script>
- 第二種:遞歸
<script>
function deepCopy(obj){
var newObj = {};
for(var i in obj){
if(typeof obj[i] === 'object' && obj[i] !== null){
newObj[i] = deepCopy(obj[i]);
}else{
newObj[i] = obj[i];
}
}
return newObj;
}
</script>