陳智濤
1.引用類型有哪些懈凹?非引用類型有哪些膏执?
js中的數(shù)據(jù)類型有以下幾種:
Number Boolean undefined Object Function String Null
基本類型值就是簡單的數(shù)據(jù)段;引用類型值可能由多個值構(gòu)成的對象熟菲。
(1)JavaScript中的引用類型的值是保存在堆內(nèi)存中的看政,通用訪問其地址的方式使用朴恳。引用類型有:對象,函數(shù)允蚣。
(2)基本類型的數(shù)據(jù)是存放在棧內(nèi)存中的于颖,非引用類型有:Number Boolean undefined String Null
2.如下代碼輸出什么?為什么嚷兔?
var a = 1
var b = 2
var c = { name: 'jirengu', 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: 3}
console.log(dd) // [1, 2, {name: 'hello', age: 3}]
- 原因:
var a 和var b 是基本類型森渐,變量的值就存放在棧內(nèi)存中,當(dāng)把a(bǔ)和b的值賦值給aa和bb 后冒晰,aa 和bb 的值就對應(yīng)變成了a和b的值同衣,但a和b的值再次改變不會影響aa和bb。但var c和var d 是引用類型壶运,當(dāng)聲明后耐齐,對應(yīng)的c和d存放的是對應(yīng)存在在堆內(nèi)存的地址,所以把c和d的值賦值給cc和dd 前弯,也是對應(yīng)的地址蚪缀,當(dāng)c和d的值再次改變,cc和dd 也會改變恕出。
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) //a = 1
console.log(c)//c = 3
- 原因,同問題2
4.過濾如下數(shù)組浙巫,只保留正數(shù)金蜀,直接在原數(shù)組上操作
function filter(arr){
for(var i = 0; i < arr.length;i++){
if(arr[i]<0 ){
for(var j = i;j<arr.length;j++){
arr[j] = arr[j+1];
}
arr.length--;
i--;
}
}
}
var arr = [-3,13,1,0,-1,-3,2,-5]
filter(arr)
console.log(arr)
5.過濾如下數(shù)組,只保留正數(shù)的畴,原數(shù)組不變渊抄,生成新數(shù)組
function filter(arr){
var newarr = new Array();
var j = 0;
for(var i = 0; i < arr.length;i++){
if(arr[i]>0 ){
newarr[j] = arr[i];
j++;
}
}
return newarr;
}
var arr = [3,1,0,-1,-3,2,-5]
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)
方法二:
引用評論方法
var str = [-4,3,2,2,2,2,32,3,3,4,-2,0,2];
var newstr = str.filter(function(key){
return key >0;
});
console.log(newstr);
6.寫一個深拷貝函數(shù),用兩種方式實現(xiàn)
說先要理解淺拷貝與深拷貝的區(qū)別:
淺拷貝只會對對象的屬性的值依次進(jìn)行復(fù)制丧裁,并不會對拷貝對象的的引用類型進(jìn)行遞歸拷貝护桦。之就會導(dǎo)致淺拷貝后的對象會和原始對象公用元素中引用類型的地址。
而深拷貝則是對對象的屬性當(dāng)作對象遞歸拷貝煎娇,這就避免了公用數(shù)據(jù)對象了二庵。
- 淺拷貝的例子:
function shadowCopy(obj) {
var newobj = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newobj[key] = obj[key];
}
}
return newobj;
}
var obj = { a:1, arr: [2,3] };
var shadowObj = shadowCopy(obj);
shadowObj.arr[1] = 4 ;
obj.arr[1] // = 4
- 深拷貝的兩種實現(xiàn)方式:
方式一,遞歸:
function deepCopy(src){
var dest = {};
for(var key in src){
if(typeof src[key] === 'object' && src[key] !==null){
dest[key] = deepCopy(src[key]);
}
else{
dest[key] = src[key];
}
}
return dest;
}
var obj = { a:1, arr: [2,3] };
var deepobj = deepCopy(obj);
deepobj.arr[1] = 4 ;
obj.arr[1] // =3
方式二缓呛,JSON序列化與反序列化
function deepCopyByJSON(src){
var dest = JSON.parse(JSON.stringify(src));
return dest;
}
var obj = { a:1, arr: [2,3] };
var deepobj = deepCopyByJSON(obj);
deepobj.arr[1] = 4 ;
obj.arr[1] //= 3