关于javascript:在-JavaScript-中我们能为原始类型添加一个属性或方法吗

4次阅读

共计 2234 个字符,预计需要花费 6 分钟才能阅读完成。

原始类型的办法

JavaScript 容许咱们像应用对象一样应用原始类型(字符串,数字等)。JavaScript 还提供了这样的调用办法。咱们很快就会学习它们,然而首先咱们将理解它的工作原理,毕竟原始类型不是对象(在这里咱们会剖析地更加分明)。

咱们来看看原始类型和对象之间的要害区别。

一个原始值:

  • 是原始类型中的一种值。
  • 在 JavaScript 中有 7 种原始类型:stringnumberbigintbooleansymbolnullundefined

一个对象:

  • 可能存储多个值作为属性。
  • 能够应用大括号 {} 创建对象,例如:{name: "John", age: 30}。JavaScript 中还有其余品种的对象,例如函数就是对象。

对于对象的最好的事儿之一是,咱们能够把一个函数作为对象的属性存储到对象中。

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

john.sayHi(); // Hi buddy!

所以咱们在这里创立了一个蕴含 sayHi 办法的对象 john

许多内建对象曾经存在,例如那些解决日期、谬误、HTML 元素等的内建对象。它们具备不同的属性和办法。

然而,这些个性(feature)都是有老本的!

对象比原始类型“更重”。它们须要额定的资源来反对运作。

当作对象的原始类型

以下是 JavaScript 创建者面临的悖论:

  • 人们可能想对诸如字符串或数字之类的原始类型执行很多操作。最好将它们作为办法来拜访。
  • 原始类型必须尽可能的简略轻量。

而解决方案看起来多少有点难堪,如下:

  1. 原始类型依然是原始的。与预期雷同,提供单个值
  2. JavaScript 容许拜访字符串,数字,布尔值和 symbol 的办法和属性。
  3. 为了使它们起作用,创立了提供额定性能的非凡“对象包装器”,应用后即被销毁。

“对象包装器”对于每种原始类型都是不同的,它们被称为 StringNumberBooleanSymbol。因而,它们提供了不同的办法。

例如,字符串办法 str.toUpperCase() 返回一个大写化解决的字符串。

用法演示如下:

let str = "Hello";

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

很简略,对吧?以下是 str.toUpperCase() 中理论产生的状况:

  1. 字符串 str 是一个原始值。因而,在拜访其属性时,会创立一个蕴含字符串字面值的非凡对象,并且具备有用的办法,例如 toUpperCase()
  2. 该办法运行并返回一个新的字符串(由 alert 显示)。
  3. 非凡对象被销毁,只留下原始值 str

所以原始类型能够提供办法,但它们仍然是轻量级的。

JavaScript 引擎高度优化了这个过程。它甚至可能跳过创立额定的对象。然而它依然必须恪守标准,并且体现得如同它创立了一样。

数字有其本人的办法,例如,toFixed(n) 将数字舍入到给定的精度:

let n = 1.23456;

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

咱们将在前面 Number 类型 和 字符串 章节中看到更多具体的办法。

结构器 String/Number/Boolean 仅供外部应用

像 Java 这样的一些语言容许咱们应用 new Number(1)new Boolean(false) 等语法,明确地为原始类型创立“对象包装器”。

在 JavaScript 中,因为历史起因,这也是能够的,但极其 不举荐 。因为这样会出问题。

例如:

alert(typeof 0); // "number"

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

对象在 if 中始终为真,因而此处的 alert 将显示:

let zero = new Number(0);

if (zero) { // zero 为 true,因为它是一个对象
  alert("zero is truthy?!?");
}

另一方面,调用不带 new(关键字)的 String/Number/Boolean 函数是齐全理智和有用的。它们将一个值转换为相应的类型:转成字符串、数字或布尔值(原始类型)。

例如,上面齐全是无效的:

let num = Number("123"); // 将字符串转成数字 

null/undefined 没有任何办法

非凡的原始类型 nullundefined 是例外。它们没有对应的“对象包装器”,也没有提供任何办法。从某种意义上说,它们是“最原始的”。

尝试拜访这种值的属性会导致谬误:

alert(null.test); // error

总结

  • nullundefined 以外的原始类型都提供了许多有用的办法。咱们前面的章节中学习这些内容。
  • 从模式上讲,这些办法通过长期对象工作,但 JavaScript 引擎能够很好地调整,以在外部对其进行优化,因而调用它们并不需要太高的老本。

作业题

先本人做题目再看答案。

我能为字符串增加一个属性吗?

重要水平:⭐️⭐️⭐️⭐️⭐️

思考上面的代码:

let str = "Hello";

str.test = 5;

alert(str.test);

你怎么想的呢,它会工作吗?会失去什么样的后果?

答案:

在微信公众号「技术漫谈」后盾回复 10501 获取作业答案。


古代 JavaScript 教程:开源的古代 JavaScript 从入门到进阶的优质教程。React 官网文档举荐,与 MDN 并列的 JavaScript 学习教程。

在线收费浏览:https://zh.javascript.info


微信扫描下方二维码,关注公众号「技术漫谈」,订阅更多精彩内容。

正文完
 0