引用類型有哪些?非引用類型?
- 基本類型
Number、String、Boolean、Null、Undefined
- 引用類型
Array、Function、Object、RegExp
如下代碼輸出什么?為什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false,兩個操作數都是對象,但它們指向的不是同一個對象
console.log(obj1 = obj2); //a:1,b:2,兩個變量相互復制引用類型時,指針會指向同一對象
console.log(obj1 == obj2); //true, 由于兩個變量引用的都是同一個對象,所以返回真
如下代碼輸出什么? 為什么
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) //aa=1 , 非引用類型,只復制操作數的值而非地址
console.log(bb) //bb=2 , 非引用類型,只復制操作數的值而非地址
console.log(cc) //name:'hello',age: 3 , c是引用類型,所以cc與c指向同一個對象,從而改變對象屬性后,另一個也發生相應變化。
console.log(dd) //a=1 b=2 name:'hello' age=3 , d也是引用類型,在下面重新對a,b賦值之前d已經完成了對a,b變量值的復制,所以之后的賦值對d不造成影響;由于c是引用類型,所以數組中的c與變量c所指的對象為同一對象(指向同一地址),改變會同時發生。
如下代碼輸出什么? 為什么
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, a是基本類型,調用函數f1時,a作為參數,只是將變量值復制給n,所以n++對其無影響
console.log(c) //name: 'jirengu',age: 3 , c是引用類型,調用函數f2時,將整個c對象當做參數復制過去,使得函數中的參數與c指向同一個對象,所以對其age屬性加一操作會改變變量c對象的age屬性值;而調用函數f1時只是將對象中的age屬性作為參數復制過去,函數體中的操作對原來對象的age屬性不造成影響
過濾如下數組,只保留正數,直接在原數組上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
for( var i=0; i<=arr.length; i++){
if(arr[i]<1){
arr.splice(i,1);
filter(arr);
}
}
return arr
}
filter(arr)
console.log(arr)
過濾如下數組,只保留正數,原數組不變,生成新數組
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr) {
var newarr = []
var n=0
for( var i in arr) {
if(arr[i]>0){
newarr[n++] =arr[i]
}
}
return newarr
}
var arr2=filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
寫一個深拷貝函數,用兩種方式實現
//第一種方式
function copy(obj) {
var newObj ={}
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
if(typeof obj[key] ==='number' || typeof obj[key] ==='string' || typeof obj[key] ==='boolean' || obj[key] === null || obj[key] === undefined) {
newObj[key] = obj[key]
} else {
newObj[key] = copy(obj[key])
}
}
}
}
//第二種方式
function deepCopy() {
var newObj = {};
newObj = JASON.parse(JASON.stringify(oldObj));
return newObj;
}
var obj2=deepCopy(oldObj);
console.log(obj2)