本节是第四讲的第二十六小节,上一节我们为大家介绍了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其它类型与对象,更多示例请参见网站示例。跟着张员外讲编程,学习更轻松,不花钱还能学习真本领。