美文网首页
JS基础二

JS基础二

作者: 曾祥辉 | 来源:发表于2017-10-07 03:22 被阅读0次

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<arr.length;i++){
    if(arr[i]<=0){
      arr.splice(i,1);
      i--;
      }
    }
}
filter(arr)
console.log(arr) // [3,1,2]

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);

相关文章

  • 发现•分享—2019-01-17

    文章 JS JS 异步编程六种方案 JS基础—原型对象的那些事(一) JS基础—原型对象的那些事(二) CSS 综...

  • js基础(二)

    引用 引用:是一个指向对象实际位置的指针。 函数重载和类型检查 在java语言中直接支持函数的重载,但在js中没有...

  • JS基础(二)

    2018.05.13 11.JavaScript 对象 JavaScript对象是拥有属性和方法的数据,几乎所有的...

  • js基础(二)

    Array for in 和for on for in 得到的是数组的索引 而for of 得到的是数组元素 sl...

  • JS基础二

    1. 引用类型有哪些?非引用类型有哪些 引用类型:对象、数组、函数、正则;指的是那些保存在堆内存中的对象,变量中保...

  • JS基础二

    对象 创建 第一种 new Object() 第二种 创建一个函数去创建对象 第三种 构造函数 this和new ...

  • js基础(二)

    第五天 02-语言基础-第02天{语句、数组} 第五天for循环打印直角三角形打印99乘法表while循环do w...

  • JS基础(二)

    判断数据类型、非数值的转换、相等与全等、break与continue、void 0 与undefined type...

  • JS基础(二)

    一、流程控制语句 关系比较运算 分支结构 循环结构for 循环 break 和 continue 死循环 遍历 模...

  • JS基础(二)

    // 值的比较 // 比较结果为 Boolean 类型 // 所有比较运算符均返回布尔值: // true —— ...

网友评论

      本文标题:JS基础二

      本文链接:https://www.haomeiwen.com/subject/qayffxtx.html