《JavaScript高级程序设计》回顾之引用类型(上)

429 阅读6分钟

这是我以前写的文章,如果错误,请指正,谢谢!

最近重新把红宝书拾起来复习了下,发现了好多遗忘的和遗漏的知识点,在这里总结一下我发现的自己忽略的知识点,希望能够和大家一起进步:)


引用类型

Object

对象类型转换

对象类型的变量,在被转为数值类型时,例如Number(Obj)或者进行对比判断如==的时候,会先调用对象的 valueOf 方法,如果 valueOf 方法不存在的话,则会调用 toString 方法,然后把调用得到的结果转换为数值,举个例子:

const obj = {
  a: 1,
  valueOf: function() {
    return 2;
  },
  toString: function() {
    return 3;
  }
};
console.log(Number(obj)); // 2
console.log(obj == 2); // true
const obj = {
  a: 1,
  toString: function() {
    return 3;
  }
};
console.log(Number(obj)); // 3
console.log(obj == 3); // true

但是要注意的是,使用===来判断是无法通过的,因为会判断左端和右端的类型是否相同。

Array

length属性

数组的length属性表示数组的有多少项,这个属性是可以修改的,通过设置这个属性能够在数组的末尾移出或者添加项,举个例子:

const array = [1, 2, 3, 4, 5, 6];
console.log(array.length); // 6
array.length = 3;
console.log(array); // [1, 2, 3]
array.length = 5;
console.log(array);  // [1, 2, 3, , ]

减少length可以移除数组末尾的项,而增加 length 会在数组末尾添加空数组项。

判断是否是数组

判断一个数组是数组的方法:array instanceof Array 扩展:在ES6中,可以使用Array.isArray(array)方法来判断

Array重写的方法

valueOf:返回数组自身; toString:

  1. 数组的每一项调用toString()方法;
  2. 得到的各个结果用逗号分隔生成新的字符串返回;

toLocaleString:数组的每一项调用 toLocaleString 方法,其他的和 toSting 一样 join:

  1. 数组的每一项调用 toString 方法;
  2. 传入的参数调用 toString 方法;
  3. 1得到的结果用2得到的结果来分隔;
  4. 不传参数或者传入的参数如果是 undefined,则用默认的逗号来分隔;
  5. 传入的参数如果是 null,用 null 的字符串来分隔;
  6. 不能传入 Symbol 类型的数据作为参数,否则会报错;

值得注意的是,如果数组的某一项如果是null或者undefined,那么在调用上述的 toString、toLocaleString、join 方法时会被当总空数组项来处理。

splice方法

array.splice(start, length, ...otherArguments)删除或者添加数组项

  1. start: 开始操作的数组项下标;
  2. length:需要删除的数组项个数,从 start 位置开始删除,返回的结果为删除的数组项组成的新数组;
  3. otherArguments:需要插入的新的数组项,从第三个参数开始,会在 start 位置依次插入传入的参数,原本 start 位置的数组项会被往后推移; 需要注意的是,splice 方法会修改原来的数组,不是一个函数式的方法,举个例子:
const array = ["a", "b", "c", "d", "e", "f"];
const newArr = array.splice(1, 2);
console.log(newArr); // ["b", "c"]
console.log(array); // ["a", "d", "e", "f"]
array.splice(2, 1, 2, ["a"]);
console.log(array); // ["a", "d", "e", 1, 2, ["a"],  "f"]

基本包装类型

  1. 基本类型的值调用方法的过程,以"this is a string".subString()为例子:
const str1 = String("this is a string"); // 创建一个String类型的实例
const str2 = str1.subString(); // 调用指定方法
str1 = null; // 销毁实例
  1. 使用Object构造函数创建实例时,会根据传入的值返回相应的基本包装类型的实例,举个例子:
const str = Object("123");
console.log(str instanceof String); //true
const num = Object(123);
console.log(num instanceof Number); // true
  1. 如果使用 new 调用 String 等构造函数来创建实例,那么这个实例的数据类型就是"object",举个例子:
const str = new String("str");
console.log(typeof str); // "object"
console.log(str instanceof String); // true

Boolean

  1. new Boolean创建实例是引用类型的Boolean值;
  2. valueOf:返回布尔值 true 或者 false ;
  3. toString:返回字符串形式的 "true" 或者 "false";

String

  1. new String方式创建的实例是引用类型的String值;
  2. valueOf、toString、toLocaleString 返回基本数值类型的字符串;
  3. length 属性:表示这个引用类型的字符串是由多少个字符组成的;
  4. chartAt:接收一个数值参数;如果参数是能够成功转换为数值,则返回参数所在位置的字符,否则返回第一个字符,举个例子:
const str = new String("this is a string");
console.log(str.charAt(1)); // "h"
console.log(str.charAt("1")); // "h"
console.log(str.charAt("a")); // "t"
  1. chartCodeAt:逻辑和 chartAt相同,返回值为得到的字符的字符编码(ASCII 码);
  2. concat:将2个或多个字符串合并后返回新的基本数值类型的字符串,这个方法不会改变原有字符串,举个例子:
const str = new String("str");
console.log(str.concat("aaa", "bbb")); // "straaabbb"
console.log(str); // String {"str"}
  1. slice、substring、substr:截取原有字符串的一部分,生成新的字符串;

  2. slice:

    • 第一个参数表示开始截取的位置;
    • 第二个参数表示结束位置,不会被截取到;
    • 如果参数是负数,将参数和字符串的长度相加之后再使用;
  3. substring:

    • 参数和 slice 方法一样;
    • 如果参数是负数,将参数转换为0后再使用;
  4. substr:

    • 第一个参数表示开始位置;
    • 第二个参数表示要截取的字符长度;
    • 如果参数是负数,第一个参数会和字符串长度相加,第二个参数会转换为0,然后再使用参数;
  5. indexOf 和 lastIndexOf 方法查找的时候使用的是 ===,并且这两个方法的第二个参数表示从字符串的第几个位置开始查找;

  6. indexOf:从前往后搜索,返回所传参数在字符串中的第一个位置,不存在返回-1;

  7. lastIndexOf:从后往前搜索,返回所传参数在字符串中的第一个位置,不存在返回-1;

  8. trim:删除字符串两端的空格,返回新的字符串;

  9. localeCompare:比较两个字符串在字母表中的位置,返回结果会随着国家和地区变化;

    • 如果参数在字符串之前,返回正数;
    • 如果相等,返回0;
    • 如果参数在字符串之后,返回负数 ;
  10. fromChartCode:根据字符编码返回字符串

Number

  1. new Number 创建实例是引用类型的Number值
  2. valueOf:返回基本类型值的数值;
  3. toString 和 toLocaleString:返回字符串形式的数值;可以传入一个参数,表示要返回几进制数职的字符串形式;
  4. toFixed:按照指定的小数位返回数值的字符串形式,按标准能够返回0-20位的小数;
  5. toExponential:格式化数值,返回指数表示法的字符串形式的数字,举个例子:
const num = new Number(12345);
console.log(num.toExponential(2)); // 1.23e+4
  1. toPrecision:
    • 接受一个参数,返回字符串形式的数值;
    • 参数表示要返回的数值的位数;
    • 按标准可以返回1-21位小数

感谢阅读,个人成果,请勿转载:)