《JavaScript面向对象精要》——1.8 原始封装类型

本节书摘来自异步社区《JavaScript面向对象精要》一书中的第1章,第1.8节,作者:【美】Nicholas C. Zakas著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.8 原始封装类型

JavaScript中一个最让人困惑的部分可能就是原始封装类型的概念。原始封装类型共有3种(String、Number和Boolean)。这些特殊引用类型的存在使得原始类型用起来和对象一样方便。(如果你不得不用独特的语法或切换为基于过程的编程方式来获取一个子字符串,那就太让人困惑啦)。

当读取字符串、数字或布尔值时,原始封装类型将被自动创建。例如,下列代码第一行,一个原始字符串的值被赋给name。第二行代码把name当成一个对象,使用点号调用了charAt方法。

var name = "Nicholas";
var firstChar = name.charAt(0);
console.log(firstChar);     // "N"

这是在背后发生的事情如下。

// what the JavaScript engine does
var name = "Nicholas";
var temp = new String(name);
var firstChar = temp.charAt(0);
temp = null;
console.log(firstChar);     // "N"

由于第二行把字符串当成对象使用,JavaScript引擎创建了一个字符串的实体让charAt(0)可以工作。字符串对象的存在仅用于该语句并在随后被销毁(一种称为自动打包的过程)。为了测试这一点,试着给字符串添加一个属性看看它是不是对象。

var name = "Nicholas";
name.last = "Zakas";console.log(name.last);     // undefined

这段代码试图给字符串name添加last属性。代码运行时没有错误,但是属性却消失了。到底发生了什么?你可以在任何时候给一个真的对象添加属性,属性会保留至你手动删除它们。原始封装类型的属性会消失是因为被添加属性的对象立刻就被销毁了。

下面是在JavaScript引擎中实际发生的事情。

// what the JavaScript engine does
var name = "Nicholas";
var temp = new String(name);
temp.last = "Zakas";
temp = null;           // temporary object destroyedvar temp = new String(name);
console.log(temp.last);    // undefined
temp = null;

实际上是在一个立刻就被销毁的临时对象上而不是字符串上添加了新的属性。之后当你试图访问该属性时,另一个不同的临时对象被创建,而新属性并不存在。虽然原始封装类型会被自动创建,在这些值上进行instanceof检查对应类型的返回值却都是false。

var name = "Nicholas";
var count = 10;
var found = false;console.log(name instanceof String);   // false
console.log(count instanceof Number);   // false
console.log(found instanceof Boolean);  // false

这是因为临时对象仅在值被读取时创建。instanceof操作符并没有真的读取任何东西,也就没有临时对象的创建,于是它告诉我们这些值并不属于原始封装类型。

你也可以手动创建原始封装类型,但有某些副作用。

var name = new String("Nicholas");
var count = new Number(10);
var found = new Boolean(false);console.log(typeof name);     // "object"
console.log(typeof count);    // "object"
console.log(typeof found);    // "object"

如你所见,手动创建原始封装类型实际会创建出一个object,这意味着typeof无法鉴别出你实际保存的数据的类型。

另外,使用String、Number和Boolean对象和使用原始值有一定区别。例如,下列代码使用了Boolean对象,对象的值是false,但console.log(“Found”)依然会被执行。这是因为一个对象在条件判断语句中总被认为是true,无论该对象的值是不是等于false。

var found = new Boolean(false);
if (found) {console.log("Found");              // this executes
}

手工创建的原始封装类型在其他地方也很容易让人误解,在大多数情况下都只会导致错误。所以,除非有特殊情况,你应该避免这么做。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XML语法学习

本文章集合两篇博文而写&#xff0c;两篇博文地址&#xff1a; XML学习总结(二)——XML入门&#xff1a; XML基础<第一篇> XML简介 XML是一种标记语言&#xff0c;用于描述数据&#xff0c;它提供一种标准化的方式来来表示文本数据。XML文档以.xml为后缀。需要彻底注…

FM实现F4帮助系列三:弹出框多筛选…

FM实现F4帮助系列三&#xff1a;弹出框多筛选条件的搜索帮助&#xff08;根据搜索帮助筛选字段&#xff09;函数&#xff1a;F4IF_GET_SHLP_DESCRF4IF_START_VALUE_REQUEST效果图&#xff1a;本例子代码&#xff1a;找到需要的帮助:*&------------------------------------…

[数分提高]2014-2015-2第9教学周第1次课 (2015-04-28)

设 $$\bex a,b>0,\quad 0\leq f\in \calR[a,b],\quad \int_a^b xf(x)\rd x0. \eex$$ 试证: $$\bex \int_a^b x^2f(x)\rd x\leq ab \int_a^b f(x)\rd x; \eex$$ 并给出使得下列不等式成立的 (您认为的) 最优数: $$\bex \int_a^b x^3f(x)\rd x\leq (\quad) \int_a^b f(x)\rd x…

《计算复杂性:现代方法》——0.2 判定问题/语言

本节书摘来自华章计算机《计算复杂性&#xff1a;现代方法》一书中的第0章&#xff0c;第0.2节&#xff0c;作者 &#xff3b;美&#xff3d;桑杰夫阿罗拉&#xff08;Sanjeev Arora&#xff09;&#xff0c;博阿兹巴拉克&#xff08;Boaz Barak&#xff09;&#xff0c;译 骆吉…

python从date目录导入数据集_使用python划分数据集

无论是训练机器学习或是深度学习&#xff0c;第一步当然是先划分数据集啦&#xff0c;今天小白整理了一些划分数据集的方法&#xff0c;希望大佬们多多指教啊&#xff0c;嘻嘻~ 首先看一下数据集的样子&#xff0c;flower_data文件夹下有四个文件夹&#xff0c;每个文件夹表示一…

开源牛人 zcbenz

事情是这样的&#xff0c;微软推出了Visual Studio Code&#xff0c;我很好奇他怎么做跨平台的&#xff0c;所以就找找资料&#xff0c;在他的网站中是这么描述的&#xff1a; Architecturally, Visual Studio Code combines the best of web, native, and language-specific t…

eclipse 与 tomcat 的那些路径

我们用mvn创建了一个web工程&#xff0c;同时希望在eclipse里调试开发。mvn有mvn的路径要求&#xff0c;eclispe有eclipse的默认路径&#xff0c;怎么整合二者&#xff1f; 首先介绍一下eclipse的默认路径。 重点在Server Locations里面。 下面我们把[workspace]/.metadata\.pl…

boost解析xml文件

前面我们介绍了xml文件&#xff0c;今天我们试着用boost库来解析xml文件。我们将举两个例子来说明怎么使用。 来自boost官方的例子 先看xml文件的内容&#xff1a; <debug><filename>debug.log</filename><modules><module>Finance</modul…

使用网桥模式(bridge networking mode)配置KVM-QUME虚拟机网络

&#xff08;1&#xff09;linux要工作在网桥模式&#xff0c;所以必须安装两个RPM包。即&#xff1a;bridge-utils和tunctl。它们提供所需的brctl、tunctl命令行工具。能够使用yum在线安装&#xff1a; [rootserver3 ~]# yum install bridge-utils &#xff08;2&#xff09;查…

python数据处理常用函数_pandas数据分析常用函数总结大全:上篇

基础知识在数据分析中就像是九阳神功&#xff0c;熟练的掌握&#xff0c;加以运用&#xff0c;就可以练就深厚的内力&#xff0c;成为绝顶高手自然不在话下&#xff01; 为了更好地学习数据分析&#xff0c;我对于数据分析中pandas这一模块里面常用的函数进行了总结。整篇总结&…

XML的应用

1.XML的定义: XML 于 1998 年 2 月 10 日成为 W3C 的推荐标准。xml一般指可扩展标记语言&#xff0c;可扩展标记语言是一种很像超文本标记语言的标记语言。它的设计宗旨是传输数据&#xff0c;而不是显示数据。 2.通过XML我们可以自定义自己的标签&#xff0c;如&#xff1a; &…

虚拟机VMware里 windows server 2003 扩充C盘方法

你会经常用windows server 2003 吗&#xff1f;应该不会吧&#xff0c;有时一些东西必须装在windows server 2003 上才能用&#xff0c;所以 用虚拟机把&#xff0c;好&#xff0c;装在虚拟机上&#xff0c;8G的C盘够你用吗&#xff0c;一个稍微大点的软件就可能就没空间来存储…

从运维角度浅谈MySQL数据库优化

一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的&#xff0c;它是随着用户量的增加&#xff0c;基础架构才逐渐完善。这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案&#xff0c;暂且抛开前端应用不说&#xff0c;大致分为以下五个阶段&#x…

c语言c99标准_自学C语言之一

上次自学C语言还是在刚开学到国庆期间&#xff0c;听学姐的建议买了本C语言的书&#xff0c;在军训期间的晚上翻翻看看。后来选课、开始正式上课、面试社团、开各种会等等&#xff0c;好像每天都有许多事要忙&#xff0c;但又没忙出来什么结果&#xff0c;慢慢地好像就把C语言放…

boost解析info文件

先给出info文件&#xff1a; parameters {MAX_STAGES 4MAX_DEPTH 3MAX_NUMTRESS 5MAX_NUMTHRESHS 500MAX_NUMFEATS 1000,1000,1000,500,500,500,400,400MAX_RATIO_RADIUS 0.3,0.2,0.2,0.15,0.12,0.10,0.08,0.06,0.06,0.05BAGGING_OVERLAP 0.4IS_FLIP true }meanface {MAX_ITER…

Font Rending 的 Hint 机制对排版的影响

Font Rending 的 Hint 机制对排版的影响【转】 在设计一种 Font 时&#xff0c;设计者使用的是一个抽象的单位&#xff0c;叫做 EM&#xff0c;来源于大写 M 的宽度&#xff08;通常英文字体中大写 M 的宽度最大&#xff09;。EM 即不同于在屏幕显示时用的像素&#xff08;Pixe…

《SQL初学者指南(第2版)》——2.4 指定列

本节书摘来自异步社区出版社《SQL初学者指南&#xff08;第2版&#xff09;》一书中的第2章&#xff0c;第2.4节&#xff0c;作者&#xff1a;【美】Larry Rockoff&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.4 指定列 到目前为止&#xff0c;我们只…

python从文件中提取特定文本_使用Python从HTML文件中提取文本

我发现最好的一段代码用于提取文本&#xff0c;而不需要javascript或不需要的东西&#xff1a;import urllibfrom bs4 import BeautifulSoupurl "http://news.bbc.co.uk/2/hi/health/2284783.stm"html urllib.urlopen(url).read()soup BeautifulSoup(html)# kill …

mutable、volatile的使用

本文转载自http://blog.csdn.net/tht2009/article/details/6920511 (1)mutable 在C中&#xff0c;mutable是为了突破const的限制而设置的。被mutable修饰的变量&#xff0c;将永远处于可变的状态&#xff0c;即使在一个const函数中&#xff0c;甚至结构体变量或者类对象为const…

文本框点击后文字消失总结

1.文本框显示默认文字&#xff1a; <textarea>白鸽男孩</textarea> <textarea>白鸽男孩</textarea>    2.鼠标点击文本框&#xff0c;默认文字消失&#xff1a; <textarea οnfοcus”if(value’白鸽男孩’) {value’ ‘}”>白鸽男孩</text…