zl程序教程

您现在的位置是:首页 >  前端

当前栏目

《JavaScript面向对象精要》——1.2 原始类型

JavaScript 类型 面向对象 1.2 原始 精要
2023-09-11 14:17:33 时间

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

1.2 原始类型

原始类型代表照原样保存的一些简单数据,如true和25。JavaScript共有5种原始类型,如下。

Boolean 布尔,值为true或false

Number 数字,值为任何整型或浮点数值

String 字符串,值为由单引号或双引号括出的单个字符或连续字符(JavaScript不区分字符类型)

Null 空类型,该原始类型仅有一个值:null

Undefined 未定义,该原始类型仅有一个值:undefined(undefined会被赋给一个还没有初始化的变量)

前3种类型(boolean,number和string)表现的行为类似,而后2种(null和undefined)则有一点区别,本章后面将会讨论。所有原始类型的值都有字面形式。字面形式是不被保存在变量中的值,如硬编码的姓名或价格。下面是每种类型使用字面形式的例子。

// strings

var name = "Nicholas";

var selection = "a";

// numbers

var count = 25;

var cost = 1.51;

// boolean

var found = true;

// null

var object = null;

// undefined

var flag = undefined;

var ref; // assigned undefined automatically

JavaScript和许多其他语言一样,原始类型的变量直接保存原始值(而不是一个指向对象的指针)。当你将原始值赋给一个变量时,该值将被复制到变量中。也就是说,如果你使一个变量等于另一个时,每个变量有它自己的一份数据拷贝。例如,

var color1 = "red";

var color2 = color1;

这里,color1被赋值为“red”。变量color2被赋予color1的值,这样变量color2中就保存了“red”。虽然color1和color2具有同样的值,但是两者毫无关联,改变color1的值不会影响color2,反之亦然。这是因为存在两个不同的储存地址,每个变量拥有一个。图1-1展示了这段代码的变量对象。
screenshot

因为每个含有原始值的变量使用自己的存储空间,一个变量的改变不会影响到其他变量。例如,

var color1 = "red";

var color2 = color1;

console.log(color1); // "red"

console.log(color2); // "red"

color1 = "blue";

console.log(color1); // "blue"

console.log(color2); // "red"

在这段代码中,color1被改为“blue”,而color2还保有原来的值“red”。

1.2.1 鉴别原始类型
鉴别原始类型的最佳方法是使用typeof操作符。它可以被用在任何变量上,并返回一个说明数据类型的字符串。Typeof操作符可用于字符串、数字、布尔和未定义类型。下面是typeof对不同原始类型的输出。

console.log(typeof "Nicholas"); // "string"

console.log(typeof 10); // "number"

console.log(typeof 5.1); // "number"

console.log(typeof true); // "boolean"

console.log(typeof undefined); // "undefined"

正如我们所期望的,对于字符串,typeof将返回“string”,对于数字将返回“number”(无论整型还是浮点数),对于布尔类型将返回“Boolean”,对于未定义类型将则返回“undefined”。

至于空类型则有一些棘手。

下面那行代码的运行结果困扰了很多开发者。

console.log(typeof null); // "object"

当你运行typeof null时,结果是“object”。但这是为什么呢?(其实这已经被设计和维护JavaScript的委员会TC39认定是一个错误。在逻辑上,你可以认为null是一个空的对象指针,所以结果为“object”,但这还是很令人困惑。)

判断一个值是否为空类型的最佳方法是直接和null比较,如下。

console.log(value === null); // true or false

非强制转换比较

注意这段代码使用了三等号操作符(===)而不是双等号。原因是三等号在进行比较时不会将变量强制转换为另一种类型。为了理解这点,请看下面的例子。

console.log("5" == 5); // true

console.log("5" === 5); // false

console.log(undefined == null); // true

console.log(undefined === null); // false

当你使用双等号进行比较时,双等号操作符会在比较之前把字符串转换成数字,因此认为字符串“5”和数字5相等。三等号操作符认为这两个值的类型不同,因此不相等。同样原因,当你比较undefined和null时,双等号认为它们相等而三等号认为不相等。当你试图鉴别null时,使用三等号才能让你正确鉴别出类型。
1.2.2 原始方法
虽然字符串、数字和布尔是原始类型,但是它们也拥有方法(null和undefined没有方法)。特别是字符串有很多方法,可以帮助你更好地使用它们。例如,

var name = "Nicholas";

var lowercaseName = name.toLowerCase(); // convert to lowercase

var firstLetter = name.charAt(0); // get first character

var middleOfName = name.substring(2, 5); // get characters 2-4

var count = 10;

var fixedCount = count.toFixed(2); // convert to "10.00"

var hexCount = count.toString(16); // convert to "a"

var flag = true;

var stringFlag = flag.toString(); // convert to "true"

注意:
尽管原始类型拥有方法,但它们不是对象。JavaScript使它们看上去像对象一样,以此来提供语言上的一致性体验,你会在本章后面看到这点。


JavaScript中的原始值与引用值 原始值与引用值 在JavaScript中包含两种不同类型的数据:原始值和引用值 原始值 :是指不包含任何引用的值(简单值),比如数字、字符串、布尔值、null和undefined。 引用值 :是指包含了一个引用的值,比如对象、数组、函数和方法。
《JavaScript启示录》——1.11 原始值(String、Number、Boolean)在被用做对象时就像对象 原始值被当作构造函数创建的一个对象来使用时,JavaScript会将其转换为一个对象,以便可以使用对象的特性(如方法),而后抛弃对象性质,并将它变回到原始值。下面的代码采用了原始值,并展示了将值作为对象使用时会发生什么事情。
《JavaScript启示录》——1.10 原始值比较采用值比较 可以通过比较原始值来确定其值在字面上是否相同。从逻辑上讲,如果将一个包含数值10的变量与另一个包含数值10的变量进行比较,JavaScript将会认为它们是相等的,因为10与10是相同的(即10===10)。
《JavaScript启示录》——1.9 如何存储和复制原始值 这里的重点是,原始值是作为不可细化的值进行存储和操作的。引用它们会转移其值。在上面的示例中,我们复制或者克隆了myString值并存储到myStringCopy变量中。当更新myString值时,myStringCopy值仍是旧myString值的副本。
《JavaScript启示录》 1.8 null、undefined、 string 、10、true和false等原始值不是对象 null和undefined都是非常简单的值,它们不需要构造函数,也没有使用new操作符来将自己创建为JavaScript值。欲使用null或undefined,只需将它们看做操作符来使用即可。从技术上来讲,从构造函数返回的字符、数字、布尔值并不是对象。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。