- 引用值(对象)是指某个特定引用类型的实例
- 引用类型是把数据和功能组织到一起的结构。
- 引用类型有时也称对象定义,因为描述了自己的对象应有的属性和方法。
- 对象被认为是某个特定引用类型的实例。新对象通过使用new操作符后跟一个构造函数来创建。
- 函数也是一种引用类型。
1、Date
-
1970.1.1
-
创建:let now = new Date()
- 不传参数是当前时间
- 传参数是要传入毫秒数
-
Date.parse()
- 接收表示日期的字符串参数,尝试转为毫秒数
- “月/日/年”
- “月名 日,年”
- 实例实际返回值
- YYYY-MM-DDTHH:mm:ss:sssZ
- 不表示日期的回返回NaN
- 直接传给Date构造函数,后台调用Date.parse()
- 接收表示日期的字符串参数,尝试转为毫秒数
-
Date.UTC()
- 返回日期的毫秒表示
- 参数:年,月(0-11),日,时,分,秒,毫秒
- 直接传给Date构造函数,后台调用Date.UTC()
-
Date.now()
- 返回执行时的毫秒数
1、继承的方法
- toLocaleString() 返回本地环境一致的时间
- toString() 带时区信息的日期和时间
- valueOf() 返回日期的毫秒表示
2、日期格式化方法
- toDateString() "Mon May 24 2021"
- toTimeString() "20:55:52 GMT+0800 (中国标准时间)"
- toLocaleDateString() "2021/5/24"
- toLocaleTimeString() "下午8:55:52"
- toUTCString() "Mon, 24 May 2021 12:55:52 GMT"
3、日期/时间组件方法
| 方法 | 说明 |
|---|---|
| getTime() | 返回日期的毫秒(valueOf) |
| setTime(ms) | 设置日期的毫秒,修改整个日期 |
| getFullYear() | 返回4位数年 |
| setFullYear(year) | 设置日期的年 4位 |
| getMonth() | 返回日期的月 0表示1月 |
| setMonth(month) | 设置日期的月 0表示1月 |
| getDate() | 返回日期中的日 |
| setDate(date) | 设置日期中的日 |
| getDay() | 返回星期几 0表示周日 |
| getHours() | 返回日期中的时 |
| setHours(hours) | 设置日期中的时 |
| getMinutes() | 返回日期中的分 |
| setMinutes(minutes) | 设置日期中的分 |
| getSeconds() | 返回日期中的秒 |
| setSeconds(seconds) | 设置日期中的秒 |
| getMilliseconds() | 返回日期中的毫秒 |
| setMilliseconds(ms) | 设置日期中的毫秒 |
2、RegExp
-
支持简洁语法创建
let expression = /pattern/flags- pattern 可以是任何简单或复杂正则表达式
- flags标记,来控制行为
- g 全局模式,查找全部内容
- i 不区分大小写
- m 多行模式
- y 粘附模式,只查找从lastIndex开始之后的字符串
- u 启用Unicode匹配
- s dotAll模式,表示元字符,匹配任何字符
-
也可以用构造函数创建
let parttern1 = /[bc]at/i let parttern2 = new RegExp("[bc]at", "i")-
两个参数都需要是字符串
-
元字符需要二次转译
/\[bc\]at/ -> "\\[bc\\]at"/\.at/ -> "\\.at"
-
可以选择性修改
const re1 = /cat/g const re2 = new RegExp(re1) const re3 = new RegExp(re1, "i")
-
1、实例属性
global,布尔值,表示是否设置了g标记ignoreCase,布尔值,表示是否设置了i标记unicode,布尔值,表示是否设置了u标记sticky,布尔值,表示是否设置了y标记lastIndex,整数,表示在源字符串下一次搜索开始的位置multiline,布尔值,表示是否设置了m标记dotAll,布尔值,表示是否设置了s标记source,正则表达式字面量字符串flags,正则表达式标记字符串
2、实例方法
- exec() 配合捕获组使用
- 如果找到了匹配项,返回第一个匹配信息的数组
- 没找到返回null。
- 返回的数组包含两个额外属性index和input
- index是字符串中匹配模式的起始位置
- input是要查找的字符串
- 第一个元素整个字符串匹配模式
- 第二个元素第一个匹配组,第三个元素第二个匹配组
- 如果设置全局标记,lastIndex会一直向后搜索
- y粘附标记(只会在lastIndex位置上查找)覆盖全局标记,lastIndex可以设置
- test() 接收一个字符串参数,返回布尔值
- 无论怎么创建,继承方法toString() 和 toLocaleString()都返回字面量表示。
- valueOf() 方法返回正则表达式本身
3、构造函数属性
| 全名 | 简写 | 说明 |
|---|---|---|
| input | $_ | 最后搜索的字符串 |
| lastMatch | $& | 最后匹配的文本 |
| lastParen | $+ | 最后匹配的捕获组 |
| leftContext | $` | input 出现在lastMatch前面的文本 |
| rightContext | $' | input 出现在lastMatch后面的文本 |
- 简写要用中括号访问
4、模式局限
3、原始值包装类型
let s1 = "some text"
let s2 = s1.substring(2)
-
原始值不是对象为什么能调用方法?
-
因为第二行用读模式访问字符串值:
-
创建一个String类型的实例
let s1 = new String("some text") -
调用实例上的特定方法
let s2 = s1.substring(2) -
销毁实例
s1 = null
-
-
-
引用类型和原始值包装类型区别在于对象的生命周期。
-
使用new实例化引用类型后,得到的实例会在离开作用域的时候销毁。
-
自动创建的原始值包装类型只存在于访问他的那行代码执行期间。
-
所以不能在运行时给原始值添加属性方法
let s1 = "some text" s1.color = "red" // 创建后又销毁了 console.log(s1.color)// undefined
-
-
可以显式的使用Boolean, Number, String构造函数创建原始值包装对象。
- 调用typeof返回object
- 都会转换为布尔值true ?
-
Object构造函数作为工厂方法,能根据传入值类型返回相应原始值包装类型。
let obj = new Object("some text") obj instanceof String // true -
使用new创建的构造函数与调用同名的转型函数不同
let val = "25" let number = Number(val) let obj = new Number(val) typeof number // "number" typeof obj // "object"
1、Boolean
-
布尔值的引用类型
-
重写valueOf() 方法,返回原始值true/false
-
toString() 返回字符串"true" / "false"
-
Boolean对象,误区
let falseObj = new Boolean(false) let res = falseObj && true res // true let falseVal = false let res = falseVal && true res // false -
typeof 原始值 : 'boolean',typeof 引用值:'object'
-
Boolean 对象是 Boolean类型的实例。
let falseObj = new Boolean(false) let falseVal = false typeof falseObj // "object" typeof falseVal // "boolean" falseObj instanceof Boolean // true falseVal instanceof Boolean // false
2、Number
- 数值的引用类型
- 重写了valueOf()、toLocaleString() 、 toString()方法
- valueOf() 返回Number对象表示的原始数值
- toString() 方法参数可以是基数,返回相应基数(进制)形式的数值字符串
- toFixed() 方法返回包含指定小数点位数的数值字符串
- 如果不足则补0,如果超过则四舍五入
- toExponential() 返回科学技术法表示的数值字符串
- 参数表示结果中小数的位数
- toPrecision() 根据情况返回最合理的输出结果。
- 根据数值和精度决定调用toFixed() 还是toExponential()
let numberObj = new Number(10)
let numberVal = 10
typeof numberObj // "object"
typeof numberVal // "number"
numberObj instanceof Number // true
numberVal instanceof Number // false
- isInteger() 方法
- Number.isInteger() 辨别一个数值是否保存为整数
- 小数位全是0也认为不是浮点值
- Number.MIN_SAFE_INTEGER /Number.MAX_SAFE_INTEGER
- 范围内二进制值可以表示一个整数值
- 超出范围可能表示不同的数值
- 判断方法 Number.isSafeInteger()
3、String
- 字符串的引用类型
- valueOf()、toLocaleString() 、toString() 都返回原始值
- length属性查看字符数量,双字节字符也会按单字符计算
1、javaScript字符串
let msg = "abcde"
-
charAt() 返回给定索引位置的字符
message.charAt(2) //"c" -
charCodeAt() 返回制定码元的字符编码
message.charCodeAt(2) //99 -
fromCharCode() 返回码创建字符串字符
String.fromCharCode(97,98,99,100,101) //"abcde"
2、normalize() 方法
3、字符串的操作方法
- concat()
- 将一个或多个字符串拼接成一个新字符串
- 原值保持不变
- 参数任意多个
- 等同于 +
- slice()
- 等同于数组slice
- 正数与substring()相同
- 负数相当于字符串长度加上负数
- 截取从xxx到xxx的字符
- 原值不变
- 第二个参数省略相当于到尾部
- substring()
- 正数与slice()相同
- 负数全部转为0
- 截取从xxx到xxx的字符
- 原值不变
- 第二个参数省略相当于到尾部
- 较小的数作为起点,较大的作为终点
- substr()
- 第一个参数开始截取第二个参数长度的字符串
- 第一个参数负值当成字符串长度加上负数
- 第二个参数负值转为0
- 原值不变
- 第二个参数省略相当于到尾部
4、字符串位置方法
从字符串中搜索传入的字符串,并返回位置,没找到返回-1
- indexOf()
- 从字符串开头开始查找子字符串
- 第二个参数,表示开始搜索位置
- lastIndexOf()
- 从字符串末尾开始查找子字符串
- 第二个参数,表示开始搜索位置
// 查找所有目标字符串
let str = 'Lorem ipsum dolor sit amet'
let positinos = new Array()
let pos = str.indexOf("e")
while(pos > -1){
positions.push(pos)
pos = str.indexOf("e", pos + 1)
}
positions // [3, 24]
5、字符串包含方法
-
startsWith()
- 检查开始于0的匹配项
- 第二个参数表示开始搜索位置
-
endsWith()
-
检查末尾字符串
-
第二个参数表示末尾位置
let msg = 'foobarbaz' msg.endsWith('bar') // false msg.endsWith('bar', 6) // true
-
-
includes()
- 检查整个字符串
- 第二个参数表示开始搜索位置
6、trim() 方法
- 删除前后空格符
- 不改变原值
- trimLeft() 、 trimRight() 分别清理前后空格
7、repeat() 方法
- 接收整数参数,表示将字符复制多少次
- 不改变原值
8、padStart() 和 padEnd() 方法
- 不改变原值
- 如果小于制定长度,后在前后添加字符
- 第一个参数 长度
- 第二个参数 填充字符串,默认空格
- 第二个参数不限定一个字符,如果多个字符,会进行拼接截断来匹配
9、字符串迭代与结构
-
字符串原型上暴露了一个@@iterator方法,表示可以迭代字符串每个字符
let msg = 'abc' let iterator = msg[Symbol.iterator]() iterator.next() //{value: "a", done:false} iterator.next() //{value: "b", done:false} iterator.next() //{value: "b", done:false} iterator.next() //{value: undefined, done:true} -
在for-of中可以用这个迭代器按序访问每个字符
for(const c of 'abc'){ console.log(c) } -
通过这个迭代器,字符串可以通过解构操作符解构。
let msg = "abcde" [...msg] // ["a", "b", "c", "d", "e"]
10、字符串大小写转换
- toLowerCase() 转为小写
- toUpperCase() 转为大写
11、字符串模式匹配方法
-
match()
- 本质上和exec() 方法相同,返回数组一样
- 参数可以是正则表达式字符串或RegExp对象
let text = "cat, bat, sat, fat" let pattern = /.at/ // 等价于 pattern.exec(text) let matches = text.match(pattern) matches.index // 0 matches[0] // "cat" pattern.lastIndex // 0 -
search()
- 参数可以是正则表达式字符串或RegExp对象
- 返回模式第一个匹配的位置索引,没找到返回-1
- 始终从字符串开头向后匹配
let text = "cat, bat, sat, fat" let pos = text.search(/at/) pos // 1 -
replace()
- 字符串替换
- 两个参数
- 第一个参数可以是RegExp对象 或一个字符串(不会转为正则表达式)
- 第二个参数可以是一个字符串或者函数
- 如果第一个参数是字符串,只会替换第一个子字符串。若需替换所有第一个参数必须为正则表达式且带全局标记
let text = "cat, bat, sat, fat" let result = text.replace("at", "ond") result // "cond, bat, sat, fat" result = text.replace(/at/g, "ond") result // "cond, bond, sond, fond"-
第二个参数是字符串时,有几个特殊序列
字符序列 替换文本 $$ $ $& 匹配整个模式子字符串,lastMatch $' 匹配子字符串之后字符串,rightContext $` 匹配子字符串之前字符串,leftContext $n 匹配第n个捕获组的字符串,n是0-9 没有捕获组为空字符串 $nn 匹配第nn个捕获组的字符串,n是01-99 没有捕获组为空字符串 let text = "cat, bat, sat" result = text.replace(/(.at)/g, "word($1)") result //"world(cat), world(bat), world(sat)" -
第二个参数是函数的时候
- 会收到三个参数
- 与整个模式匹配的字符串
- 匹配项在字符串中的开始位置
- 整个字符串
- 返回一个字符串
- 表示应该替换成什么
function htmlEscape(text){ return text.replace(/[<>"&]/g, function(match, pos, originalText) { switch(match) { case "<": return "<"; case ">": return "$gt;"; case "&": return "&"; case "\"": return """; } }) } - 会收到三个参数
-
split()
- 根据传入的分隔符将字符串拆分成数组
- 分隔符可以是字符串也可以是RegExp对象
- 第二个参数是数组大小
let colorText = "red,blue,green" colorText.split(",") // ["red", "blue", "green"] colorText.split(",", 2) // ["red", "blue"] colorText.split(/[^,]+/) // ["", ",", ",", ""]
12、localeCompare() 方法
- 比较两个字符串,返回如下3个值的一个
- 如果按字母表顺序,字符串应该排在字符串参数前头,返回负值,通常是-1
- 相等 返回0
- 如果按字母表顺序,字符串应该排在字符串参数后头,返回正值,通常是1
13、HTML方法
动态生成html标签
4、单例内置对象
- 内置对象: 任何由ECMAScript实现提供,与宿主环境无关的,并在ECMAScript程序开始执行时就存在的对象。
1、Global
- Global对象作为一种兜底的对象,针对的是不属于任何对象的属性和方法。
- 事实上在全局作用域中定义的变量和函数都会变成Global对象的属性。
1、URL编码方法
-
用于编码统一资源标志符,以便传给浏览器
-
encodeURI()
- 对整个URI编码
- 不会编码输入URL组件的特殊字符
- 如冒号、斜杠、问号、井号
-
encodeURIComponent()
- 常用
- 编码URI中单独组件
- 所有非字母都替换成编码格式
-
对应decodeURI() 、decodeURIComponent()
-
取代了escape(), unescape()
2、eval()
- 接收参数,一个要执行的ECMAScript 字符串
- 被执行的代码与该上下文有相同的作用域链
- 可以定义函数、变量供外部使用(非严格模式)
- 慎用
3、Global对象属性
- 特殊值
- undefined、NaN、Infinity
- 构造函数
- Object, Array, Function,Boolean,String, Number, Date, RegExp, Symbol, Error, EvalError, RangeError, ReferenceError,SyntacError,TypeError,URIError
4、window 对象
-
浏览器将window对象实现为Global对象的代理
let global = function() { return this }()
2、Math
- 比直接实现快的多,因为用了更高效的实现和处理器指令。
- 但精度会因环境而异
1、Math对象属性
| 属性 | 说明 |
|---|---|
| Math.E | 自然对数的基数e的值 |
| Math.LN10 | 10为底的自然数对数 |
| Math.LN2 | 2为底的自然数对数 |
| Math.LOG2E | 以2为底e的对数 |
| Math.LOG10E | 以10为底e的对数 |
| Math.PI | π 的值 |
| Math.SQRT1_2 | 1/2的平方根 |
| Math.SQRT2 | 2的平方根 |
2、min() 和 max() 方法
- 确定一组数值中的最小值和最大值
- 数组可以用扩展操作符 ...
3、舍入方法
- Math.ceil() 始终向上舍入为最接近的正数
- Math.floor() 始终向下舍入为最接近的正数
- Math.round() 执行四舍五入
Math.fround() 返回数值最接近的单精度(32位)浮点值表示
4、random() 方法
- 返回0~1范围内的随机数,包含0,不含1
// 返回1~10
number = Math.floor(Math.random()* 10 + 1)
- 加密建议使用window.crypto.getRandomValues()
5、其他方法
-
Math.abs(x) 返回x的绝对值
-
Math.pow(x, power) 返回x的power次幂
-
Math.sqrt(x) 返回x的平方根