游戏开发之旅-JavaScript其它类型与常用对象
bigegpt 2024-10-19 02:52 15 浏览
本节是第四讲的第二十六小节,上一节我们为大家介绍了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其它类型与对象,更多示例请参见网站示例。跟着张员外讲编程,学习更轻松,不花钱还能学习真本领。
相关推荐
- 当Frida来“敲”门(frida是什么)
-
0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...
- 服务端性能测试实战3-性能测试脚本开发
-
前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...
- Springboot整合Apache Ftpserver拓展功能及业务讲解(三)
-
今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...
- Linux和Windows下:Python Crypto模块安装方式区别
-
一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...
- Python 3 加密简介(python des加密解密)
-
Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...
- 怎样从零开始编译一个魔兽世界开源服务端Windows
-
第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...
- 附1-Conda部署安装及基本使用(conda安装教程)
-
Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...
- 如何配置全世界最小的 MySQL 服务器
-
配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...
- 如何使用Github Action来自动化编译PolarDB-PG数据库
-
随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...
- 面向NDK开发者的Android 7.0变更(ndk android.mk)
-
订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...
- 信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要
-
问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...
- OpenSSH 安全漏洞,修补操作一手掌握
-
1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...
- Linux:lsof命令详解(linux lsof命令详解)
-
介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...
- 幻隐说固态第一期:固态硬盘接口类别
-
前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...
- 新品轰炸 影驰SSD多款产品登Computex
-
分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...
- 一周热门
- 最近发表
-
- 当Frida来“敲”门(frida是什么)
- 服务端性能测试实战3-性能测试脚本开发
- Springboot整合Apache Ftpserver拓展功能及业务讲解(三)
- Linux和Windows下:Python Crypto模块安装方式区别
- Python 3 加密简介(python des加密解密)
- 怎样从零开始编译一个魔兽世界开源服务端Windows
- 附1-Conda部署安装及基本使用(conda安装教程)
- 如何配置全世界最小的 MySQL 服务器
- 如何使用Github Action来自动化编译PolarDB-PG数据库
- 面向NDK开发者的Android 7.0变更(ndk android.mk)
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)