Date
- Date类型用于呈现时间中的某个时刻 就是将日期转换为UTC时间
(1)不传参:let now = new Date()
创建的对象将保存当前时间
(2)传入时间戳 即自1970年1月1日00:00:00 UTC以来的毫秒数 获得UTC时间
(3)Date(year, month[, date][, hours][, minutes][, seconds][, milliseconds])
(4)传入表示时间的字符串 该字符串能被Date.parse()
正确识别
内部实现原理就是Date会在后台调用
Date.parse()
由于浏览器差异和不一致 强烈建议不要使用这种方法 也别使用Date.parse()
Date.parse()
:接受一个表示时间的字符串,并返回该时间自1970-1-1 00:00:00所经过的毫秒数 如果参数不满足以下四种则返回NaN
(1)‘月/日/年’
(2)‘英文月名 日, 年’
(3)‘英文周几 月名 日 年 时:分:秒 时区’
(4)‘YYYY-MM-DDTHH:MM:SS:SSSz’ 如:2019-05-23T00:00:00
Date.UTC(year, month[, date][, hours][, minutes][, seconds][, milliseconds])
:接受表示时间的参数 并返回该时间从1970-01-01 00:00:00 UTC开始所经过的毫秒数
(1)year:表示年份的整数值。 0到99会被映射至1900年至1999年
(2)month:表示月份的整数值 从 0(1月)到 11(12月)
(3)date:表示一个月中的第几天的整数值,从1开始。默认值为1
(4)hours:表示一天中的小时数的整数值 (24小时制)。默认值为0(午夜)
(5)minutes:表示分钟数 默认值为00
(6)seconds:表示秒 默认值为00
(7)milliseconds:表示毫秒 默认值为00
new Date(2000,0)
和new Date(Date.UTC(2000,0))
的区别:前者表示本地时区的2000年1月1日零点 后者表示GMT时区的2000年1月1日零点 假如本地时区是中国时区 中间应该相差8H
Date.now()
:返回自1970-1-1 00:00:00 UTC(世界标准时间)至今所经过的毫秒数- Date类型重写了toLocaleString()、toString()、valueOf()方法。
(1)toLocaleString()方法返回与浏览器运行额本地环境一直的日期和时间 格式中通常包含AM PM 但不包含时区信息
(2)toString()方法返回带时区信息的日期和时间 时间时24小时制 从0-23
(3)valueOf()方法不返回字符串 返回日期的毫秒表示 - 格式化日期的方法 他们都返回字符串:
(1)toDateString()显示日期中的周几、月、日、年(格式特定于实现)
(2)toTimeString()显示日期中的时、分、秒、时区(格式特定于实现)
(3)toLocaleDateString()显示日期中的周几、月、日、年(格式特定于实现和地区)
(4)toLocaleTimeString()显示日期中的时、分、秒(格式特定于实现和地区)
(5)toUTCString()显示完整的UTC日期(格式特定于实现)
以上方法和toLocaleString()、toString()一样 会因浏览器不同而不同 - 剩余方法
RegExp
- 创建正则表达式:
// 所有元字符`({[\^$|]})?*+.`必须转义
let exp1 = /正则表达式[/标记(可多个)];// 必须使用\转义
// 必须使用\\转义 因为看到\ 字符串本身会转义一次 正则还需要转义一次 所以需要\\
let exp2 = new RegExp("正则表达式","标记(可不传 可多个)");
标记:
g:全局模式 查找字符串的全部内容 而不是找到第一个匹配的内容就结束 默认时找到第一个匹配的内容就结束
i:不区分大小写
m:多行模式 表示查找到一行文本末尾时会继续查找
y:粘附模式 表示只查找从lastIndex开始及之后的字符串
u:Unicode模式 启用Unicode匹配
s:dotAll模式 表示元字符.匹配任何字符 包括\n或\r
- RegExp实例属性(不常用 未列出)
原始值包装类型
- 每当用到某个原始值的方法或属性时 后台都会创建一个相应包装类型的对象 从而暴露出操作原始值的各种方法
let s1 = "some text";
let s2 = s1.substring(2);// 以读模式访问s1 即从内存中读取变量保存的值
// 然后创建一个String类型的实例 调用实例上的特定方法 最后销毁实例
// 等价于(底层实现)
let s1 = new String("some text");
let s2 = s1.substring(2);
s1 = null;
- 引用类型和原始包装类型的主要区别在于对象的生命周期 通过new实例化引用类型后 得到的实例会在离开作用域时被销毁 而自动创建的原始值包装对象则只存在于访问它的那行代码运行期间 这意味着不能再运行时给原始值添加属性和方法
- 在原始值包装类型的实例上调用typeof会返回“object” 所有原始值包装对象都会转换为布尔值true
- Object构造函数作为一个工厂方法 能够根据传入值的类型返回相应原始值包装类型的实例
- 使用new调用原始包装类型的构造函数 与调用同名的转型函数并不一样
let v = "25";
let number = Number(v);
let obj = new Number(v);
console.log(typeof number);// "number"
console.log(typeof obj);// "object"
Boolean
单例内置对象
内置对象:任何由ECMAScript实现提供 与宿主环境无关 并在ECMAScript程序开始执行时就存在的对象
Global
- Global针对不属于任何对象的属性和方法 事实上 不存在全局变量或全局函数这种东西 全局作用域中定义的变量和函数都会变成Global对象的属性
- 浏览器将window对象实现为Global对象的代理 因此 所有全局作用域中声明的变量和函数都变成了window的属性
- 另一种获取Global对象的方法:当一个函数在没有明确(通过成为某个对象得方法 或通过call()/apply())指定this值得情况下执行时 this值等于Global对象
let global = function() {
return this;
}
- Global对象属性
URL编码方法
encodeURI()
和encodeURIComponent()
用于编码统一资源标识符URI 以便传给浏览器 有效的URI不能包含某些字符 如空格
(1)encodeURI()
用于对整个URI进行编码 如www.wrox.com/illegal value.js
(2)encodeURIComponent()
用于编码URI中单独的组件 如illegal value.js
(3)区别:encodeURI()
不会编码属于URL组件的特殊字符 比如冒号 斜杠 问号 井号encodeURIComponent()
会编码所有非标准字符 比如冒号 斜杠 问号 井号
(4)encodeURIComponent()
更常用 因为编码查询字符串参数比编码基准URI的次数更多decodeURI()
对encodeURI()
编码的字符进行解码decodeURIComponent()
对encodeURIComponent()
编码的字符进行解码
eval()方法
- eval()方法是一个完整的ECMAScript解释器 他接受一个参数 即一个要执行的JS字符串 当解释器发现eval()调用时 会将参数解释为实际的ECMAScript语句 然后将其插入到该位置
eval("console.log('hi')");
// 等价于
console.log('hi')
- 通过eval()定义的任何变量和函数都不会被提升 这是因为在解析代码时 他们是被包含在一个字符串中的 他们 只是在eval()执行时才会被创建
- 在严格模式下 eval()内部创建的变量和函数无法被外部访问 赋值给eval()也会报错
- 慎用eval() 因为它会对XSS利用暴露出很大的攻击面 恶意用户可能插入会导致你网站或应用崩溃的代码
Math
- Math对象的部分属性
min()
和max()
方法接受任意多个参数 用于确定一组数值中的最小值和最大值
// 利用他们求数组的最大值 最小值
let values = [1,2,3,4,5,6,7,8];
let max = Math.max(...values);
- 舍入方法:
(1)Math.ceil():向上舍入
(2)Math.floor():向下舍入
(3)Math.round():四舍五入
(4)Math.fround():返回数值最接近的单精度(32位)浮点值表示 - Math.random():返回[0,1)范围内的随机数
// 求[lowerValue, upperValue]范围内的随机数
function selectFrom(lowerValue, upperValue) {
let choices = upperValue - lowerValue +1;
return Math.floor(Math.random() * choices + lowerValue);
}
- 如果时为了加密而需要生成随机数 即传给生成器的输入需要较高的不确定性 建议使用
window.crypto.getRandomValues()
- Math对象的其他方法