一、引用類型有哪些闪金?非引用類型有哪些
JS 中分基本類型和引用類型。
- 基本類型值(數(shù)值论颅、布爾值哎垦、字符串、null和undefined):指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段恃疯;
- 引用類型值(對象漏设、數(shù)組、函數(shù)今妄、正則):指的是那些保存在堆內(nèi)存中的對象郑口,變量中保存的實際上只是一個指針,這個指針執(zhí)行內(nèi)存中的另一個位置盾鳞,由該位置保存對象
二犬性、如下代碼輸出什么?為什么
題目
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);
結(jié)果
false
{a: 1, b: 2}
true
//對象是引用類型腾仅,上面代碼創(chuàng)建了兩個對象乒裆,雖然內(nèi)容相同,但實際上兩個對象是指向不同內(nèi)存空間的推励,因此并不相同鹤耍。但當 obj1 = obj2 賦值操作之后,相當于把 obj2 的指針賦給了 obj1验辞,因此稿黄,它們現(xiàn)在相同了。
三跌造、如下代碼輸出什么? 為什么
題目
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)
console.log(bb)
console.log(cc)
console.log(dd)
結(jié)果
//輸出
1
2
{name: 'hello', age: 3}
[1, 2, {name: 'hello', age: 3}]
//對象和數(shù)組是引用類型抛猖,所以不新開辟空間的話,怎么修改值鼻听,都會影響所有引用到的變量财著。
四、如下代碼輸出什么? 為什么
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)
console.log(c)
結(jié)果
//輸出
1
{ name: 'jirengu', age: 3 }
//f1 中撑碴,在傳進函數(shù)的參數(shù)里撑教,傳參相當于聲明了一個新的變量,同時該對象是基本類型醉拓,因此改變傳遞參數(shù)的值并不會影響原來的值伟姐。
//f2 中收苏,傳參是引用類型,哪怕新聲明了一個變量愤兵,但指針還是原來對象鹿霸,因此改變傳參會影響到原來數(shù)值。
五秆乳、過濾如下數(shù)組懦鼠,只保留正數(shù),直接在原數(shù)組上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
//在這下面寫代碼
for(var n = 0; n < arr.length; n++){
if(arr[n] <= 0){
arr.splice(n, 1)
//因為是直接在原數(shù)組上操作屹堰,所以每次刪除一個值的時候肛冶,原數(shù)組的 length 也被改變了,索引減一才能正確表示下一個值
n--
}
}
//在這上面寫代碼
}
filter(arr)
console.log(arr) // [3,1,2]
六扯键、過濾如下數(shù)組睦袖,只保留正數(shù),原數(shù)組不變荣刑,生成新數(shù)組
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
//在這下面寫代碼
var tmp = []
for(var n = 0; n < arr.length; n++){
if(arr[n] > 0){
tmp.push(arr[n])
}
}
return tmp
//在這上面寫代碼
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
七馅笙、寫一個深拷貝函數(shù),用兩種方式實現(xiàn)
1. 遞歸
function isFundamentalType(value){
if(typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean' || value === undefined || value === null){
return true
}else {
return false
}
}
function deepCopy(obj){
var newObj = {}
for(attr in obj){
if(obj.hasOwnProperty(attr)){
if(isFundamentalType(obj[attr])){
newObj[attr] = obj[attr]
}else {
newObj[attr] = deepCopy(obj[attr])
}
}
}
return newObj
}
var obj = {name: 'SHINING', sex: 'male', friends: {name: 'cool'}}
var newObj = deepCopy(obj)
console.log(newObj)
2. 先轉(zhuǎn)換成基本類型(字符串)厉亏,后還原成對象
function deepCopy(obj){
var str = JSON.stringify(obj)
return JSON.parse(str)
}
var obj = {name: 'SHINING', sex: 'male', friends: {name: 'cool'}}
var newObj = deepCopy(obj)
console.log(newObj)