引用类型有哪些?非引用类型?
- 基本类型
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)
网友评论