《JavaScript权威指南》读书笔记(4)-对象类型

JavaScript 对象类型

概述

JavaScript的数据类型分为两类:原始类型和对象类型。JavaScript中的原始类型包括数字、字符串和布尔值

JavaScript中除了数字、字符串、布尔值、null、undefined之外的就是对象了。对象(object)是属性(property)的集合,每个属性都由“名/值对”(值可以是原始值,数字、字符串、布尔值、null、undefined,也可以是对象)构成。其中有一个比较特殊的对象——全局对象

普通的JavaScript对象是“命名值”的无序集合。JavaScript同样定义了一种特殊对象——数组,表示带编号的值的有序集合。JavaScript为数组定义了专门的语法,使数组用用一些和普通对象不同的特有行为特性。

JavaScript中,函数也是一种特殊对象。函数是具有与它相关联的可执行代码的对象,通过调用函数来运行可执行代码,并返回运算结果。和数组一样,函数的行为特征和其他对象都不一样。JavaScript为使用函数定义了专用语法。在JavaScript中可以将函数当做普通对象来对待。

JavaScript语言核心中定义了Array类、Function类、Date类、RegExp类、Error类。Date类定义了代表日期的对象,RegExp类定义了表示正则表达式的对象,Error类定义了那些表示JavaScript程序中运行时错误和语法错误的对象。

JavaScript解释器有自己的内存管理机制,可以自动对内存进行垃圾回收。这意味着程序可以按需创建对象,程序员则不必担心这些对象的销毁和内存回收。当不再有任何引用指向一个对象,解释器就会知道这个对象没用了,然后自动回收它所占用的内存资源。

JavaScript解释器启动时,它将创建一个新的全局对象,并给它一组定义的初始属性:

  • 全局属性,eg.undefined、Infinity、NaN
  • 全局函数,eg.isNaN()、parseInt()、eval()
  • 构造函数,eg.Date()、RegExp()、String()、Object()、Array()
  • 全局对象,eg.Math、JSON

全局对象

在代码的最顶级——不在任何函数内的JavaScript代码——可以使用JavaScript关键字this来引用全局对象:

var global = this;

在客户端JavaScript中,Window对象充当了全局对象。这个全局Window对象有一个属性window引用其自身,它可以代替this来引用全局对象。

初次创建时,全局对象为JavaScript定义了所有的预定义全局值。

日期对象

var then = new Date(2011, 0, 1);	//月从0开始计数,日从1开始计数
var later = new Date(2011, 0, 1, 17, 10, 30);
var now = new Date();
var elapsed = now -then;	//日期减法,计算时间间隔的毫秒数



Date 对象方法

方法 描述
Date() 返回当日的日期和时间。
getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getMonth() 从 Date 对象返回月份 (0 ~ 11)。
getFullYear() 从 Date 对象以四位数字返回年份。
getYear() 请使用 getFullYear() 方法代替。
getHours() 返回 Date 对象的小时 (0 ~ 23)。
getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。
getTime() 返回 1970 年 1 月 1 日至今的毫秒数。
getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差。
getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31)。
getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。
getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)。
getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份。
getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23)。
getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59)。
getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59)。
getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999)。
parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒数。
setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。
setMonth() 设置 Date 对象中月份 (0 ~ 11)。
setFullYear() 设置 Date 对象中的年份(四位数字)。
setYear() 请使用 setFullYear() 方法代替。
setHours() 设置 Date 对象中的小时 (0 ~ 23)。
setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。
setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。
setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。
setTime() 以毫秒设置 Date 对象。
setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。
setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。
setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)。
setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)。
setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)。
setUTCSeconds() 根据世界时设置 Date 对象中的秒钟 (0 ~ 59)。
setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)。
toSource() 返回该对象的源代码。
toString() 把 Date 对象转换为字符串。
toTimeString() 把 Date 对象的时间部分转换为字符串。
toDateString() 把 Date 对象的日期部分转换为字符串。
toGMTString() 请使用 toUTCString() 方法代替。
toUTCString() 根据世界时,把 Date 对象转换为字符串。
toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。
toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。
toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。
UTC() 根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。
valueOf() 返回 Date 对象的原始值。

Number对象

Number 对象属性

属性 描述
constructor 返回对创建此对象的 Number 函数的引用。
MAX_VALUE 可表示的最大的数。
MIN_VALUE 可表示的最小的数。
NaN 非数字值。
NEGATIVE_INFINITY 负无穷大,溢出时返回该值。
POSITIVE_INFINITY 正无穷大,溢出时返回该值。
prototype 使您有能力向对象添加属性和方法。

number对象方法

方法 描述
toString 把数字转换为字符串,使用指定的基数。无参默认十进制。
toLocaleString 把数字转换为字符串,使用本地数字格式顺序。
toFixed 把数字转换为字符串,结果的小数点后有指定位数的数字。
toExponential 把对象的值转换为指数计数法。
toPrecision 把数字格式化为指定的长度。
valueOf 返回一个 Number 对象的基本数字值。

包装对象

在JavaScript中,字符串直接量是原始类型,不是对象类型,然而字符串直接量却是可以用'.'或'[]'来调用对象才有的属性和方法的。

事实上,JavaScript中的字符串直接量确实是没有属性和方法的,但如果JavaScript中的字符串直接量调用了它的属性和方法,JavaScript会把字符串直接量进行包装处理,即通过调用new String(s)的方法将字符串直接量转换成String对象。但这种方法,一旦属性或方法引用结束,该String对象就会销毁。与字符串类似的,数字和布尔值也具有各自的方法,通过Number()和Boolean()构造函数创建一个临时对象,这些方法的调用均是来自于这个临时对象。null和undefined没有包装对象,因此访问他们的属性会造成一个类型错误。

eg.

var s = "test";
s.len = 4;
var t = s.len;

这段程序的运行结果,t的值是undefined。

对于对象而言,引用不同,""相等运算符就视为不同。但对字符串对象、数字对象、布尔值对象而言,JavaScript会在必要的时候将包装对象转换成原始值,比如说字符串内容相同的字符串直接量和字符串对象被相等运算符“”视为相等,但“===”全等运算符视为不等。通过typeof运算符可以看到原始值和其包装对象的不同。

相关

不可变的原始值和可变的对象

JavaScript中的原始值是不可更改的。我们在修改数字、布尔值、字符串的时候,实际上返回到是一个新的字符串,而不是将原有的字符串进行修改。学过C语言的人可能会认为,字符串的修改是在原有的内存区段进行的,事实上并不是,而是JavaScript中新建了一片空间,并按照需求进行了操作,再返回了所需求的字符串。因此返回的字符串是在一块新的空间中的,原来的字符串并没有进行修改。

对象是可以进行改变的。例如,对对象的属性进行修改。并且,对象的比较并非是值的比较,即使是两个包含同样属性及相同的值的对象,他们也不是相等的。各个引索元素完全相等的两个数组也不相等。因为对象是引用类型,对象的比较均是引用的比较。当且仅当它们引用同一个基对象时,它们才相等。

posted @ 2018-08-30 14:06  jeffmeoi  阅读(102)  评论(0)    收藏  举报