《JavaScript面向对象精要》——1.2 原始类型
本节书摘来自异步社区《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展示了这段代码的变量对象。
因为每个含有原始值的变量使用自己的存储空间,一个变量的改变不会影响到其他变量。例如,
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月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Javascript Prototypes之旅(A Plain English Guide to JavaScript Prototypes译文)
- JavaScript中removeEventListener()使用注意事项
- javascript遍历控件(实例详解)
- javascript、js操作json对象和字符串互相转换方法
- [Javascript] Use requestIdleCallback to schedule JavaScript tasks at an optimal time
- [Javascript] Avoiding Mutations in JavaScript with Immutable Data Structures
- [Javascript] JavaScript Array Methods in Depth - push
- [Javascript] Linting JavaScript with ESLint
- [Javascript] Hide Properties from Showing Up in "for ... in" Loops in JavaScript
- [Javascript] Avoid Nested For Loops with Generators
- [Javascript] Iterate Over Items with JavaScript's for-of Loop
- [Javascript] Redirect the browser using JavaScript
- [Javascript] Prototype 2 Object.create()
- 169. 使用 Chrome 开发者工具分析 SAP UI5 应用的 JavaScript 代码执行性能瓶颈
- JavaScript学习总结(四)——this、原型链、javascript面向对象
- javascript基础概要复习(类型、数组、函数、面向对象)
- web前端Javascript开发学习之JavaScript中的预编译如何进行