1.引用类型有哪些?非引用类型有哪些?
- 引用类型包括对象,函数,数组,正则。他们由于被贮存在堆(heap)中,然后变量只是贮存一个指针或者说是一个内存的地址,这个指针指向或者这个地址指向的才是他们真正的内容。
- 非引用类型有 string,number,boolean,null,undefined.
2.如下代码输出什么?为什么?
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false, 两个变量的虽然内容看上去一样,但是
他们都赋值时都分别开辟了空间,地址肯定不一样。
console.log(obj1 = obj2);// 让obj1的地址指向 obj2 的地址。
console.log(obj1 == obj2);// ture 地址一样,所以他们相等。
3.如下代码输出什么? 为什么?
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 // 运行之前d的内容是[1,2,{name:饥人谷,age:2}],运行之后变为\n [1,2,{name:hello,age:3}]
console.log(aa) // 输出1 ,因为第一次赋值时aa=a=1 ,这是一个非引用量,所以,即使a后来发生了改变,但已经不管aa什么事情了。
console.log(bb) // 输出2 ,同样的道理。
console.log(cc)// cc=c=一个地址, 然后c.name发生改变,但是地址没有变,所以cc输出的是{name:hello, age:3},之前忘了d[2]['age']=3对c的改变了。
console.log(dd)// dd=d=一个地址,然后d内容发生改变,dd也发生改变,变为[1,2,{name:hello,age:3}]
4.如下代码输出什么? 为什么
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a) // 将n=a=1,传入,输出++n=2
f2(c) // 将obj=c=一个地址,传入 ++obj.age, 输出 {name:'jirengu',age:3}
f1(c.age) //此时,c.age=3,所以,运行结果是 4.
console.log(a) // a=1 ,此时所有运行函数,并没有修改a的值,a不变。
console.log(c) // 输出结果是{name:'jirengu',age:3} ,f1(c.age)操作的是n的值,并没有操作c.age的值。
5.过滤如下数组,只保留正数,直接在原数组上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
for (var i=0;i<arr.length;i++){
if(arr[i]<=0){
arr.splice(i,1)
i--
}
}
}
filter(arr)
console.log(arr) // [3,1,2]
6.过滤如下数组,只保留正数,原数组不变,生成新数组
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var newArr=[]
var j=0
for(var i=0;i<arr.length;i++){
if(arr[i]>0){
newArr[j]=arr[i]
j++
}
}
return newArr
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
7.写一个深拷贝函数,用两种方式实现
- 浅拷贝
var obj={
name:"lalala",
age:150,
friends:{
boy:"xiaoxiao",
girl:"dada"
}
}
function shadowCopy(obj){
var obj2={}
for(var key in obj){
obj2[key]=obj[key]
}
return obj2
}
var newobj=shadowCopy(obj)
console.log(newobj)
- 深拷贝:递归思想
var obj={
name:"lalala",
age:150,
friends:{
boy:"xiaoxiao",
girl:"dada"
}
}
function copy(oldobj){
var newobj={}
for(var key in oldobj){
var a=oldobj[key]
if(a!==null && typeof a=== 'object'){
newobj[key]=copy(oldobj[key])
console.log(1)
}else {
newobj[key]=oldobj[key]
console.log(2)
}
}
return newobj
}
var obj2=copy(obj)
console.log(obj2)
- 深拷贝:JSON
var obj={
name:"lalala",
age:150,
friends:{
boy:"xiaoxiao",
girl:"dada"
}
}
function deepCopy(oldobj){
newobj=JSON.parse(JSON.stringify(oldobj))
return newobj
}
var obj2=deepCopy(obj)
console.log(obj2)
网友评论