JS学习【五】(对象,内置对象api,简单复杂类型)

1.JavaScript对象

  • js中,对象是一组无序的方法和属性的集合

1.1对象创建的三种方式

1.1.1 利用字面量来创建对象

  • 对象字面量:就是{ }里面包含了属性与方法

  • { }中采用键值对的形式,键相当于属性名,方法名;值相当于属性值,可以是任意类型(匿名函数,数字类型,布尔类型等)

  • 注意:方法冒号后面是匿名函数

  • 对象的调用:
    调用属性:对象.属性名 / 对象[‘属性名’]
    调用方法:对象.方法名()

  var keke = {
    
    };
  keke = {
    
    
    name: 'keke',
    type: 'Alaska',
    age: 5,
    color: 'brown',
    bark: function () {
    
    
      console.log("汪汪汪");
    }
  }

  console.log(keke.name); // => keke
  keke.bark();   // => 汪汪汪

1.1.2 利用new Object创建对象

  • 对象调用和用字面量创建一致
  var keke = new Object();
  keke.name = 'keke';
  keke.type = 'Alaska';
  keke.bark = function () {
    
    
    console.log("汪汪汪");
  }

  console.log(keke.name); // => keke
  keke.bark();  // => 汪汪汪

1.1.3 用构造函数创建对象

  • 构造函数:一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值。
  • 构造函数名首字母要大写
  • 调用函数(new)后返回一个对象
  • 创建对象与java类似
  function Dog(name, type) {
    
    
    this.name = name;
    this.type = type;
    this.bark = function (barkSound) {
    
    
      console.log(barkSound);
    };
  }
  //创建对象
  var keke = new Dog('keke', 'Alaska');
 
  console.log(keke['name']);  // => keke
  keke.bark('汪汪汪');  // => 汪汪汪         
  • 构造函数类似于Java的类,利用构造函数创建对象的过程称为对象的实例化

  • new关键字的执行过程

    • new 构造函数 → 在内存中创建一个空对象,this指向这个空对象
    • 执行构造函数里的代码,给此空对象添加属性方法
    • 返回此对象(所以构造函数中不需要return)

1.2 遍历对象

  var keke = {
    
    
    name: 'keke',
    type: 'Alaska',
    bark: function () {
    
    
      console.log("汪汪汪");
    }
  }

  for(var k in keke){
    
    
    console.log(k); // => name type bark
    console.log(keke[k]); // => keke Alaska ƒ () {console.log("汪汪汪");}
  }

2.内置对象

2.1Math对象

  • 参考js常用api

2.2 Date对象

  • 普通用法,可以使用api
  var date1 = new Date();
  console.log(date1); // => Thu Aug 20 2020 18:19:23 GMT+0800 (中国标准时间)
  • 获取时间戳api简化写法, +new Date()等于new Date().getTime();
  var date2 = +new Date(); //返回时间戳 
  console.log(date2); // => 1597918763674

利用Date对象写一个倒计时:

  var nowTime = +new Date();
  var endTime = +new Date('2020-8-20 18:20:0');  //此处输入倒计时结束时间
  time = (endTime - nowTime) / 1000;

  function countDown(time) {
    
    
    var d = parseInt(time / 60 / 60 / 24);
    var h = parseInt(time / 60 / 60 % 24);
    var m = parseInt(time / 60 % 60);
    var s = parseInt(time % 60);
    return d + '天' + h + '时' + m + '分' + s + '秒';
  }

  console.log(countDown(time)); // => 0天0时0分34秒

2.3 数组对象

2.3.1 创建数组对象的两种方式

  var arr1 = new Array(2);
  var arr2 = new Array(2, 3);
  console.log(arr1);  // => [empty × 2]
  console.log(arr2);  // => [2, 3]

2.3.2 判断是否为数组

2.3.2.1 istanceof 运算符
  • java中用来判断是否为子类
  var arr = [];
  var obj = {
    
    };
  console.log(arr instanceof Array); // => true
  console.log(obj instanceof Array); // => false
2.3.2.2 Array.isArray()
  • h5新增方法,ie9以上支持
  var arr = [];
  var obj = {
    
    };
  console.log(Array.isArray(arr));   // => true
  console.log(Array.isArray(obj));   // => false

2.3.3 增加删除数组元素的方法

  • push
  • 在数组后添加元素,可以添加任意个
  var arr = [1, 2, 3];
  arr.push(4, 5);
  console.log(arr); // => [1, 2, 3, 4, 5]
  • unshift
  • 在数组前添加元素,可以添加任意个
  var arr = [3, 4, 5];
  arr.unshift(1, 2);
  console.log(arr); // => [1, 2, 3, 4, 5]
  • pop
  • 删除数组最后一个元素
  var arr = [1, 2, 3, 4, 5];
  arr.pop();
  console.log(arr);  // => [1, 2, 3, 4]
  • shift
  • 删除数组第一个元素
  var arr = [1, 2, 3, 4, 5];
  arr.shift();
  console.log(arr); // => [2, 3, 4, 5]

2.3.4 获取元素索引

  • indexOf 从头开始找
  • lastIndexOf 从尾开始找
  • 用此api写个数组去重
  function unique(arr) {
    
    
    var newArr = [];
    for(var i = 0; i < arr.length; i++){
    
    
      if(newArr.indexOf(arr[i]) === -1){
    
    
        newArr.push(arr[i])
      }
    }
    return newArr;
  }

  console.log(unique([1, 2, 1, 2, 3, 4, 5, 6, 7, 1])); // => [1, 2, 3, 4, 5, 6, 7]

2.3.5 将数组转化为字符串

  • toString ','分隔元素
  var arr = [1, 2, 3, 4, 5];
  console.log(arr.toString());  // => 1,2,3,4,5
  • join 自定义字符分隔数组
  var arr = [1, 2, 3, 4, 5];
  console.log(arr.join('&'));   // => 1&2&3&4&5

2.3.5 数组拼接

  • concat
  var arr1 = [1, 2, 3, 4, 5];
  var arr2 = [1, 2, 3, 4, 5];
  var arr3 = [1, 2, 3, 4, 5];
  console.log(arr1.concat(arr2, arr3));
  // => [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

2.3.6 数组剪切

  • splice (具有删除功能,插入功能,替换功能)
  • 删除功能,指定从那个位置开始删除几个
  var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
  arr.splice(1, 5);   // 从下标为1开始删除5个元素
  console.log(arr); // => ["a", "g"]
  • 插入功能
  var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
  arr.splice(4, 0, 'insertComment');
  console.log(arr); // => ["a", "b", "c", "d", "insertComment", "e", "f", "g"]
  • 替换功能
  var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
  arr.splice(0, 2, 'c', 'd');
  console.log(arr); // => ["c", "d", "c", "d", "e", "f", "g"]
  • 总得来说,其实是一个东西,第一个参数是起始位置,没什么好说,但是第二个参数删除个数的不同就导致了不同的用法,删除1个就是删除某个位置的元素;删除0个就是不删除,第三个参数可以添加插入的元素,不删还添加就是插入了;删2添2,相当于替换就是一个函数,叫法不同而已

2.4 字符串对象

2.4.1字符串的不可变

  • 在我们修改字符串赋值的时候,原来的字符串并没有消失,仍存在内存中,此时会另开辟一个空间给新的字符串,但变量指向了新的字符串,所以经常改变字符串的赋值十分消耗内存
  • 一个典例说明问题
  var str = '';
  for(var i = 0; i < 1000000; i++){
    
    
    str = str + i;
  }
  • str+i 字符串不停占用内存,内存马上就消耗完毕

2.4.2 获取元素位置

  • indexOf
  var str = "22183210";
  console.log(str.indexOf('0')); // => 7 
  //如果带起始位置
  console.log(str.indexOf('1', 3)); // => 6

2.4.3根据位置返回字符串

  • charAt 返回对应位置的字符串
  • charCodeAt 返回对应位置的字符串的 ascii码
  • str[index] 像数组一样,h5新增方法,与charAt等价
  var str = '278hj2k2d2f2s8'
  console.log(str.charAt(0));  // => 2
  console.log(str.charCodeAt(0));  // => 50
  console.log(str[0]);  // => 2
  • 统计字符在字符串中出现的次数
  var count = {
    
    };
  var str = '278hj2k2d2f2s8';
  for (var i = 0; i < str.length; i++){
    
    
    if(count[str.charAt(i)]){
    
    
      count[str.charAt(i)]++;
    } else {
    
    
      count[str.charAt(i)] = 1;
    }
  }

  console.log(count);
// => {2: 5, 7: 1, 8: 2, d: 1, f: 1, h: 1, j: 1, k: 1, s: 1}

2.4.4字符串的操作方法

  • concat
  var str = 'str1';
  str = str.concat('str2', 'str3');
  console.log(str); // => str1str2str3
  • substr(starIndex, length) 截取
  var str = 'str_str';
  str = str.substr(1, 5);
  console.log(str); // => tr_st
  • split

  • 和java一样,split(’ , ‘),将字符串分割成数组,分割依据是’ , ’

3. 简单类型与复杂类型

  • 内存分两部分存储数据,一部分是堆,一部分是栈

3.1 简单数据类型

  • 值类型: string, number, boolean, undefined, null等

  • 数据存放在内存的栈里面,直接开辟一个空间存值

3.2 复杂数据类型

  • 通过new关键词创建的对象, 如Object Array, var arr=[]等
  • 首先在栈里面存放地址(十六进制表示),此地址指向堆里面的数据

pink老师的图

3.3 简单数据类型传参

  • 函数的形参可以看作是一个变量,我们传值给形参的时候,其实是把变量在栈里面的值复制了一分给形参,在函数内部做出对形参的任何修改都不会影响外部变量
  function f(a) {
    
    
    a++;
    console.log(a);  
  }
  var x = 10;
  f(x);  // => 11
  console.log(x);  // => 10

pink老师的图

在这里插入图片描述

3.4 复杂数据类型传参

  • 函数的形参也可以看作是一个变量,当我们传值给形参的时候,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,操作同一个对象
  function Person(name) {
    
    
    this.name = name;
  }
  function f(x) {
    
    
    console.log(x.name);
    x.name = '张学友';
    console.log(x.name);
  }
  var a = new Person('刘德华');
  console.log(a.name);
  f(a);
  console.log(a.name);

pink老师的图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43249043/article/details/108144896