1.引用类型有哪些?非引用类型有哪些?
(1)引用类型:指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象
- 对象
- 数组
- 函数
- 正则
(2)基本类型:指的是保存在栈内存中的简单数据段
- 数值
- 布尔值
- null
- undefined
2.如下代码输出什么? 为什么
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
console.log(bb) //2
console.log(cc) //{ name: 'hello', age: 2 }
console.log(dd) //[1,2,{name: 'hello', age: 3}]
原因:
- a,b都是基本类型,aa=a只是在内存中开辟了一块新空间,并不会相互影响,所以一开始aa的值就是1,和后面a重新赋值没有关系。b也同理。
- 但是c和d不一样,数组和对象都是引用类型,原来的c中存储的是这个对象的指针,而c.name = ‘hello’ 是改变了指针所指内容的值,所以c要变。d也是同理
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
console.log(c) //{ name: 'jirengu', age: 3 }
原因:
f1(a)在执行的时候会变成
function f1(a){
var n = a;
++n;
}
这时候a的值并没有改变。而c是引用类型,执行f2(c)。复制的是指针,所以要变化。c.age是基本类型,不会变化。
3.过滤如下数组,只保留正数,直接在原数组上操作
<script>
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 = i-1;
}
}
}
filter(arr)
console.log(arr) // [3,1,2]
</script>
4.过滤如下数组,只保留正数,原数组不变,生成新数组
<script>
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var a1 = new Array();
for(var i = 0;i<arr.length;i++){
if(arr[i]>0){
a1.splice(i,0,arr[i]);
}
}
return a1;
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
</script>
5.写一个深拷贝函数,用两种方式实现
- 第一种:JSON
<script>
function deepCopy(obj){
return JSON.parse(JSON.stringify(obj));
}
</script>
- 第二种:递归
<script>
function deepCopy(obj){
var newObj = {};
for(var i in obj){
if(typeof obj[i] === 'object' && obj[i] !== null){
newObj[i] = deepCopy(obj[i]);
}else{
newObj[i] = obj[i];
}
}
return newObj;
}
</script>