JavaScript对象

2020-12-01  本文已影响0人  amanohina

概念

对象字面量

var obj = {
    k:v,
    k:v,
    k:v
};
var person1 = {
      name : "zs",
      age : 18,
      sex : "male",
      sayHi : function () {
        console.log(this.name + "向你说您好");
      }
    };

区分属性和方法

调用对象内部属性和方法的语法

person1.name
this.name
person1["name"]
person1.sayHi();
person1["sayHi"]();

更改对象内部属性和方法的语法

person1.age = 19;
person1.height = 180;
delete person1.sex;

其他创建对象的方法

new Object()创建对象

new在执行时会做四件事情

   // new Object() 方法创建
    var person1 = new Object();   //创建了一个新的空的对象
    // 添加属性和方法
    person1.name = "zs";
    person1.age = 18;
    person1.sex = true;
    person1.sayHi = function () {
      console.log("你好");
    };

工厂函数创建对象

function createPerson(name,age,sex) {
      var person = new Object();
      person.name=name;
      person.age=age;
      person.sex=sex;
      person.sayHi = function () {
        console.log("hello");
      }
      return person;
    }
    var p1 = createPerson("zs",18,true);
    var p2 = createPerson("ls",18,false);
    console.log(p1);
    console.log(p2);

自定义构造函数

   function Person(name,age,sex) {
      // 不需要使用 new 一个新对象
      // 用 this 替代将来创建的新对象
      this.name = name;
      this.age = age;
      this.sex = sex;
      this.sayHi = function () {
        console.log("hello");
      };
      // 不需要添加 return
    }
    // 用 new 关键字调用构造函数
    var p1 = new Person("zs",18,true);
    console.log(p1);

对象遍历

for(var k in obj){
console.log(k + "项的属性值是" + obj[k]); 
}
    // 通过对象字面量方式创建一个对象
    var person1 = {
      name : "zs",
      age : 18,
      sex : "male",
      sayHi : function () {
        console.log(this.name + "向你说您好");
      }
    };

    // 遍历对象
    for (var k in person1) {
      // k 存储的是每一条数据的属性名或者方法名
      console.log(k + "属性的属性值为" + person1[k]);
    }

简单类型和复杂类型的区别

堆和栈

简单类型在内存中的存储

变量中如果存储的是简单类型的数据,那么变量中存储的是值本身,如果将变量赋值给另一个变量,是将内部的值复制一份给了另一个变量,两个变量之间没有联系,一个变化,另一个不会同时变化


number值复制给n变量,number本身不会有变化

复杂类型在内存中的存储

如果将复杂类型的数据赋值给一个变量,复杂类型的数据会在内存中创建一个原型,而变量中存储的是指向对象的一个地址,如果将变量赋值给另一个变量,相当于将地址复制一份给了新的变量,两个变量的地址相同,指向的是同一个原型,不论通过哪个地址更改了原型,
都是在原型上发生的更改,两个变量下次访问时,都会发生变化


都是一个地址,牵一发而动全身
 var p1 = {
      name : "zs",
      age : 18,
      sex : "male"
    };
    var p = p1;  //p1 将内部存储的指向对象原型的地址复制给了 p
    // 两个变量之间是一个联动的关系,一个变化,会引起另一个变化
    p.name = "ls";
    console.log(p);
    console.log(p1);

数据和函数也是存储在堆内,复杂类型,跟对象的变化类似,牵一发动全身
 var arr = [1,2,3,4];
    var arr2 = arr;
    arr[4] = 5;
    console.log(arr);
    console.log(arr2);
image.png

内置对象

MDN学习手册

https://developer.mozilla.org/zh-CN/

学习一个新的方法

1.方法的功能
2.参数的意义和类型
3.返回值意义和类型
4.demo进行测试

Math对象

Array对象

var arr1 = new Array();
    // 添加数据,可以传参数
    var arr2 = new Array(1,2,3);
    var arr3 = new Array("zs","ls","ww");

检测数据类型

 var a = function (){};
    // 检测某个实例对象是否属于某个对象类型
    console.log(arr instanceof Array);
    console.log(arr2 instanceof Array);
    console.log(a instanceof Function);

    function fun () {
      console.log(1);
    }
    console.log(fun instanceof Function);

首尾操作方法

toString()方法

 var arr = [1,2,3,4];

    // toString() 方法:转字符串
    console.log(arr.toString());

数组常用方法

   // 字面量方法
    var arr = [1,2,3,4,5,6,7,8,9,10];
    // 删除功能,传前两个参数
    console.log(arr.splice(2,5));
    console.log(arr);
    arr.splice(2,5,"haha","hello");
    console.log(arr);
    // 插入功能,传3个及以上的参数,但是第二个参数必须为0
    arr.splice(2,0,"hello");
    console.log(arr);
 // 字面量方法
    var arr = [1,2,3,4,5,6,7,8,9,10,4,5];

    // 查找某个元素在数组中从前往后第一次 出现位置的下标
    console.log(arr.indexOf(4));
    // 查找某个元素在数组中从前往后最后一次出现位置的下标
    console.log(arr.lastIndexOf(4));
    console.log(arr.lastIndexOf(11));
var arr = [1,2,3,4,5,6,7,8,9,10,20,30];

    // 倒序排列
    console.log(arr.reverse());
    console.log(arr);
arr.sort(function(a,b){
      if (a < b) {
        return -1;   //表示 a 要排在 b 前面
      } else if (a > b) {
        return 1;  //表示 a 要排在 b 后面
      } else {
        return 0;  //表示 a 和 b 保持原样,不换位置
      }
    });
    console.log(arr);
 var arr = [1,2,3,4,5,6,7,8,9,10,20,30];

    // 转字符串方法
    var str = arr.join("*");
    // var str = arr.join("");
    console.log(str);

清空数组

1.arr = [];
2.arr.length = 0;
3.arr.splice(0,arr.length);

String对象

基本包装类型

 // 基本类型的数据:没有属性和方法
    // 对象数据类型:有属性和方法
    // 但是字符串是可以调用一些属性和方法
    var str = "这是一个字符串";
    var str2 = str.slice(3,5);
    console.log(str2);
// 基本包装类型:基本类型的数据在进行一些特殊操作时,会暂时被包装成一个对象,结束后再被销毁
    // 字符串也有一种根据构造函数创建的方法
    var str3 = new String("abcdef");
    console.log(str);
    console.log(str3);

关于上述代码str和str2截取的运行原理:

 // 模拟计算机的工作
    var str = "这是一个字符串";
    // 进行了一个临时的包装
    var str4 = new String(str);
    var str2 = str4.slice(3,5);
    str4 = null;

字符串的特点

var a = "abc";
a = "bcd";

这两行代码,a一开始赋值"abc"时申请了一块内存进行存储数据,当进行修改时并没有进行覆盖,而是又另外申请了一块内存进行存储,原本的"abc"的内存没有变量去指向,也就造成了内存浪费


字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新
的字符串

字符串属性

字符串方法

  1. charAt() 方法可返回指定位置的字符。
    • char:charator,字符
    • at:在哪儿
    • 参数是 index 字符串的下标。也是从 0 开始。
    • 表示返回指定的下标位置的字符。
  2. indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
    • 找到指定的子字符串在原字符串中第一次出现的位置的下标。如果子字符串在原字符串中没有,返回值是 -1
  3. concat() 方法用于连接两个或多个字符串。
    • 参数比较灵活,可以是字符串、或者字符串变量、多个字符串。
    • 生成的是一个新的字符串,原字符串不发生变化。
  4. split() 方法用于把一个字符串分割成字符串数组。
    • 参数部分是分割符,利用分割符将字符串分割成多个部分,多个部分作为数组的每一项组成数组。
    • 如果分割符是空字符串,相当于将每个字符拆分成数组中的每一项。
  5. toLowerCase() 把字符串转换为小写。
    toUpperCase() 把字符串转换为大写。
    • 将所有的英文字符转为大写或者小写。
    • 生成的是新的字符串,原字符串不发生变化。
  6. slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。
    • 语法:slice(start,end)
    • 从开始位置截取到结束位置(不包括结束位置)的字符串。
    • 参数区分正负,正值表示下标位置,负值表示从后面往前数第几个位置,参数可以只传递一个,表示从开始位置截取到字符串结尾。
  7. substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符
    • 语法:substr(start,howmany)
    • 从开始位置截取到指定长度的字符串。
    • start 参数区分正负。正值表示下标位置,负值表示从后往前数第几个位置。
    • howmany 参数必须为正数,也可以不写,不写表示从 start 截取到最后。
  8. substring() 方法用于提取字符串中介于两个指定下标之间的字符。
    • 语法:substring(start,end)
    • 参数只能为正数。
    • 两个参数都是指代下标,两个数字大小不限制,执行方法之前会比较一下两个参数的大小,会用小当做开始位置,大的当做结束位置,从开始位置截取到结束位置但是不包含结束位置。
    • 如果不写第二个参数,从开始截取到字符串结尾.
上一篇 下一篇

猜你喜欢

热点阅读