1.引用类型有哪些?非引用类型有哪些?
基本类型值(字符串、数值、布尔值、null和undefined):指的是保存在栈内存中的简单数据段;
引用类型值(对象、数组、函数、正则表达式):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象
2.如下代码输出什么?为什么?
var obj1 = {a:1, b:2};//声明obj1,并将对象{a:1, b:2}的地址指针赋值给obj1
var obj2 = {a:1, b:2};//声明obj2,并将另一个对象{a:1, b:2}(与上一个对象只是内容相同,实际为两个对象)的地址指针赋值给obj2
console.log(obj1 == obj2);//obj1与obj2为两个不同对象的地址指针,所以不相等,结果为false
console.log(obj1 = obj2);//将obj2赋值给obj1,即是将第二个对象的指针赋值给obj1,两者都指向第二个对象,输出结果为第二个对象object{a:1,b:2}
console.log(obj1 == obj2);//obj1与obj2都为第二个对象的地址指针,两者相等,结果为true
3.如下代码输出什么? 为什么
var a = 1;
var b = 2;
var c = { name: '饥人谷', age: 2 };
var d = [a, b, c]; //[ 1,2,c(地址指针,与c指向的对象相同)]
var aa = a; //将a赋值给aa,则aa的值为1
var bb = b; //将b赋值给bb,则bb的值为1
var cc = c; //将c赋值给cc,c是对象的地址指针,即将原对象的地址指针赋值给cc,c和cc都指向同一个对象
var dd = d; //将d赋值给dd,d是对象的地址指针,即将原对象的地址指针赋值给dd,d和dd都指向同一个对象
a = 11; //a的值改变,aa的值不变,
b = 22; //b的值改变,bb的值不变,
c.name = 'hello'; //c指向的对象的name属性值变为“hello”
d[2]['age'] = 3; //d指向的对象中第三个对象的age属性值变为3,即是原来c指向的对象的age属性变为3
console.log(aa) //结果为1
console.log(bb) //结果为2
console.log(cc) //结果为{ name: 'hello', age: 3 }
console.log(dd) //结果为{1,2,{ name: '饥人谷', age: 3 }}
4.如下代码输出什么? 为什么
var a = 1 //a的值为1
var c = { name: 'jirengu', age: 2 } // c的值为对象的地址指针
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a)
//f1(a){
// var n=a(n=1);
// ++n(n=2);},a的值无变化
f2(c)
//f2(c){
// var obj=c; (将c的地址指针赋值给obj,c和obj指向同一个对象)
// ++obj.age; (将cc和obj指向对象的age属性值自增,即为3)
// }
f1(c.age)
//f1(c.age){
// var n=c.age; (n=3)
// ++n(n=2);} c.age的值无变化
console.log(a) //1
console.log(c) //{ name: 'jirengu', age: 3 }
5.过滤如下数组,只保留正数,直接在原数组上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr) {
for(i=0;i<arr.length;i++){
if(arr[i]<=0){
arr.splice(i,1);
filter(arr);
}
}
}
filter(arr)
console.log(arr) // [3,1,2]
6.过滤如下数组,只保留正数,原数组不变,生成新数组
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var j=0;
var newArr=[];
for(var i in arr){
if(arr[i]>0){
newArr[j]=arr[i];
j++;
}
}
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
7.写一个深拷贝函数,用两种方式实现
//第一种
function clone(obj){
var newObject={};
for (var key in obj) {
if(typeof obj[key] === 'number'||typeof obj[key] === 'boolean'||typeof obj[key] === 'string'||obj[key] ===undefined||obj[key] === null){
newObject[key]=obj[key];
} else{
newObject[key]=clone(obj[key])
}
}
return newObject;
}
第二种
var cloneObj = JSON.parse(JSON.stringify(obj));