1.引用类型有哪些?非引用类型有哪些
- 基本类型值(undefined,null,Boolean,String,Number,Symbol):指的是保存在栈内存中的简单数据段;
- 引用类型值(对象、数组、函数、正则):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象
2.如下代码输出什么?为什么
var obj1 = {a:1, b:2}; // 将 {a:1, b:2}这个对象的地址赋值给obj1
var obj2 = {a:1, b:2}; // 将 {a:1, b:2}这个对象的地址(与obj1指向的地址不是同一个)赋值给obj2
console.log(obj1 == obj2); // 不是同一个地址,所以输出false
console.log(obj1 = obj2); // 将obj2指向的地址赋值给obj1,此时两个指向同一个地址
console.log(obj1 == obj2); // 是同一个地址,输出true
3.如下代码输出什么? 为什么
var a = 1
var b = 2
var c = { name: '饥人谷', age: 2 }
var d = [a, b, c]
var aa = a // a保存的数值,不是指针,a=1
var bb = b //
var cc = c // 把c指向的对象的地址拷贝给cc
var dd = d //
a = 11 //只改变a的值
b = 22
c.name = 'hello' //把c指向的地址中的对象的值改了,因此也会影响cc
d[2]['age'] = 3 //
console.log(aa) // 1
console.log(bb) // 2
console.log(cc) // { name: 'hello', age: 3 }
console.log(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,a=1, ++n=2, a=1
f2(c) // 传入c指向对象的地址,其中的++age, age=3
f1(c.age) // n=c.age(数值), c.age=2 , ++n=3, c.age=2
console.log(a) // 1
console.log(c) //{ name: 'jirengu', age: 3 }
5. 过滤如下数组,只保留正数,直接在原数组上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var i;
for (i=0;i
6.过滤如下数组,只保留正数,原数组不变,生成新数组
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var newArr=[];
for(var i=0,j=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={a:1, b:2, info:{name: 'asdf'}};
function dcopy(obj){
var newObj={}; //只是声明newObj为一个对象,而不是[清空对象](http://www.cnblogs.com/isykw/p/6869084.html)
如果attr是一个对象,那么递归调用dcopy(),生成一个新的2号newObj,return给1号
for (var attr in obj){
if(obj.hasOwnProperty(attr)){ //自己的属性
if(obj[attr] instanceof Object){
newObj[attr]=dcopy(obj[attr]); 1号newObj
}
else {
newObj[attr] = obj[attr];
}
}
}
return newObj;
}
obj.info.name='lala'
console.log(obj)
var result=dcopy(obj)
console.log(result)
function dcopy2(obj){ //JSON.stringify将对象转换为字符串,再用JSON.parse把这个字符串转换为对象
return newObj = JSON.parse(JSON.stringify(obj));
}
https://www.zhihu.com/question/23031215