1,引用类型有哪些?非引用类型有哪些2.如下代码输出什么?为什么
(1)引用类型:对象,数组,正则,函数,data类型
(2)非引用类型:number,boolean,undefined,null,symbol(new in ES 6)
(3)输出:
false
obj {a:1,b:2}
true
(4)原因:
输出一:在栈里面obj1对象存的地址是"obj1" ,obj2对象存的地址是"obj2"
obj1==obj2 <=>"obj1"=="obj2",所以结果不相等
输出二:obj1=obj2 ,是把obj2对象的地址赋值给obj1栈空间,现在两个栈空间都指向同一个地址
所以obj1输出对象obj2
输出三: 由于输出二时,先把obj2对象的地址赋值给了obj1,所以obj1和obj2指向了同一个堆中对象地址
所以obj1==obj2结果true
3.如下代码输出什么? 为什么
输出:
1
2
{name:"hellow",age:3}
[1,2,object]
4.如下代码输出什么? 为什么
5,过滤如下数组,只保留正数,直接在原数组上操作
代码:
<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--;
}else{
continue;
}
}
}
filter(arr)
console.log(arr) // [3,1,2]
</script>
运行结果:
6.过滤如下数组,只保留正数,原数组不变,生成新数组
代码:
<script>
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var newarr=[];
for (var i=0;i<arr.length;i++) {
if(arr[i]>0){
newarr.push(arr[i]);
}
continue;
}
return newarr;
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
</script>
运行结果:
7,深拷贝(一个对象嵌套一个对象,嵌套的这个对象只包含基本类型)
法一:
<script>
var obj1={
name:"pearl",
age:24,
firend:{
name:"liu",
age:24
}
}
function deepCopy(obj){
var obj2={};
for(var key in obj){
if(typeof obj[key]=="number"||typeof obj[key]=="string"||typeof obj[key]=="boolean"||
typeof obj[key]==undefined||typeof obj[key]==null){
obj2[key]=obj[key];
}else{
obj2[key]=deepCopy(obj[key]);
}
}
return obj2;
}
console.log(deepCopy(obj1));
</script>
运行结果:
法二:
JSON方法
对象=>字符串=>对象
<script>
var oldobj={
name:"pearl",
age:24,
firend:{
name:"liu",
age:24
}
}
function deepCopy(obj){
var obj2;
obj2=JSON.stringify(obj);
obj2=JSON.parse(obj2);
return obj2;
}
var newobj=deepCopy(oldobj);//得到新对象newobj
newobj.age=40;//改变新对象中age的值,测试会不会牵连到oldobj
console.log(newobj);//输出新对象
console.log(oldobj);//输出oldobj对象
</script>
输出结果: