引用類型有哪些?非引用類型有哪些2.如下代碼輸出什么尊沸?為什么
引用類型有對(duì)象招狸、數(shù)組、函數(shù)老速、正則,非引用類型有數(shù)值凸主、字符串橘券、布爾值、null和undefined
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
//false;obj1和obj2只是看上去一樣卿吐,實(shí)際上它們的值是不同的旁舰,所以 obj1 != obj2
console.log(obj1 = obj2);
//{a:1, b:2};這是一個(gè)賦值操作,實(shí)際是將 obj2 的值在內(nèi)存中的地址賦予了 obj1嗡官,所以盡管輸出的值仍是{a:1, b:2}箭窜,但此時(shí) obj1 的地址已經(jīng)指向了 obj2
console.log(obj1 == obj2);
//true; 根據(jù)上一個(gè)操作, obj1 和 obj2 的值實(shí)際已經(jīng)是相同的值了衍腥,所以 obj1 == obj2
如下代碼輸出什么? 為什么
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;a是基本類型磺樱,賦值時(shí)a的值為1纳猫,所以aa的值也為1
console.log(bb)
//2;原因同上
console.log(cc)
//{name: 'hello', age: 2};c是引用類型,賦值時(shí)c的值實(shí)際上只是一個(gè)內(nèi)存地址竹捉,cc獲得了這個(gè)內(nèi)存地址芜辕,所以cc和c的值相同,改變c.name并沒有改變c的內(nèi)存地址块差,所以cc也會(huì)隨著c的變化而變化
console.log(dd)
//[1, 2, {name:'hello' ,age: 3}];d也是引用類型侵续,dd和d共用一個(gè)內(nèi)存地址,d中的a和b在變化前已經(jīng)將初始值傳給了d憨闰,所以此處的a=1询兴,b=2,d[2]['age']=3的意思是將d的第三個(gè)項(xiàng)的age賦值為3起趾,也就是將c的age改為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;在f1(a)中,實(shí)際有一條隱性的聲明 n=a 训裆,之后運(yùn)算的++n改變的是n的值眶根,a的值并沒有改變,所以a的值仍然是1
console.log(c)
//{name:'jirengu', age:3};按順序先運(yùn)行f2(c)边琉,此時(shí) obj=c 属百,即obj和c共用一個(gè)內(nèi)存地址,++obj.age即為++c.age变姨,則運(yùn)算結(jié)束后c.age為3族扰,再運(yùn)行f1(c.age),與f1(a)相同定欧,將c.age的值賦予n后渔呵,實(shí)際改變的是n的值,c.age的值并沒有發(fā)生變化砍鸠,所以c.age的值仍是3
過濾如下數(shù)組扩氢,只保留正數(shù),直接在原數(shù)組上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
for(i=0; i<arr.length; i++){
if(arr[i]<=0){
arr.splice(i,1)
filter(arr)
}
}
return arr
}
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 newArr = []
for(i=0; i<arr.length; i++){
if(arr[i]>0){
newArr.push(arr[i])
}
}
return newArr
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
寫一個(gè)深拷貝函數(shù)饭弓,用兩種方式實(shí)現(xiàn)
function deepCopy(obj){
var newObj = {};
for(key in obj){
if(obj.hasOwnProperty(key)){
if(typeof obj[key] === 'number'||typeof obj[key] === 'string'||
typeof obj[key] === 'boolean'||obj[key] === undefined || obj[key] === null){
newObj[key] = obj[key];
}else{
newObj[key] = deepCopy(obj[key]);
}
}
}
}
function deepCopy(obj){
return newObj = JSON.parse(JSON.stringify(obj));
}
//先用JSON.stringify將對(duì)象轉(zhuǎn)化為字符串双饥,再用JSON.parse將字符串轉(zhuǎn)化為對(duì)象