新用户注册入口 老用户登录入口

[转载]JavaScript中的时间与日期、正则表达式和Function类型

文章作者:转载 更新时间:2023-01-24 13:01:25 阅读数量:528
文章标签:Date 类型毫秒数文本日期格式化Date 类型UTC正则表达式
本文摘要:ECMAScript 中的 Date 类型通过 UTC 时间戳存储日期和时间信息,并提供了多种获取与设置日期的方法。Date.parse() 和 Date.UTC() 可将字符串转换为毫秒数表示的时间戳,而 Date 对象包含一系列组件方法以获取或修改特定日期/时间部分。正则表达式在 JavaScript 中由 RegExp 类实现,用于验证用户输入及模式匹配,可通过 new 运算符、字面量方式创建,并借助 test()、exec() 方法进行测试;同时,String 对象也内置了 match()、replace()、search() 和 split() 等正则相关方法,方便对字符串执行正则操作。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/gongxifacai_believe/article/details/108286196。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

1、时间与日期

ECMAScript 提供了 Date 类型来处理时间和日期。Date 类型内置一系列获取和设置日期时间信息的方法。

Date 类型

ECMAScript 中的 Date 类型是在早期 Java 中 java.util.Date 类基础上构建的。为此,Date 类型使用 UTC(Coordinated Universal Time,国际协调时间[又称世界统一时间])1970 年 1 月 1 日午夜(零时)开始经过的毫秒来保存日期。在使用这种数据存储格式的条件下,Date 类型保存的日期能够精确到 1970 年 1 月 1 日之前或之后的 285616 年。
创建一个日期对象,使用 new 运算符和 Date 构造方法(构造函数)即可。

var box = new Date(); 		// 创建一个日期对象

在调用 Date 构造方法而不传递参数的情况下,新建的对象自动获取当前的时间和日期。

alert(box); 				// 不同浏览器显示不同

ECMAScript 提供了两个方法,Date.parse()和 Date.UTC()。Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应的毫秒数。ECMA-262 没有定义 Date.parse()应该支持哪种日期格式,因此方法的行为因实现而异,因地区而异。默认通常接收的日期格式如下:

  1. ‘月/日/年’,如 6/13/2011;
  2. ‘英文月名 日, 年’,如 May 25, 2004;
  3. ‘英文星期几 英文月名 日 年 时:分:秒 时区’,如 Tue May 25 2004 00:00:00 GMT-070
alert(Date.parse('6/13/2011')); 	// 1307894400000

如果 Date.parse()没有传入或者不是标准的日期格式,那么就会返回 NaN。

alert(Date.parse()); 				// NaN

如果想输出指定的日期,那么把 Date.parse()传入 Date 构造方法里。

var box = new Date(Date.parse('6/13/2011'));	// Mon Jun 13 2011 00:00:00 GMT+0800
var box = new Date('6/13/2011'); 				// 直接传入,Date.parse()后台被调用

Date 对象及其在不同浏览器中的实现有许多奇怪的行为。其中有一种倾向是将超出的范围的值替换成当前的值,以便生成输出。例如,在解析“January 32, 2007”时,有的浏览器会将其解释为“February 1, 2007”。而 Opera 则倾向与插入当前月份的当前日期。
Date.UTC()方法同样也返回表示日期的毫秒数,但它与 Date.parse()在构建值时使用不同的信息。(年份,基于 0 的月份[0 表示 1 月,1 表示 2 月],月中的哪一天[1-31],小时数[0-23] ,分钟,秒以及毫秒)。只有前两个参数是必须的。如果没有提供月数,则天数为 1;如果省略其他参数,则统统为 0。

alert(Date.UTC(2011,11)); 			// 1322697600000

如果 Date.UTC()参数传递错误,那么就会出现负值或者 NaN 等非法信息。

alert(Date.UTC()); 					// 负值或者 NaN

如果要输出指定日期,那么直接把 Date.UTC()传入 Date 构造方法里即可。

var box = new Date(Date.UTC(2011,11, 5, 15, 13, 16));

通用的方法

与其他类型一样,Date 类型也重写了 toLocaleString()、toString()和 valueOf()方法;但这些方法返回值与其他类型中的方法不同。

var box = new Date(Date.UTC(2011,11, 5, 15, 13, 16));
alert('toString:' + box.toString());
alert('toLocaleString:' + box.toLocaleString()); 		// 按本地格式输出

这两个方法在不同浏览器显示的效果又不一样,但不用担心,这两个方法只是在调试比较有用,在显示时间和日期上,没什么价值。valueOf()方法显示毫秒数。

日期格式化方法

Date 类型还有一些专门用于将日期格式化为字符串的方法。

var box = new Date();
alert(box.toDateString()); 			// 以特定的格式显示星期几、月、日和年
alert(box.toTimeString()); 			// 以特定的格式显示时、分、秒和时区
alert(box.toLocaleDateString()); 	// 以特定地区格式显示星期几、月、日和年
alert(box.toLocaleTimeString()); 	// 以特定地区格式显示时、分、秒和时区
alert(box.toUTCString()); 			// 以特定的格式显示完整的 UTC 日期

组件方法

组件方法,是为我们单独获取你想要的各种时间/日期而提供的方法。需要注意的时候 ,这些方法中,有带 UTC 的,有不带 UTC 的。UTC 日期指的是在没有时区偏差的情况下的日期值。

alert(box.getTime()); 				// 获取日期的毫秒数,和 valueOf()返回一致
alert(box.setTime(100)); 			// 以毫秒数设置日期,会改变整个日期
alert(box.getFullYear()); 			// 获取四位年份
alert(box.setFullYear(2012)); 		// 设置四位年份,返回的是毫秒数
alert(box.getMonth()); 				// 获取月份,没指定月份,从 0 开始算起
alert(box.setMonth(11)); 			// 设置月份
alert(box.getDate()); 				// 获取日期
alert(box.setDate(8)); 				// 设置日期,返回毫秒数
alert(box.getDay()); 				// 返回星期几,0 表示星期日,6 表示星期六
alert(box.setDay(2)); 				// 设置星期几
alert(box.getHours()); 				// 返回时
alert(box.setHours(12)); 			// 设置时
alert(box.getMinutes()); 			// 返回分钟
alert(box.setMinutes(22)); 			// 设置分钟
alert(box.getSeconds()); 			// 返回秒数
alert(box.setSeconds(44)); 			// 设置秒数
alert(box.getMilliseconds()); 		// 返回毫秒数
alert(box.setMilliseconds()); 		// 设置毫秒数
alert(box.getTimezoneOffset()); 	// 返回本地时间和 UTC 时间相差的分钟数

以上方法除了 getTimezoneOffset(),其他都具有 UTC 功能,例如 setDate()及 getDate()获取星期几,那么就会有 setUTCDate()及getUTCDate(),表示世界协调时间。

2、正则表达式

假设用户需要在 HTML 表单中填写姓名、地址、出生日期等。那么在将表单提交到服务器进一步处理前,JavaScript 程序会检查表单以确认用户确实输入了信息并且这些信息是符合要求的。

什么是正则表达式

正则表达式(regular expression)是一个描述字符模式的对象。ECMAScript 的 RegExp 类表示正则表达式,而 String 和 RegExp 都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。
正则表达式主要用来验证客户端的输入数据。用户填写完表单单击按钮之后,表单就会被发送到服务器,在服务器端通常会用 PHP、ASP.NET 等服务器脚本对其进行进一步处理 。因为客户端验证,可以节约大量的服务器端的系统资源,并且提供更好的用户体验。

创建正则表达式

创建正则表达式和创建字符串类似,创建正则表达式提供了两种方法,一种是采用 new 运算符,另一个是采用字面量方式。

  1. 两种创建方式
var box = new RegExp('box'); 			// 第一个参数字符串
var box = new RegExp('box', 'ig'); 		// 第二个参数可选模式修饰符

模式修饰符的可选参数

参数 含义
i 忽略大小写
g 全局匹配
m 多行匹配
var box = /box/; 		// 直接用两个反斜杠
var box = /box/ig; 		// 在第二个斜杠后面加上模式修饰符
  1. 测试正则表达式

RegExp 对象包含两个方法:test()和 exec(),功能基本相似,用于测试字符串匹配。test()方法在字符串中查找是否存在指定的正则表达式并返回布尔值,如果存在则返回 true,不存在则返回 false。exec()方法也用于在字符串中查找指定正则表达式,如果 exec()方法执行成功,则返回包含该查找字符串的相关信息数组。如果执行失败,则返回 null。
RegExp 对象的方法

方法 功能
test 在字符串中测试模式匹配,返回 true 或 false
exec 在字符串中执行匹配搜索,返回结果数组
// 使用 new 运算符的 test 方法示例
var pattern = new RegExp('box', 'i'); 	// 创建正则模式,不区分大小写
var str = 'This is a Box!'; 			// 创建要比对的字符串
alert(pattern.test(str)); 				// 通过 test()方法验证是否匹配// 使用字面量方式的 test 方法示例
var pattern = /box/i; 					// 创建正则模式,不区分大小写
var str = 'This is a Box!';
alert(pattern.test(str));// 使用一条语句实现正则匹配
alert(/box/i.test('This is a Box!')); 	// 模式和字符串替换掉了两个变量// 使用 exec 返回匹配数组
var pattern = /box/i;
var str = 'This is a Box!';
alert(pattern.exec(str)); 				// 匹配了返回数组,否则返回 null
  1. 使用字符串的正则表达式方法

除了 test()和 exec()方法,String 对象也提供了 4 个使用正则表达式的方法。
String 对象中的正则表达式方法

方法 含义
match(pattern) 返回 pattern 中的子串或 null
replace(pattern, replacement) 用 replacement 替换 pattern
search(pattern) 返回字符串中 pattern 开始位置
split(pattern) 返回字符串按指定 pattern 拆分的数组
// 使用 match 方法获取获取匹配数组
var pattern = /box/ig; 							// 全局搜索
var str = 'This is a Box!,That is a Box too';
alert(str.match(pattern)); 						// 匹配到两个 Box,Box
alert(str.match(pattern).length); 				// 获取数组的长度// 使用 search 来查找匹配数据
var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too';
alert(str.search(pattern)); 					// 查找到返回位置,否则返回-1

因为 search 方法查找到即返回,也就是说无需 g 全局。

// 使用 replace 替换匹配到的数据
var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too';
alert(str.replace(pattern, 'Tom')); 				// 将 Box 替换成了 Tom// 使用 split 拆分成字符串数组
var pattern = / /ig;
var str = 'This is a Box!,That is a Box too';
alert(str.split(pattern)); 							// 将空格拆开分组成数组

RegExp 对象的静态属性

属性 短名 含义
input $_ 当前被匹配的字符串
lastMatch $& 最后一个匹配字符串
lastParen $+ 最后一对圆括号内的匹配子串
leftContext $` 最后一次匹配前的子串
multiline $* 用于指定是否所有的表达式都用于多行的布尔值
rightContext $’ 在上次匹配之后的子串
 // 使用静态属性
var pattern = /(g)oogle/;
var str = 'This is google!';
pattern.test(str); 				// 执行一下
alert(RegExp.input); 			// This is google!
alert(RegExp.leftContext); 		// This is
alert(RegExp.rightContext); 	// !
alert(RegExp.lastMatch); 		// google
alert(RegExp.lastParen); 		// g
alert(RegExp.multiline); 		// false

Opera 不支持 input、lastMatch、lastParen 和 multiline 属性。IE 不支持 multiline 属性。所有的属性可以使用短名来操作。RegExp.input 可以改写成 RegExp['$_'],依次类推。但 RegExp.input 比较特殊,它还可以写成 RegExp.$_。
RegExp 对象的实例属性

属性 含义
global Boolean 值,表示 g 是否已设置
ignoreCase Boolean 值,表示 i 是否已设置
lastIndex 整数,代表下次匹配将从哪里字符位置开始
multiline Boolean 值,表示 m 是否已设置
Source 正则表达式的源字符串形式
// 使用实例属性
var pattern = /google/ig;
alert(pattern.global); 				// true,是否全局了
alert(pattern.ignoreCase); 			// true,是否忽略大小写
alert(pattern.multiline); 			// false,是否支持换行
alert(pattern.lastIndex); 			// 0,下次的匹配位置
alert(pattern.source); 				// google,正则表达式的源字符串
var pattern = /google/g;
var str = 'google google google';
pattern.test(str); 					// google,匹配第一次
alert(pattern.lastIndex); 			// 6,第二次匹配的位

以上基本没什么用。并且 lastIndex 在获取下次匹配位置上 IE 和其他浏览器有偏差 ,主要表现在非全局匹配上。lastIndex 还支持手动设置,直接赋值操作。

获取控制

正则表达式元字符是包含特殊含义的字符。它们有一些特殊功能,可以控制匹配模式的方式。反斜杠后的元字符将失去其特殊含义。
字符类:单个字符和数字

元字符/元符号 匹配情况
. 匹配除换行符外的任意字符
[a-z0-9] 匹配括号中的字符集中的任意字符
[^a-z0-9] 匹配任意不在括号中的字符集中的字符
\d 匹配数字
\D 匹配非数字,同[^0-9]相同
\w 匹配字母和数字及_
\W 匹配非字母和数字及_

字符类:空白字符

元字符/元符号 匹配情况
\0 匹配 null 字符
\b 匹配空格字符
\f 匹配进纸字符
\n 匹配换行符
\r 匹配回车字符
\t 匹配制表符
\s 匹配空白字符、空格、制表符和换行符
\S 匹配非空白字符

字符类:锚字符

元字符/元符号 匹配情况
^ 行首匹配
$ 行尾匹配
\A 只有匹配字符串开始处
\b 匹配单词边界,词在[]内时无效
\B 匹配非单词边界
\G 匹配当前搜索的开始位置
\Z 匹配字符串结束处或行尾
\z 只匹配字符串结束处

字符类:重复字符

元字符/元符号 匹配情况
x? 匹配 0 个或 1 个 x
x* 匹配 0 个或任意多个 x
x+ 匹配至少一个 x
(xyz)+ 匹配至少一个(xyz)
x{m,n} 匹配最少 m 个、最多 n 个 x

字符类:替代字符

元字符/元符号 匹配情况
this where

字符类:记录字符

元字符/元符号 匹配情况
(string) 用于反向引用的分组
\1 或$1 匹配第一个分组中的内容
\2 或$2 匹配第二个分组中的内容
\3 或$3 匹配第三个分组中的内容
// 使用点元字符
var pattern = /g..gle/; 									// .匹配一个任意字符
var str = 'google';
alert(pattern.test(str));// 重复匹配
var pattern = /g.*gle/; 									// .匹配 0 个一个或多个
var str = 'google'; //*,?,+,{n,m}
alert(pattern.test(str));// 使用字符类匹配
var pattern = /g[a-zA-Z_]*gle/; 							// [a-z]*表示任意个 a-z 中的字符
var str = 'google';
alert(pattern.test(str));
var pattern = /g[^0-9]*gle/; 								// [^0-9]*表示任意个非 0-9 的字符
var str = 'google';
alert(pattern.test(str));
var pattern = /[a-z][A-Z]+/; 								// [A-Z]+表示 A-Z 一次或多次
var str = 'gOOGLE';
alert(pattern.test(str));// 使用元符号匹配
var pattern = /g\w*gle/; 									// \w*匹配任意多个所有字母数字_
var str = 'google';
alert(pattern.test(str));
var pattern = /google\d*/; 									// \d*匹配任意多个数字
var str = 'google444';
alert(pattern.test(str));
var pattern = /\D{7,}/; 									// \D{7,}匹配至少 7 个非数字
var str = 'google8';
alert(pattern.test(str));// 使用锚元字符匹配
var pattern = /^google$/; 									// ^从开头匹配,$从结尾开始匹配
var str = 'google';
alert(pattern.test(str));
var pattern = /goo\sgle/; 									// \s 可以匹配到空格
var str = 'goo gle';
alert(pattern.test(str));
var pattern = /google\b/; 									// \b 可以匹配是否到了边界
var str = 'google';
alert(pattern.test(str));// 使用或模式匹配
var pattern = /google|baidu|bing/; 							// 匹配三种其中一种字符串
var str = 'google';
alert(pattern.test(str));// 使用分组模式匹配
var pattern = /(google){4,8}/; 								// 匹配分组里的字符串 4-8 次
var str = 'googlegoogle';
alert(pattern.test(str));
var pattern = /8(.*)8/; 									// 获取 8..8 之间的任意字符
var str = 'This is 8google8';
str.match(pattern);
alert(RegExp.$1); 											// 得到第一个分组里的字符串内容
var pattern = /8(.*)8/;
var str = 'This is 8google8';
var result = str.replace(pattern,'<strong>$1</strong>'); 	// 得到替换的字符串输出
document.write(result);
var pattern = /(.*)\s(.*)/;
var str = 'google baidu';
var result = str.replace(pattern, '$2 $1'); 				// 将两个分组的值替换输出
document.write(result);
贪婪 惰性
+ +?
? ??
* *?
{n} {n}?
{n,} {n,}?
{n,m} {n,m}?
// 关于贪婪和惰性
var pattern = /[a-z]+?/; 											// ?号关闭了贪婪匹配,只替换了第一个
var str = 'abcdefjhijklmnopqrstuvwxyz';
var result = str.replace(pattern, 'xxx');
alert(result);
var pattern = /8(.+?)8/g; 											// 禁止了贪婪,开启的全局
var str = 'This is 8google8, That is 8google8, There is 8google8';
var result = str.replace(pattern,'<strong>$1</strong>');
document.write(result);
var pattern = /8([^8]*)8/g; 										// 另一种禁止贪婪
var str = 'This is 8google8, That is 8google8, There is 8google8';
var result = str.replace(pattern,'<strong>$1</strong>');
document.write(result);// 使用 exec 返回数组
var pattern = /^[a-z]+\s[0-9]{4}$/i;
var str = 'google 2012';
alert(pattern.exec(str)); 											// 返回整个字符串
var pattern = /^[a-z]+/i; 											// 只匹配字母
var str = 'google 2012';
alert(pattern.exec(str)); 											// 返回 google
var pattern = /^([a-z]+)\s([0-9]{4})$/i; 							// 使用分组
var str = 'google 2012';
alert(pattern.exec(str)[0]); 										// google 2012
alert(pattern.exec(str)[1]);										// google
alert(pattern.exec(str)[2]); 										// 2012// 捕获性分组和非捕获性分组
var pattern = /(\d+)([a-z])/; 										// 捕获性分组
var str = '123abc';
alert(pattern.exec(str));
var pattern = /(\d+)(?:[a-z])/; 									// 非捕获性分组
var str = '123abc';
alert(pattern.exec(str));// 使用分组嵌套
var pattern = /(A?(B?(C?)))/; 										// 从外往内获取
var str = 'ABC';
alert(pattern.exec(str));// 使用前瞻捕获
var pattern = /(goo(?=gle))/; 										// goo 后面必须跟着 gle 才能捕获
var str = 'google';
alert(pattern.exec(str));// 使用特殊字符匹配
var pattern = /\.\[\/b\]/; 											// 特殊字符,用\符号转义即可
var str = '.[/b]';
alert(pattern.test(str));// 使用换行模式
var pattern = /^\d+/mg; 											// 启用了换行模式
var str = '1.baidu\n2.google\n3.bing';
var result = str.replace(pattern, '#');
alert(result);

常用的正则

  1. 检查邮政编码
var pattern = /[1-9][0-9]{5}/; 			// 共 6 位数字,第一位不能为 0
var str = '224000';
alert(pattern.test(str));
  1. 检查文件压缩包
var pattern = /[\w]+\.zip|rar|gz/; 		// \w 表示所有数字和字母加下划线
var str = '123.zip'; 					// \.表示匹配.,后面是一个选择
alert(pattern.test(str));
  1. 删除多余空格
var pattern = /\s/g; 					// g 必须全局,才能全部匹配
var str = '111 222 333';
var result = str.replace(pattern,''); 	// 把空格匹配成无空格
alert(result);
  1. 删除首尾空格
var pattern = /^\s+/; 								// 强制首
var str = ' goo gle ';
var result = str.replace(pattern, '');
pattern = /\s+$/; 									// 强制尾
result = result.replace(pattern, '');
alert('|' + result + '|');
var pattern = /^\s*(.+?)\s*$/; 						// 使用了非贪婪捕获
var str = ' google ';
alert('|' + pattern.exec(str)[1] + '|');
var pattern = /^\s*(.+?)\s*$/;
var str = ' google ';
alert('|' + str.replace(pattern, '$1') + '|'); 		// 使用了分组获取
  1. 简单的电子邮件验证
var pattern = /^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/;
var str = 'yc60.com@gmail.com';
alert(pattern.test(str));
var pattern = /^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/;
var str = 'yc60.com@gmail.com';
alert(pattern.test(str));

3、Function类型

在 ECMAScript 中,Function(函数)类型实际上是对象。每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。

函数的声明方式

  1. 普通的函数声明
function box(num1, num2) {return num1+ num2;
}
  1. 使用变量初始化函数
var box= function(num1, num2) {return num1 + num2;
};
  1. 使用 Function 构造函数
var box= new Function('num1', 'num2' ,'return num1 + num2');

第三种方式我们不推荐,因为这种语法会导致解析两次代码(第一次解析常规 ECMAScript 代码,第二次是解析传入构造函数中的字符串),从而影响性能。但我们可以通过这种语法来理解"函数是对象,函数名是指针"的概念。

作为值的函数

ECMAScript 中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。

function box(sumFunction, num) {return sumFunction(num); 		// someFunction
}
function sum(num) {return num + 10;
}
var result = box(sum, 10); 			// 传递函数到另一个函数里

函数内部属性

在函数内部,有两个特殊的对象:arguments 和 this。arguments 是一个类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数。但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。

function box(num) {if (num <= 1) {return 1;} else {return num * box(num-1); 					// 一个简单的的递归}
}

对于阶乘函数一般要用到递归算法,所以函数内部一定会调用自身;如果函数名不改变是没有问题的,但一旦改变函数名,内部的自身调用需要逐一修改。为了解决这个问题,我们可以使用 arguments.callee 来代替。

function box(num) {if (num <= 1) {return 1;} else {return num * arguments.callee(num-1);		// 使用 callee 来执行自身}
}

函数内部另一个特殊对象是 this,其行为与 Java 和 C#中的 this 大致相似。换句话说 ,this 引用的是函数据以执行操作的对象,或者说函数调用语句所处的那个作用域。当在全局作用域中调用函数时,this 对象引用的就是 window。

// 便于理解的改写例子
window.color = '红色的'; 		// 全局的,或者 var color = '红色的';也行
alert(this.color); 				// 打印全局的 color
var box = {color : '蓝色的', 			// 局部的 colorsayColor : function () {alert(this.color); 		// 此时的 this 只能 box 里的 color}
};
box.sayColor(); 				// 打印局部的 color
alert(this.color); 				// 还是全局的// 引用教材的原版例子
window.color = '红色的'; 		// 或者 var color = '红色的';也行
var box = {color : '蓝色的'
};
function sayColor() {alert(this.color); 			// 这里第一次在外面,第二次在 box 里面
}
getColor();
box.sayColor = sayColor; 		// 把函数复制到 box 对象里,成为了方法
box.sayColor();

函数属性和方法

ECMAScript 中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性 :length 和 prototype。其中,length 属性表示函数希望接收的命名参数的个数。

function box(name, age) {alert(name + age);
}
alert(box.length); 				// 2

对于 prototype 属性,它是保存所有实例方法的真正所在,也就是原型。这个属性 ,我们将在面向对象一章详细介绍。而 prototype 下有两个方法:apply()和 call(),每个函数都包含这两个非继承而来的方法。这两个方法的用途都在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。

function box(num1, num2) {return num1 + num2; 					// 原函数
}
function sayBox(num1, num2) {return box.apply(this, [num1, num2]); 	// this 表示作用域,这里是 window
} 											// []表示 box 所需要的参数
function sayBox2(num1, num2) {return box.apply(this, arguments); 		// arguments 对象表示 box 所需要的参数
}
alert(sayBox(10,10)); 						// 20
alert(sayBox2(10,10)); 						// 20

call()方法于 apply()方法相同,他们的区别仅仅在于接收参数的方式不同。对于 call()方法而言,第一个参数是作用域,没有变化,变化只是其余的参数都是直接传递给函数的。

function box(num1, num2) {return num1 + num2;
}
function callBox(num1, num2) {return box.call(this, num1, num2); 		// 和 apply 区别在于后面的传参
}
alert(callBox(10,10));

事实上,传递参数并不是 apply()和 call()方法真正的用武之地;它们经常使用的地方是能够扩展函数赖以运行的作用域。

var color = '红色的'; 		// 或者 window.color = '红色的';也行
var box = {color : '蓝色的'
};
function sayColor() {alert(this.color);
}
sayColor(); 				// 作用域在 window
sayColor.call(this); 		// 作用域在 window
sayColor.call(window); 		// 作用域在 window
sayColor.call(box); 		// 作用域在 box,对象冒充

这个例子是之前作用域理解的例子修改而成,我们可以发现当我们使用 call(box)方法的时候,sayColor()方法的运行环境已经变成了 box 对象里了。
使用 call()或者 apply()来扩充作用域的最大好处,就是对象不需要与方法发生任何耦合关系(耦合,就是互相关联的意思,扩展和维护会发生连锁反应)。也就是说,box 对象和 sayColor()方法之间不会有多余的关联操作,比如 box.sayColor = sayColor;

本篇文章为转载内容。原文链接:https://blog.csdn.net/gongxifacai_believe/article/details/108286196。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
UTC(Coordinated Universal Time)UTC 是一种国际通用的时间标准,也称为世界统一时间或协调世界时。在 JavaScript 的 Date 类型中,日期和时间是基于从 1970 年 1 月 1 日零点(即午夜)开始的 UTC 时间戳(以毫秒为单位)进行存储和计算的。这种时间系统可以确保全球各地在不考虑时区差异的情况下,有一个统一的时间基准。
正则表达式 (Regular Expression)正则表达式是一种强大的文本处理工具,在 ECMAScript 中由 RegExp 类表示。它是一种特殊的字符串模式,用于匹配、查找、替换或提取符合特定规则的文本片段。通过预定义的字符集、量词、特殊符号等构建的正则表达式,可以在 JavaScript 程序中执行复杂的字符串验证和搜索操作,例如验证用户在表单中输入的电子邮件地址格式是否正确,或者在一段文本中查找所有电话号码。
模式修饰符在 JavaScript 正则表达式中,模式修饰符是一些附加在正则表达式末尾的特殊字符,用来改变正则表达式的匹配行为。如文章中提到的 'i'(忽略大小写)、'g'(全局匹配,查找字符串中所有匹配项,而非只返回第一个匹配项)、以及 'm'(多行模式,使正则表达式中的 ^ 和 $ 符号能够识别字符串中每一行的开始和结束位置)。使用这些模式修饰符可以增强正则表达式的功能,使其更加灵活地适应不同场景的需求。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在深入理解了JavaScript中Date类型和正则表达式的使用后,我们可以通过关注以下几方面的延伸阅读来进一步提升知识深度与广度:
首先,随着ECMAScript规范的不断更新,Date类新增了许多便捷方法以增强日期时间处理能力。例如,在ES6中引入了`Date.now()`、`Date.prototype.toISOString()`等方法,以及在提案阶段的Temporal API(暂未正式发布),旨在提供更精确、易用且符合国际化标准的时间日期处理功能。因此,了解这些最新的API动态将有助于您编写更为现代化的JavaScript代码。
其次,关于正则表达式在实际项目中的应用,可以查阅一些近期开发者博客或技术文章,了解他们在表单验证、URL解析、文本搜索替换等方面的实战案例。例如,一篇名为“利用正则表达式优化用户输入验证策略”的文章详尽探讨了如何结合现代浏览器特性,如约束验证API,配合正则表达式进行高效的数据校验。
此外,对于正则表达式的性能优化也是值得关注的话题。有研究指出,在处理大量数据时,某些复杂的正则可能导致性能瓶颈。阅读相关的性能分析报告和技术分享,可以帮助开发者掌握编写高性能正则表达式的技巧,并避免潜在的性能陷阱。
最后,关于UTC时间戳在跨时区开发中的重要性,可参考有关国际协作项目中如何妥善处理时间问题的文章,了解如何借助JavaScript Date对象正确转换和处理不同时区的时间信息,从而确保在全球范围内应用程序的正常运行。尤其在当前全球化的互联网环境下,理解和掌握这一技能愈发关键。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
df -h - 查看磁盘空间使用情况。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
纯js实用T恤衫花纹图案预览特效 01-26 基于Bootstrap仿Github样式下拉列表框插件 08-08 jQuery电子邮件地址填写自动完成插件 04-30 Superset 数据源连接配置:精细化自定义SQLAlchemy URI实现数据分析与可视化,含SSL加密连接实例 03-19 jquery可任意拖动排序的导航图片效果 02-23 侧边栏个人图文简历HTML模板 12-09 Beego框架升级中的Bee工具版本兼容性问题与迁移策略:结构变更、功能接口变动及社区解决方案 12-07 Kibana无法启动:针对服务器内部错误的Elasticsearch连接、配置文件、端口冲突与资源排查解决(注:由于字数限制,未能完全包含所有关键词,但包含了核心问题描述及几个关键排查点) 11-01 ClickHouse外部表使用中文件权限与不存在问题的解决方案:错误提示、查询操作与文件路径管理实务 09-29 本次刷新还10个文章未展示,点击 更多查看。
Apache Atlas UI无法正常加载与样式丢失问题排查及解决方案:关注网络连接、浏览器缓存与开发者工具应用 09-25 Greenplum数据库中数据插入操作详解:单行多行插入与gpfdist实现大批量导入 08-02 [转载]html5 footer header,html-5 --html5教程article、footer、header、nav、section使用 07-16 [转载][GCC for C]编译选项---IDE掩盖下的天空 06-29 简洁大方珠宝钻石收藏网站模板下载 06-20 黑色高端精致汽车4s店美容html5模板下载 06-01 蓝色互联网项目融资管理平台网站模板 05-16 响应式游戏开发类企业前端cms模板下载 05-02 Beego框架动态路由实现:重定向与命令行参数驱动的路由设计实践 04-05 .NET 中字典操作避免 KeyNotFoundException:TryGetValue、ContainsKey 与 GetOrAdd 实践详解 04-04 [转载]2021/4/23爬虫第五次课(爬虫网络请求模块下下) 03-01
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"