1.引用类型有哪些?非引用类型有哪些
- 基本类型值(数值、字符串、布尔值、null和undefined):指的是保存在栈内存中的简单数据段;
- 引用类型值(对象、数组、函数、正则):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象
2.如下代码输出什么?为什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);
/*
输出结果:
false obj1,obj2内存指向地址不同
{a: 1, b: 2} 等式右边赋值给左边,内存指向同一地址
true 赋值后内存指向地址相同
*/
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
console.log(aa)//输出1,a地址的值赋给aa,就是1。
console.log(bb)//输出2,同上。
console.log(cc)//输出{name: "hello", age: 3},等式右边赋值给左边,但是后面c.name = 'hello'修改了name的值,d[2]['age'] = 3修改了age的值。
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)
f2(c)
f1(c.age)
console.log(a)
//输出1,把a的值赋给了n,这里的n是一个新的变量,所以n的值变化不会影响a
console.log(c)
//输出{name: "jirengu", age: 3},把c指向的地址赋值给了obj,
//所以++obj.age后,指向的地址内的值发生了变化,
//再打印c的时候打印的是指向的地址内的值,所以age变成3
//函数f1(c.age)和f1(a)一样
//函数里面的变量n是一个新的变量,与原来的变量没有关系(所以age仍为3)
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);
filter(arr);
}
}
}
filter(arr);
console.log(arr) // [3,1,2]
6.过滤如下数组,只保留正数,原数组不变,生成新数组
var arr = [3,1,0,-1,-3,2,-5]
var arr2 = arr.filter(function(x){
return x>0
})
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
7.写一个深拷贝函数,用两种方式实现
//利用JSON序列化实现
function deepClone(initalObj) {
var obj = {};
obj = JSON.parse(JSON.stringify(initalObj));
return obj;
}
//调用方法
var obj = {
a: {
a: "world",
b: 21
}
}
var cloneObj = deepClone(obj);
cloneObj.a.a = "changed";
console.log(obj.a.a); // "world"
//利用递归
function deepClone(initalObj, finalObj) {
var obj = finalObj || {};
obj[i] = (prop.constructor === Array) ? [] : {};
for (var i in initalObj) {
var prop = initalObj[i];
// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
if(prop === obj) {
continue;
}
if (typeof prop === 'object' || typeof null === 'object') {
arguments.callee(prop, obj[i]);
} else {
obj[i] = prop;
}
}
return obj;
}
//调用方法
var obj = {
a: {
a: "world",
b: 21
}
}
var cloneObj = deepClone(obj);
cloneObj.a.a = "changed";
console.log(obj.a.a); // "world"
网友评论