原文链接:http://javascript.info/primitives-methods,translate with ❤️ by zhangbao.

JavaScript 允许我们像操作对象一样的操作基本类型值(字符串、数值等)。

他们还提供了调用的方法,我们很快就会研究这些,但是首先我们会看到它是如何生效的,因为,当然,原始类型值不是对象(这里我们将使它更加清晰)。

我们看下原始类型和对象之间的区别。

原始类型值

对象

存储多个值作为属性的容器。可以用 {} 创建,例如:{name: ‘John’, age: 30}。这里还有其他类型的对象,比如,函数和对象。

对象的最大优点之一就是可以将函数作为属性存储:

  1. let john = {
  2. name: "John",
  3. sayHi: function() {
  4. alert("Hi buddy!");
  5. }
  6. };
  7. john.sayHi(); // Hi buddy!

我们写了一个对象 john 包含一个方法 saiHi。

许多内置对象已经存在,比如那些处理日期、错误、HTML元素等的对象,它们有不同的属性和方法。

但是,这些都是需要开销的!

对象比原始类型值“重”。它们需要额外资源支持内部算法。但是属性和方法在编程里很有用,JavaScript 引擎会尽力优化它们以便减少负担。

将原始类型值作为对象用

这是 JavaScript 的创造者所面临的悖论:

  • 对于像字符串或数字这样的原始类型,人们想要做的事情很多。把它们作为方法来访问是很好的。

  • 原始类型必须尽可能快和轻量化。

这个解决方案看起来有点笨拙,但这里是:

  1. 原始类型还是原始类型。一个简单的值,仅此而已。

  2. 该语言允许访问字符串、数字、布尔值和符号的方法和属性。

  3. 当这种情况发生时,会创建一个特殊的“对象包装器”,它提供了额外的功能,然后被销毁。

“对象包装器”对于每一个基本类型都是不同的,它们被称为:String、Number、Boolean 和 Symbol。因此,它们提供了不同的方法集。

例如,有一个方法 str.toUpperCase() 返回一个大写的字符串。

这是工作原理:

  1. let str = "Hello";
  2. alert( str.toUpperCase() ); // HELLO

很简单,是吧?这就是在 str.toUpperCase() 时发生的事情:

  1. 字符串 str 是基本类型值。在访问它属性时候,一个特别的对象是用这个字符串创建的对象出来了,它是由有用的方法的,像 toUpperCase()。

  2. 方法执行,返回一个新的函数(通过 alert 显示)。

  3. 特殊对象被销毁,仅留下原始类型值 str。

所以原始类型可以提供方法,但它们仍能保持轻量级。

JavaScript 引擎高度优化了这个过程。它甚至可以跳过额外对象的创建。但是它仍然必须遵循规范,并且表现得好像它创建了一个对象。

数字有它自己的方法,例如,toFixed(n) 四舍五入指定的数字:

  1. let n = 1.23456;
  2. alert( n.toFixed(2) ); // 1.23

我们将在《数值》和《字符串》一章中看到更具体的方法。

tip:构造器 String/Number/Boolean 仅供内部使用

一些像 Java 这样的语言允许我们用 new Number(1) 或 new Boolean() 这样的语法来为原始类型值创建“包装器对象”。

在 JavaScript 中,这也可能是历史原因,但高度不推荐。在一些地方,事情会变得疯狂。

例如:

  1. alert( typeof 1 ); // "number"
  2. alert( typeof new Number(1) ); // "object"!

因为接下来的,zero 是一个对象,警报会出现:

  1. let zero = new Number(0);
  2. if (zero) { // zero is true, because it's an object
  3. alert( "zero is truthy?!?" );
  4. }

另一方面,使用相同的函数 String/Number/Boolean 没有 new 是完全正常和有用的。它们将一个值转换成相应的类型:字符串、数字或布尔。

例如,这是完全有效的:

  1. let num = Number("123"); // convert a string to number

tip:null/undefined 没有方法

特殊原始类型值 null 和 undefined 是例外。它们没有对应的“包装对象”、不提供方法。从某种意义上说,它们是“最原始的”。

试图访问这样一个值的属性会导致错误:

  1. alert(null.test); // error

总结

  • 除了 null 和 undefined 之外的其他类型值都提供了有用的方法。我们会在接下来的章节里学习它们。

  • 形式上,这些方法是通过临时对象来工作的,但是 JavaScript 引擎可以很好地优化内部,所以它们的调用并不昂贵。

(完)