原文链接:http://javascript.info/primitives-methods,translate with ❤️ by zhangbao.
JavaScript 允许我们像操作对象一样的操作基本类型值(字符串、数值等)。
他们还提供了调用的方法,我们很快就会研究这些,但是首先我们会看到它是如何生效的,因为,当然,原始类型值不是对象(这里我们将使它更加清晰)。
我们看下原始类型和对象之间的区别。
原始类型值
对象
存储多个值作为属性的容器。可以用 {} 创建,例如:{name: ‘John’, age: 30}。这里还有其他类型的对象,比如,函数和对象。
对象的最大优点之一就是可以将函数作为属性存储:
let john = {
name: "John",
sayHi: function() {
alert("Hi buddy!");
}
};
john.sayHi(); // Hi buddy!
我们写了一个对象 john 包含一个方法 saiHi。
许多内置对象已经存在,比如那些处理日期、错误、HTML元素等的对象,它们有不同的属性和方法。
但是,这些都是需要开销的!
对象比原始类型值“重”。它们需要额外资源支持内部算法。但是属性和方法在编程里很有用,JavaScript 引擎会尽力优化它们以便减少负担。
将原始类型值作为对象用
这是 JavaScript 的创造者所面临的悖论:
对于像字符串或数字这样的原始类型,人们想要做的事情很多。把它们作为方法来访问是很好的。
原始类型必须尽可能快和轻量化。
这个解决方案看起来有点笨拙,但这里是:
原始类型还是原始类型。一个简单的值,仅此而已。
该语言允许访问字符串、数字、布尔值和符号的方法和属性。
当这种情况发生时,会创建一个特殊的“对象包装器”,它提供了额外的功能,然后被销毁。
“对象包装器”对于每一个基本类型都是不同的,它们被称为:String、Number、Boolean 和 Symbol。因此,它们提供了不同的方法集。
例如,有一个方法 str.toUpperCase() 返回一个大写的字符串。
这是工作原理:
let str = "Hello";
alert( str.toUpperCase() ); // HELLO
很简单,是吧?这就是在 str.toUpperCase() 时发生的事情:
字符串 str 是基本类型值。在访问它属性时候,一个特别的对象是用这个字符串创建的对象出来了,它是由有用的方法的,像 toUpperCase()。
方法执行,返回一个新的函数(通过 alert 显示)。
特殊对象被销毁,仅留下原始类型值 str。
所以原始类型可以提供方法,但它们仍能保持轻量级。
JavaScript 引擎高度优化了这个过程。它甚至可以跳过额外对象的创建。但是它仍然必须遵循规范,并且表现得好像它创建了一个对象。
数字有它自己的方法,例如,toFixed(n) 四舍五入指定的数字:
let n = 1.23456;
alert( n.toFixed(2) ); // 1.23
我们将在《数值》和《字符串》一章中看到更具体的方法。
tip:构造器 String/Number/Boolean 仅供内部使用
一些像 Java 这样的语言允许我们用 new Number(1) 或 new Boolean() 这样的语法来为原始类型值创建“包装器对象”。
在 JavaScript 中,这也可能是历史原因,但高度不推荐。在一些地方,事情会变得疯狂。
例如:
alert( typeof 1 ); // "number"
alert( typeof new Number(1) ); // "object"!
因为接下来的,zero 是一个对象,警报会出现:
let zero = new Number(0);
if (zero) { // zero is true, because it's an object
alert( "zero is truthy?!?" );
}
另一方面,使用相同的函数 String/Number/Boolean 没有 new 是完全正常和有用的。它们将一个值转换成相应的类型:字符串、数字或布尔。
例如,这是完全有效的:
let num = Number("123"); // convert a string to number
tip:null/undefined 没有方法
特殊原始类型值 null 和 undefined 是例外。它们没有对应的“包装对象”、不提供方法。从某种意义上说,它们是“最原始的”。
试图访问这样一个值的属性会导致错误:
alert(null.test); // error
总结
除了 null 和 undefined 之外的其他类型值都提供了有用的方法。我们会在接下来的章节里学习它们。
形式上,这些方法是通过临时对象来工作的,但是 JavaScript 引擎可以很好地优化内部,所以它们的调用并不昂贵。
(完)