专业编程基础技术教程

网站首页 > 基础教程 正文

游戏开发之旅-JavaScript其它类型与常用对象

ccvgpt 2024-08-10 12:47:37 基础教程 7 ℃

本节是第四讲的第二十六小节,上一节我们为大家介绍了JavaScript的基本数据类型、对象、数组、函数、自定义对象等概念。本节将为大家介绍Symbol类型、Date对象、Error对象、RegExp对象。

Symbol类型

游戏开发之旅-JavaScript其它类型与常用对象

ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法,新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因,symbol 是一种基本数据类型 (primitive data type),Symbol()函数会返回symbol类型的值,每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。

基本数据类型:Number(数字)、String(字符串)、Boolean(布尔)、Symbol(符号)、Object(对象)、null(空)、undefined(未定义)

Symbol([description])

//description -可选的,字符串类型。对symbol的描述,可用于调试但不是访问symbol本身。

var sym1 = Symbol();

var sym2 = Symbol('foo');

var sym3 = Symbol('foo');

上面的代码创建了三个新的symbol类型。 注意,Symbol("foo") 不会强制将字符串 “foo” 转换成symbol类型。它每次都会创建一个新的 symbol类型:

Symbol("foo") === Symbol("foo"); // false

var sym = new Symbol(); // 带有 new 运算符的语法将抛出 TypeError 错误。

这会阻止创建一个显式的 Symbol 包装器对象而不是一个 Symbol 值。围绕原始数据类型创建一个显式包装器对象从 ECMAScript 6 开始不再被支持。 然而,现有的原始包装器对象,如 new Boolean、new String以及new Number,因为遗留原因仍可被创建。

//想创建一个 Symbol 包装器对象 (Symbol wrapper object),你可以使用 Object() 函数。

var sym = Symbol("foo");typeof sym; // "symbol"

var symObj = Object(sym);typeof symObj; // "object"

全局共享的 Symbol

上面使用Symbol() 函数的语法,不会在你的整个代码库中创建一个可用的全局的symbol类型。 要创建跨文件可用的symbol,甚至跨域(每个都有它自己的全局作用域) , 使用 Symbol.for() 方法和 Symbol.keyFor() 方法从全局的symbol注册表设置和取得symbol。

Symbol.for(key)

//使用给定的key搜索现有的symbol,如果找到则返回该symbol。否则将使用给定的key在全局symbol注册表中创建一个新的symbol。

Symbol.keyFor(sym)//从全局symbol注册表中,为给定的symbol检索一个共享的symbol key。

Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo"

Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol

Symbol.for("foo") === Symbol.for("foo"); // true,证明了上面说的

var globalSym = Symbol.for("foo"); Symbol.keyFor(globalSym); // "foo"

在对象中查找 Symbol 属性

Object.getOwnPropertySymbols() 方法让你在查找一个给定对象的符号属性时返回一个symbol类型的数组。注意,每个初始化的对象都是没有自己的symbol属性的,因此这个数组可能为空,除非你已经在对象上设置了symbol属性。

var obj = {};var a = Symbol("a");var b = Symbol.for("b");

obj[a] = "localSymbol";obj[b] = "globalSymbol";

var objectSymbols = Object.getOwnPropertySymbols(obj);

console.log(objectSymbols.length); // 2

console.log(objectSymbols) // [Symbol(a), Symbol(b)]

console.log(objectSymbols[0]) // Symbol(a)

JavaScript内置对象Date

Date 对象则基于 Unix Time Stamp,即自1970年1月1日(UTC)起经过的毫秒数。

//如果没有提供参数,那么新创建的Date对象表示实例化时刻的日期和时间。

new Date();

//value: 一个 Unix 时间戳(Unix Time Stamp),它是一个整数值,表示自1970年1月1日00:00:00 UTC(the Unix epoch)以来的毫秒数,请注意//大多数 Unix 时间戳功能仅精确到最接近的秒。

new Date(value);

//dateString:表示日期的字符串值,该字符串应该能被 Date.parse() 正确方法识别。注意: 由于浏览器之间的差异与不一致性,强烈不推荐使用//Date构造函数来解析日期字符串 (或使用与其等价的Date.parse)。

new Date(dateString);

//当至少提供了年份与月份时,这一形式的 Date() 返回的 Date 对象中的每一个成员都来自下列参数,没有提供的成员将使用最小可能值。

//year:表示年份的整数值。 0到99会被映射至1900年至1999年,其它值代表实际年份。

//monthIndex:表示月份的整数值,从 0(1月)到 11(12月)。

//date:表示一个月中的第几天的整数值,从1开始。默认值为1。

//hours:表示一天中的小时数的整数值 (24小时制)。默认值为0(午夜)。

//minutes:表示一个完整时间(如 01:10:00)中的分钟部分的整数值。默认值为0。

//seconds:表示一个完整时间(如 01:10:00)中的秒部分的整数值。默认值为0。

//milliseconds:表示一个完整时间的毫秒部分的整数值。默认值为0。

new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);

注意:当Date作为构造函数调用并传入多个参数时,如果数值大于合理范围时(如月份为 13 或者分钟数为 70),相邻的数值会被调整。比如 new Date(2013, 13, 1)等于new Date(2014, 1, 1),它们都表示日期2014-02-01(注意月份是从0开始的)。其他数值也是类似,new Date(2013, 2, 1, 0, 70)等于new Date(2013, 2, 1, 1, 10),都表示同一个时间:2013-03-01 01:10:00。

对象Date简介

如果没有输入任何参数,则Date的构造器会依据系统设置的当前时间来创建一个Date对象。

JavaScript的时间由世界标准时间(UTC)1970年1月1日开始,用毫秒计时,一天由 86,400,000 毫秒组成。Date 对象的范围是

-100,000,000 天至 100,000,000 天(等效的毫秒值)。

Date 对象支持多个处理 UTC 时间的方法,也相应地提供了应对当地时间的方法。UTC,也就是我们所说的格林威治时间,指的是time中的世界时间标准。而当地时间则是指执行JavaScript的客户端电脑所设置的时间。

以一个函数的形式来调用 Date 对象(即不使用 new 操作符)会返回一个代表当前日期和时间的字符串。

Date.prototype //允许为 Date 对象添加属性。

Date.length //Date.length 的值是 7。这是该构造函数可接受的参数个数。

Date.now() //返回自 1970-1-1 00:00:00 UTC(世界标准时间)至今所经过的毫秒数。

Date.parse() //解析一个表示日期的字符串,并返回从 1970-1-1 00:00:00 所经过的毫秒数。(由于浏览器差异和不一致,不建议使用)

Date.UTC() //接受和构造函数最长形式的参数相同的参数(从2到7),并返回从 1970-01-01 00:00:00 UTC 开始所经过的毫秒数。

Date.prototype.getDate() //根据本地时间返回指定日期对象的月份中的第几天(1-31)。

Date.prototype.getDay() //根据本地时间返回指定日期对象的星期中的第几天(0-6)。

Date.prototype.getFullYear() //根据本地时间返回指定日期对象的年份(四位数年份时返回四位数字)。

Date.prototype.getHours() //根据本地时间返回指定日期对象的小时(0-23)。

Date.prototype.getMilliseconds() //根据本地时间返回指定日期对象的毫秒(0-999)。

Date.prototype.getMinutes() //根据本地时间返回指定日期对象的分钟(0-59)。

Date.prototype.getMonth() //根据本地时间返回指定日期对象的月份(0-11)。

Date.prototype.getSeconds() //根据本地时间返回指定日期对象的秒数(0-59)。

Date.prototype.getTime() //返回从1970-1-1 00:00:00 UTC(协调世界时)到该日期经过的毫秒数,对于1970-1-1 00:00:00 UTC之前的时间返回负值

JavaScript内置对象Error

通过Error的构造器可以创建一个错误对象。当运行时错误产生时,Error的实例对象会被抛出。Error对象也可用于用户自定义的异常的基础对象。下面列出了各种内建的标准错误类型。

new Error([message[, fileName[,lineNumber]]])

//message:可选。人类可阅读的错误描述信息。

//fileName:可选。被创建的Error对象的fileName属性值。默认是调用Error构造器代码所在的文件 的名字。

//可选。被创建的Error对象的lineNumber属性值。默认是调用Error构造器代码所在的文件的行号。

Error 类型

EvalError :创建一个error实例,表示错误的原因:与 eval() 有关。

InternalError :创建一个代表Javascript引擎内部错误的异常抛出的实例。 如: "递归太多".

RangeError :创建一个error实例,表示错误的原因:数值变量或参数超出其有效范围。

ReferenceError :创建一个error实例,表示错误的原因:无效引用。

SyntaxError :创建一个error实例,表示错误的原因:eval()在解析代码的过程中发生的语法错误。

TypeError :创建一个error实例,表示错误的原因:变量或参数不属于有效类型。

URIError :创建一个error实例,表示错误的原因:给 encodeURI()或 decodeURl()传递的参数无效。

try { //抛出一个基本错误,Error:Whoops!

throw new Error("Whoops!");

} catch (e) {

alert(e.name + ": " + e.message);}

JavaScript内置对象RegExp

正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。

创建一个正则表达式

使用一个正则表达式字面量,其由包含在斜杠之间的模式组成,脚本加载后,正则表达式字面量就会被编译。当正则表达式保持不变时,使用此方法可获得更好的性能。

var re = /ab+c/;

调用RegExp对象的构造函数,在脚本运行过程中,用构造函数创建的正则表达式会被编译。如果正则表达式将会改变,或者它将会从用户输入等来源中动态地产生,就需要使用构造函数来创建正则表达式。

var re = new RegExp("ab+c");

使用正则表达式的方法

exec:一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null)。

test:一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false。

match:一个在字符串中执行查找匹配的String方法,它返回一个数组,在未匹配到时会返回 null。

matchAll:一个在字符串中执行查找所有匹配的String方法,它返回一个迭代器(iterator)。

search:一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。

replace:一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。

split:一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String 方法。

以上内容部分摘自视频课程04网页游戏编程JavaScript-26其它类型与对象,更多示例请参见网站示例。跟着张员外讲编程,学习更轻松,不花钱还能学习真本领。


Tags:

最近发表
标签列表