• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

5.1 原始类型的方法

JS 教程 tiantian 145次浏览 0个评论 扫描二维码

JavaScript 允许我们将原始类型(字符串,数值等)以对象的方式来使用。

它们同样提供了方法可以来进行调用或者其他的操作。我们将很快地学习它们,但是,首先我们将学习它们是如何工作的,毕竟,原始类型并不是对象,此处,我们将使得这种区别更加的清晰。

现在,让我们来看看原始类型和对象的关键区别。

一个对象

一个对象可以容纳多个值作为其属性。可以使用{}进行创建,举个例子:{name: "John", age:30}。而且JavaScript 中还存在其他类型的对象,比如,函数就是对象。

JavaScript 的对象最特殊的地方在于,其可以利用一个它的属性来存储一个函数:

let john = {
  name: "John",
  sayHi: function() {
    alert("Hi buddy!");
  }
};

john.sayHi(); // Hi buddy!

此处,我们创建了一个对象john,其具有一个方法sayHi

JavaScript 中存在很多的内建对象,比如那些可以操作日期、错误、HTML元素的对象等。它们具有各自不同的属性和方法。

但是,那些特性并不是毫无成本的。

对象比原始类型更加重量。它们需要更多另外的资源来支持它们的内部机制。但是,因为属性和方法在编程中非常重要和实用,所以 JavaScript 引擎会尝试优化它们来减轻那些额外的负担。

一个原始类型作为一个对象

现在,看看 JavaScript 的创建者面对的那个悖论:

  • 开发者希望一个原始类型,比如字符串,数值,可以执行很多种常见的操作。如果以方法的形式来实现它们就好了。
  • 原始类型必须越轻量,越快速,就越好。

这个悖论的解决方案有些怪异,但是并不是不可能。下面是其解决方案:

  1. 原始类型仍然是原始类型。就像希望的那样,是一个单一的值。
  2. JavaScript 语言允许访问字符串、数值、布尔值和 Symbol 类型的方法和属性。
  3. 当这种代码出现时,一个特殊的”包装对象”被创建出来,用来提供另外的功能,在使用完毕后又被销毁。

那个”包装对象“根据每一个不同的原始类型的不同而不同,它们分别是:String,Number,BooleanSymbol。因此,它们提供了不同系列的方法。

举个例子:存在一个str.toUpperCase()方法可以用来返回大写的字符串。

看一个示例代码:

let str = "Hello";

alert( str.toUpperCase() ); // HELLO

非常地简单,对吗?下面来看看str.toUpperCase()的内部细节:

  1. 那个字符串str是原始类型。所以,在访问其属性的时候,一个特殊的对象被创建出来,该对象知道该字符串的值,而且具有非常实用的方法,比如toUpperCase()
  2. 那个方法被执行,并且返回了一个新的字符串(被alert函数展示)。
  3. 那个特殊的对象被销毁,只留下那个原始的str值。

所以,原始类型可以提供方法,但是仍然保持非常轻量。

JavaScript 引擎对上述过程进行了非常高度的优化。它甚至有可能完全跳过创建那个另外对象的步骤。但是,它仍然必须遵守JavaScript的规范,整个代码的行为好像它创建了该对象。

一个数值也具有它自己的方法,举个例子,toFixed(n) 将给定参数的值四舍五入到给定精度:

let n = 1.23456;

alert( n.toFixed(2) ); // 1.23

我们将在数值字符串 一节看到更多的特定方法。

构造器 String/Number/Boolean仅在JavaScript内部使用

某些编程语言,比如 Java,允许我们去显示地来创建原始类型的”包装对象“,使用的语法可能是:new Number(1)or new Boolean(false)

在 JavaScript 中,由于历史原因,这样的语法也是存在的,但是极度不推荐使用。这样的语法会在多个地方使得代码错乱。

举个例子:

alert( typeof 1 ); // "number"

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

而且,因为下列代码中的zero,是一个对象,那个alert会展示信息:

let zero = new Number(0);

if (zero) { // zero is true, because it's an object
   alert( "zero is truthy?!?" );
}

另一方面,不使用new操作符来使用那些函数:String/Number/Boolean 是一个非常明智和实用的编程实践。它们将一个值转换为对应的类型:转为字符串,数值,或者一个布尔值。

举个例子,下列的diamante完全合法:

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

null/undefined 没有方法

那个特殊的原始类型nullundefined比较特殊。它们并没有对象的”包装对象“,也没有提供任何的方法。或者说,它们是”最原始“的类型。

如果尝试访问这些值的属性,会导致一个错误:

alert(null.test); // error

总结

  • 除了nullundefined,其他的原始类型都提供了很多实用的方法。我们将在接下来的章节中学习它们。
  • 在规范中,那些方法通过临时对象来工作,但是JavaScript引擎在内部可以很好地优化那些步骤,所以它们并没有想象的那么昂贵。

任务


可以添加一个字符串属性吗?

考虑下列的代码:

let str = "Hello";

str.test = 5;

alert(str.test);

你如何看待这段代码?代码的结果是什么?


天天编码 , 版权所有丨本文标题:5.1 原始类型的方法
转载请保留页面地址:http://www.tiantianbianma.com/method-of-primitive.html/
喜欢 (0)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址