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

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使它们看上去像对象一样,以此来提供语言上的一致性体验,你会在本章后面看到这点。

时间: 2024-09-17 01:36:13

《JavaScript面向对象精要》——1.2 原始类型的相关文章

《JavaScript面向对象精要》——第1章 原始类型和引用类型 1.1 什么是类型

第1章 原始类型和引用类型 大多数开发者在使用Java或C#等基于类的语言的过程中学会了面向对象编程.由于JavaScript没有对类的正式支持,这些开发者在学习JavaScript时往往会迷失方向.JavaScript不需要在开头就定义好各种类,你可以在写代码的过程中根据需要创建数据结构.由于JavaScript缺少类,也就缺少用于对类进行分组的包.在Java中,包和类的名字不仅定义了对象的类型,也在工程中列出文件和目录的层次结构,JavaScript编程就好像从一块空白石板开始:你可以在上面

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

1.8 原始封装类型 JavaScript中一个最让人困惑的部分可能就是原始封装类型的概念.原始封装类型共有3种(String.Number和Boolean).这些特殊引用类型的存在使得原始类型用起来和对象一样方便.(如果你不得不用独特的语法或切换为基于过程的编程方式来获取一个子字符串,那就太让人困惑啦). 当读取字符串.数字或布尔值时,原始封装类型将被自动创建.例如,下列代码第一行,一个原始字符串的值被赋给name.第二行代码把name当成一个对象,使用点号调用了charAt方法. var n

《JavaScript面向对象精要》——1.4 内建类型实例化

1.4 内建类型实例化 你已经见过如何用new Object()创建和使用通用对象.Object类型只是JavaScript提供的少量内建引用类型之一.其他内建类型各有它们的特殊用途,可在任何时候被实例化. 这些内建类型如下. Array 数组类型,以数字为索引的一组值的有序列表 Date 日期和时间类型 Error 运行期错误类型(还有一些更特别的错误的子类型) Function 函数类型 Object 通用对象类型 RegExp 正则表达式类型 可以用new来实例化每一个内建引用类型,如下.

《JavaScript面向对象精要》——导读

**前言**JavaScript拥有上述全部特性,因为语言本身没有类的概念,所以某些特性可能不是以你所期望的方式实现的.乍一看,一个JavaScript程序可能像是一个用C来编写的面向过程的程序.如果写一个函数并传递一些参数,就有了一个看上去没有对象也可工作的脚本.但是仔细观察,你就会在点号的使用上发现对象的存在. 很多面向对象的语言使用点号来访问对象的属性和方法,JavaScript也不例外.但是你永远不需要在JavaScript中写一个类定义,导入一个包或包含一个头文件.你只是用你需要的数据

《JavaScript面向对象精要》——1.9 总结

1.9 总结 型以及未定义)的值会被直接保存在变量对象中.除了空类型,都可以用typeof来鉴别.空类型必须直接跟null进行比较才能鉴别. 引用类型是JavaScript中最接近类的东西,而对象则是引用类型的实例.可以用new操作符或字面形式创建新对象.通常可以用点号访问属性和方法,也可以用中括号.函数在JavaScript中也是对象,可以用typeof鉴别它们.至于其他引用类型,你应该用instanceof和一个构造函数来鉴别. 为了让原始类型看上去更像引用类型,JavaScript提供了3

《JavaScript面向对象精要》——1.3 引用类型

1.3 引用类型 引用类型是指JavaScript中的对象,同时也是你在该语言中能找到的最接近类的东西.引用值是引用类型的实例,也是对象的同义词(本章后面将用对象指代引用值).对象是属性的无序列表.属性包含键(始终是字符串)和值.如果一个属性的值是函数,它就被称为方法.JavaScript中函数其实是引用值,除了函数可以运行以外,一个包含数组的属性和一个包含函数的属性没有什么区别. 当然,在使用对象前,你必须先创建它们. 1.3.1 创建对象有时候,把JavaScript对象想象成图1-2中的哈

JavaScript面向对象精要

1. 作为函数调用,指代的是全局对象 如果我们定义以下函数: function f() {    console.log(this);} 然后将其作为普通对象调用,即f(),此时this指代的是全局对象window. 2. 作为对象的方法调用,指代是调用对象本身 如果我们将f作为一个对象的方法,也就是说作如下改造: var a = {};a.f = f; 然后通过对象a调用方法f,即a.f(),此时this指代的就是调用者a. 3. 作为构造器函数使用,指代的隐含的新建对象 如果我们用new语句

《JavaScript面向对象精要》——1.6 鉴别引用类型

1.6 鉴别引用类型 函数是最容易鉴别的引用类型,因为对函数使用typeof操作符时,返回值是"function". function reflect(value) { return value; } console.log(typeof reflect); // "function" 对其他引用类型的鉴别则较为棘手,因为对于所有非函数的引用类型,typeof返回"object".在处理很多不同类型的时候这帮不上什么忙.为了更方便地鉴别引用类型,

《JavaScript面向对象精要》——1.7 鉴别数组

1.7 鉴别数组 虽然instanceof可以鉴别数组,但是有一个例外会影响网页开发者:JavaScript的值可以在同一个网页的不同框架之间传来传去.当你试图鉴别一个引用值的类型时,这就有可能成为一个问题,因为每一个页面拥有它自己的全局上下文--Object.Array以及其他内建类型的版本.结果,当你把一个数组从一个框架传到另一个框架时,instanceof就无法识别它,因为那个数组是来自不同框架的Array的实例. 为了解决这个问题,ECMAScript 5引入了Array.isArray