百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-10-19 02:52 10 浏览

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

Symbol类型

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其它类型与对象,更多示例请参见网站示例。跟着张员外讲编程,学习更轻松,不花钱还能学习真本领。


相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...