• 为了方便操作原始值,ECMAScript 提供了 3 种特殊的引用类型:Boolean、Number 和 String。
  • 每当用到౼个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象,从而暴露出操作原始值的各种方法。
1
2
3
4
5
6
let s1 = "some text"; 
let s2 = s1.substring(2);
//========以上代码实际运行步骤===========
let s1 = new String("some text");
let s2 = s1.substring(2);
s1 = null;
  • 引用类型与原始值包装类型的主要区别在于对象的生命周期;
  • 不能在运行时给原始值添加属性和方法;

Boolean

  • Boolean 是对应布尔值的引用类型;
  • 要创建一个 Boolean 对象,就使用 Boolean 构造函数并传入true 或 false;
  • Boolean 的实例会重写 valueOf()方法,返回一个原始值 true 或 false;
  • toString()方法被调用时也会被覆盖,返回字符串”true”或”false”;
  • 所有对象在布尔表达式中都会自动转换为 true;
  • Boolean 对象是 Boolean 类型的实例,在使用instaceof 操作符时返回 true,但对原始值则返回 false
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    let falseObject = new Boolean(false); 
    let result = falseObject && true;
    console.log(result); // true
    let falseValue = false;
    result = falseValue && true;
    console.log(result); // false
    console.log(typeof falseObject); // object
    console.log(typeof falseValue); // boolean
    console.log(falseObject instanceof Boolean); // true
    console.log(falseValue instanceof Boolean); // false

Number

  • 创建Number对象就使用 Number 构造函数并传入一个
    数值
1
let numberObject = new Number(10);
  • 不建议直接实例化 Number 对象,因为在处理原始数值和引用数值时,typeof 和 instacnceof 操作符会返回不同的结果
1
2
3
4
5
6
let numberObject = new Number(10); 
let numberValue = 10;
console.log(typeof numberObject); // "object"
console.log(typeof numberValue); // "number"
console.log(numberObject instanceof Number); // true
console.log(numberValue instanceof Number); // false

基础方法

  • Number 类型重写了 valueOf()、toLocaleString()和 toString()方法
  • valueOf()方法返回 Number 对象表示的原始数值,另外两个方法返回数值字符串
  • toString()方法可选地接收一个表示基数的参数,并返回相应基数形式的数值字符串;
1
2
3
4
5
6
let num = 10; 
console.log(num.toString()); // "10"
console.log(num.toString(2)); // "1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"

toFixed()

  • toFixed()方法返回包含指定小数点位数的数值字符串;如果数值本身的小数位超过了参数指定的位数,则四舍五入到最接近的
  • toFixed()方法可以表示有 0~20 个小数位的数值
1
2
let num = 10.005; 
console.log(num.toFixed(2)); // "10.01"

toExponential()

  • 返回以科学记数法(也称为指数记数法)表示的数值字符串
  • 接收一个参数,表示结果中小数的位数
1
2
let num = 10; 
console.log(num.toExponential(1)); // "1.0e+1"

toPrecision()

  • 会根据情况返回最合理的输出结果,可能是固定长度,也可能是科学记数法形式
  • 接收一个参数,表示结果中数字的总位数(不包含指数)
  • 本质上,toPrecision()方法会根据数值和精度来决定调用 toFixed()还是 toExponential()
  • 为了以正确的小数位精确表示数值,这 3 个方法都会向上或向下舍入
1
2
3
4
let num = 99; 
console.log(num.toPrecision(1)); // "1e+2"
console.log(num.toPrecision(2)); // "99"
console.log(num.toPrecision(3)); // "99.0"

String

  • String 是对应字符串的引用类型;
  • 要创建一个 String 对象,使用 String 构造函数并传入一个数值
  • String 对象的方法可以在所有字符串原始值上调用
  • 3个继承的方法 valueOf()、toLocaleString()和 toString()都返回对象的原始字符串值;
  • 每个 String 对象都有一个 .length 属性,表示字符串中字符的数量;
  • 即使字符串中包含双字节字符(而不是单字节的 ASCII 字符),也仍然会按单字符来计数
1
2
3
let stringObject = new String("hello world");
let stringValue = "hello world";
console.log(stringValue.length); // "11"

字符串操作方法