JS基础二

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};
//Oject {a:1, b:2};obj1 = obj2,obj2内存地址的赋值给obj1
//ture ;obj1和obj2是同一个内存地址

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//引用类型赋值,cc指向对象c的地址
var dd = d//引用类型赋值,dd指向数组d的地址

a = 11//aa和a是两个不同的内存,互不影响
b = 22//bb和b是两个不同的内存,互不影响
c.name = 'hello'//c.name的值被改变了,cc指向c的内存地址,故cc输出结果也改变了,即发生浅拷贝。
d[2]['age'] = 3//d数组中第3个元素里的age对象赋值为3,即,对象c中的age变为3,dd指向d的内存地址,故dd的输出结果与d相同,为浅拷贝。

console.log(aa) //1
console.log(bb) //2
console.log(cc)//Object {name: "hello", age: 3}
console.log(dd)//[1, 2, Object{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) //f1(n)中的n是非引用类型,相当于运行var n = a,函数没return值,也没改变a的值。
f2(c) //f2(obj)中的obj是引用类型,直接调用会使函数中的obj指向对象c,var obj = c(浅拷贝);函数++c.age,改变了对象指向的实际地址的数值。
f1(c.age) f1(n)中的n是非引用类型,相当于运行var n = c.age,函数没return值,也没改变c.age的值。
console.log(a) //1
console.log(c)//Object{ name: 'jirengu', age: 3 }

5. 过滤如下数组,只保留正数,直接在原数组上操作

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
  for(var i = 0;i

6. 过滤如下数组,只保留正数,原数组不变,生成新数组

var arr = [3,1,0,-1,-3,2,-5];
function filter(arr){
  var arrtemp = [],j = 0;
  for(var i in arr){
    if(arr[i]>0){
      arrtemp[j] = arr[i];
      j++;
    }
  }
  return arrtemp;
}
var arr2 = filter(arr);
console.log(arr2); // [3,1,2]
console.log(arr) ; // [3,1,0,-1,-2,2,-5]

7. 写一个深拷贝函数,用两种方式实现

var obj = {}
function deepcopy(obj){
  var newobj = {};
  for(var i in obj){
     if(typeof obj{i} === "number" || typeof obj{i} === "string" || typeof obj{i} === "boolean" || typeof obj{i} === null || typeof obj{i} === undefined){
      newobj{i} = obj{i};
    } 
    else{
      newobj{i}=deepcopy(obj{i});
    }
  return newobj;
}
var obj2 = deepcopy(obj)
var obj = {};
function deepcopy(obj){
  return JSON.parse(JSON.srtingify(obj);
}
var obj2 = deepcopy(obj);

你可能感兴趣的:(JS基础二)