内置对象
# 内置对象
# Global
浏览器中window
和self
指代全局对象,node环境中用global
,webWorker中用self
。js中的“全局变量”都是全局对象的属性,在浏览器中是window对象的属性。
# Math
# 常量
E、PI、LN2(loge2或In2)、LN10、SQRT1_2(2的平方根的倒数)、SQRT2、LOG2E、LOG10E。
结合with(Math){}
就不用在所有方法前加Math了~
方法 | 简介 |
---|---|
Math.pow(x, n) | 幂运算。 |
Math.ceil() | 向上取整。 |
Math.floor() | 向下取整。 |
Math.round() | 四舍五入。 |
Math.log() | 以e为底取对数。 |
Math.sqrt() | 开方。 |
Math.sin() | |
Math.cos() | |
Math.tan() | |
Math.random() | 得到一个0~1之间的随机数。 |
Math.exp() | e做幂运算。 |
Math.max() | |
Math.min() | |
Math.acos() | |
Math.asin() | |
Math.atan() | |
Math.atan2() |
# JSON
JSON全称JavaScript Object Notation,即JS对象表示法,也用在很多其他语言中,作为一种简单的传递对象数据的格式。
# JSON.parse()
将标准JSON格式的字符串转为JS对象,不符合格式会提示‘unexpected token',最常见的是'unexpected token u',也就是undefined,因此写接口一定要注意将未知类型转换成安全类型。
# JSON.stringify()
将JS对象转为JSON格式,结合parse可以用于对象深拷贝。
# Date
# 实例化Date对象
let now = new Date()
返回Date对象,控制台输出如2019-08-16T06:06:36.238Z
。
# 仅获取表示时间的字符串
let now = Date()
如果不作为构造函数,那么Date()仅返回字符串如'Fri Aug 16 2019 13:49:46 GMT+0800 (China Standard Time)'
。
方法 | 简介 |
---|---|
set/getFullYear | 从Date对象返回年份(如2019)。 |
set/getDate | 从Date对象返回天数(1~31)。 |
set/getDay | 从Date对象返回星期(0~6,0是星期天)。 |
set/getHours | 从Date对象返回小时(0~23)。 |
set/getMinutes | 从Date对象返回分钟(0~59)。 |
set/getSeconds | 从Date对象返回秒数(0~59)。 |
set/getMiliseconds | 从Date对象返回毫秒数(0~999)。 |
set/getTime | 从Date对象返回返回从1970年1月1日0时起的毫秒数。与valueOf方法返回一致。 |
# toDateString
把Date对象的日期部分转化成可读性强的字符串,如Fri Aug 16 2019
。
# toString
把Date转化成可读性强的字符串,如Fri Aug 16 2019 14:06:36 GMT+0800 (China Standard Time)
,格式与直接使用Date()一致。
# Date.UTC
静态方法。 UTC( Universal Coordinated Time )即国际协调时间,与GMT(格林尼治时)相同,此方法接受从年到毫秒的7个参数,返回距1970年1月1日0时的毫秒数。此外,从get/set(UTC)FullYear到get/set(UTC)Miliseconds也都有对应的UTC方法。
# RegExp
# 数组 Array
# 数组属性
# length
数组长度/元素个数。
# constructor
构造函数。
# prototype
通过在原型上定义方法,让所有数组都可以使用自定义的方法。
# 数组方法
# 变异方法与非变异方法 mutation method and non-mutation method
有些方法改变原数组,称为变异方法;也有些方法返回一个新数组,称为非变异方法;剩下的那些方法不改变数组也不返回数组。下面用M(Mutation)和N(Non-mutation)标记变异与非变异方法。扩展运算符...
可以浅拷贝数组,在一些场景下可以将变异方法作为非变异方法使用。
# map N
Array.prototype.map(function(currentValue,index,arr),thisValue)
map的作用是按回调函数的规则从原数组映射出一个新数组(作为返回值)。
从函数原型可以看出,回调函数可以得到当前元素的值、索引、原数组,处理后的值应作为返回值,还能传入this对象。
currentValue和index以及arr是只读的,但arr是对象,currentValue也可能是对象,此时可以修改属性或执行方法。
# forEach
Array.prototype.forEach(function(currentValue, index, arr), thisValue)
参数 | 描述 |
---|---|
function(currentValue, index, arr) | 必需。currentValue即当前元素(必需),index即索引值,arr即数组对象。 |
thisValue | 传入的this值,默认undefined |
无返回值,不能改变数组。如果数组成员是对象,当然可以更改其属性,因为数组只存了对象的指针。
# reduce
Array.prototype.reduce(function(total, currentValue, index, arr), initialValue)
迭代器,reduce从左到右遍历数组并接受一个函数作为累积器。这个函数接受上次迭代的返回值(total,而初始值可以用initialValue指定),并最终得到一个返回值作为reduce的返回值。
使用reduce可以组织多个函数作为函数链,称为compose。
# reduceRight
与reduce相似,但从右向左迭代。
# filter N
Array.prototype.filter(function(currentValue, index, arr), thisValue)
过滤器,返回所有符合条件的项(回调函数中返回true)。不能改变数组。
# push、pop M
Array.prototype.push(arg1, arg2, ...)
Array.prototype.pop()
栈方法。进栈和出栈。进栈返回新数组长度,出栈返回出栈元素的值。
# shift、unshift M
Array.prototype.shift()
Array.prototype.unshift(arg1, arg2 , ...)
shift即出队列,删除数组第一项并将其作为返回值,unshift则是将item塞回队列(成为新数组的第0项、第1项等等)。push和shift方法结合使用则数组可以作为队列使用。
# slice N
Array.prototype.slice(start, end)
切片的意思,即返回数组的一部分。start和end指定了开始和结束的数组下标,他们都接受负数值,-n代表从末尾向前数的第n个元素。
# find ES6
Array.prototype.find(function(currentValue, index, arr), thisValue)
接受函数作为条件,返回第一个函数返回true的数组项。
# findIndex ES6
和find用法一致,返回第一个函数返回true的数组项的索引。如果找不到返回-1。
# indexOf
Array.prototype.indexOf(item, start)
indexOf接受一个值直接与数组项进行比较,返回第一次匹配的项的索引,如果找不到返回-1。start可以指定从哪一项开始搜索。
# lastIndexOf
Array.prototype.lastIndexOf(item,start)
与indexOf相似,但返回最后一个匹配项。
# sort M
Array.prototype.sort([compareFunction(firstEl,secondEl)])
排序。修改原数组,返回对原数组的引用(即修改后的数组)。
比较函数是可选的,接受比较的第一个元素和第二个元素,如果返回结果小于0,a将被排在b前面,如果大于0,b将被排在a前面,如果等于0,顺序不变(遗憾的是浏览器不一定遵守)。
默认的sort将元素转为字符串并比较编码值大小。
sort方法内部使用对部分场景优化后的快速排序。
# reverse M
Array.prototype.reverse()
翻转数组。改变原数组,返回其引用。
# splice M
Array.prototype.splice(index[, howmany, item1, item2, ...])
Splice的中文意为铰接、粘接,该方法可以自由地从数组添加、删除元素。
第一个参数index用于确定位置,从哪里开始操作;第二个参数决定从下标为index的元素起,删除几个元素;后面的参数将会添加到数组中从index开始的位置上。
# concat N
Array.prototype.concat([arr1, arr2, ...])
concat意为串联,即将两个或多个数组连接在一起并返回。参数为空时返回原数组拷贝,常用于复制数组。
# join
Array.prototype.join([separator=","])
join返回所有数组元素转换成的一个字符串,默认用半角逗号分隔,和toString表现一致,也可以自己指定分隔符。
# fill M ES6
Array.prototype.fill(value[, start=0[, end=array.length]])
以固定值填充数组。start和end指定填充区间,array[end]不会被填充。
# copyWithin M
Array.prototype.copyWithin(targetIndex[, start[, end=array.length]])
targetIndex确定了要复制到的位置,而start与end决定了被复制元素的范围。这种复制不是插入,而是覆盖原有元素,并且不改变数组长度。
# includes ES6
Array.prototype.includes(searchElement[, fromIndex])
第一个参数传入值,第二个参数确定从哪开始搜索,-n代表倒数第n项。如果数组包括该值则返回true,否则返回false。
# from ES6
Array.prototype.from(object[, mapFunction[, thisValue]])
object如果是拥有length属性或可迭代的对象,通过此方法能够返回一个数组。不符合要求的对象会导致from方法返回空数组。
# every
Array.prototype.every(function(currentValue,index,arr),thisValue)
返回Boolean值,当且仅当所有元素传入回调函数的返回结果为true时every的结果为true。
# some
和every用法一致,有一个元素传入回调的结果为true即返回true并不再检验之后的元素。
# entries ES6
Array.prototype.entries()
从数组返回一个可迭代对象(Array Iterator)。如果不明白可以先了解function generator。
# keys ES6
Array.prototype.keys()
创建key的可迭代对象,而数组的key是0、1、2、3...
# isArray
Array.prototype.isArray(obj)
顾名思义,判断是否数组,返回Boolean值。
# toString
其实和join类似,返回字符串,不过不带参数,只能以逗号分隔。
# valueOf
数组对象的默认方法,返回数组原始值。不必手动调用。
# 对象 Object ✏️
# 认识对象
虽然{a:1,b:2}
看起来简单,但其后深藏功与名。首先,Object对象具有Object.prototype方法,同时,对象的属性背后还有属性描述符,属性也分可否枚举,属性也可以是对象,甚至可以是自身{ obj: [Circular] }
。
# 可枚举属性 Enumerable Properties
Object.keys()、for...in、JSON.stringily()都只处理可枚举属性,可以用Object.propertyIsEnumerable()方法判断属性是否可枚举。
定义一个不可枚举属性:
let obj = {}
obj.defineProperty(obj,"attr",{
value:"bread",
enumerable:false
})
待填坑
如果属性存在于原型
# 对象拷贝
除了接下来介绍的Object.assign(),还可以用扩展运算符复制对象,以及JSON.parse(JSON.stringify())深拷贝对象(不支持循环引用与方法),对于数组可以用concat()。
# Object.assign()
Object.assign(target, ...source)
(浅)拷贝数组,将所有可枚举属性从一个或多个源对象复制到目标对象,并将其作为返回值。需要注意它调用源对象的Setter和目标对象的Getter,如果合并源包括Getter或目标包括Setter,那么应该使用Object.getOwnPropertyDescriptor()与Object.defineProperty()准确复制属性定义。
#
# 字符串 String
string是JS基础类型之一,String对象为操作string提供了丰富的方法。
# 字符串方法特性
字符串方法均返回新值,不改变原字符串。
# 扩展字符串的方法
# concat()
String.prototype.concat([str1[, str2[, ...]]])
连接多个字符串并作为结果返回。
# repeat() ES6
String.prototype.repeat(count=0)
将字符串复制指定次数合并成一个字符串返回,默认count=0即返回空字符串。
# 获取子串的方法
# substring()
String.prototype.substring(from[, to=array.length])
给定两个下标,截取部分字符串作为返回值,arr[to]不会被截取。
# substr()
String.prototype.substr(start[, length=array.length-start])
截取从arr[start]开始的length个字符作为返回值,不指定length则截取到结尾。
# slice()
String.prototype.slice(start[, end=array.length])
截取字符串片段,不包括arr[end],end可以为负(-n代表倒数第n个)。
# charAt()
String.prototype.charAt(index=0)
接受index并返回str[index]。
# 与正则相关的方法
# replace()
String.prototype.replace(searchValue, newValue)
接受字符串或RegExp进行匹配和替换。如果是字符串只能替换第一次匹配的子字符串,正则表达式可以替换所有的项(/str/g
)。
# match()
String.prototype.match(RegExp)
接受一个正则表达式,返回结果数组或null。
# matchAll() ES6
接受一个正则表达式,返回所有匹配。返回的结果具有Iterator接口,但不是数组(可以转为数组)。
# search()
String.prototype.search(searchValue)
接受字符串或正则表达式,返回第一次匹配的子字符串起始位置的下标,找不到返回-1。
# split()
String.prototype.split([separator[, limit]])
将字符串按分隔符拆成数组,separator可以是字符串或RegExp,默认不会拆分,传入""空字符串可拆分每一个字符,limit限制返回子字符串的最大数量(达到limit个子字符串后split即返回)。
# 搜索、检验字符串的方法
# indexOf()
String.prototype.indexOf(searchValue[, start])
与search相似,但只接受字符串,可以给一个开始搜索的位置。注意它不会来回找,如果在start到end区间都没有匹配项就返回-1。
# lastIndexOf()
String.prototype.lastIndexOf(searchValue[, start])
与indexOf的区别在于,该方法从后往前找,能找到最后一次出现的位置。
# includes() ES6
String.prototype.includes(searchValue[, start])
与indexOf类似,但不返回子字符串位置,只返回Boolean值。
# startsWith() ES6
String.prototype.startsWith(value[, start=0])
用于判断字符串是否以value开头。不过start可以自定义,也就是判断字符串start处开始的子串是否匹配字符串value。返回结果为Boolean值。
# endsWith() ES6
与startsWith相似,判断字符串尾部是否与参数匹配。但endsWith的第二个参数表示以此处作为结束的位置,例如Apple Computer
可以匹配Apple
,只需要endsWith('Apple',5)
。
# 修饰字符串的方法
# trim()
ES6新增了trimStart() trimEnd() trimLeft() trimRight()
方法。
去除字符串两边的空格作为返回值。trimStart和trimLeft只去除左边的空格,trimEnd和trimRight相反。
# toLowerCase()
将大写转换成小写字母并返回。
# toUpperCase()
将小写转换成大写字母并返回。
# padStart() ES6
补全字符串。第一个参数是新的字符串长度,第二个参数是用于补全的字符串,该字符串将被填充到新字符串头部。
# padEnd() ES6
与padStart相似,但填充到尾部。
# 与码点相关的方法
# charCodeAt()
String.prototype.charCodeAt(index=0)
接受index并返回str[index]的Unicode编码。
# codePointAt() ES6
取回字符码点,用于弥补charCodeAt不支持大于0xFFFF码点的不足。
# normalize() ES6
例如欧洲语言有时会用两个码点组合成一个字符,也可以直接表示一个字符,但两者对js而言并不相等,可以通过对两者normalize化使两者相等。
# String对象的方法
# String.raw() ES6
返回转义前的字符串,比如下划线\
会被转成两个下划线\\
。
# String.fromCharCode()
String.fromCharCode([code1[, code2[, ...]]])
接受一个或多个字符编码(0xFFFF内),返回创建的字符串。
# String.fromCodePoint() ES6
弥补fromCharCode的不足,可以接受大于0xFFFF的码点。
# Unicode表示法
JS允许以\uXXXX
的形式显示一个字符,但不支持大于0xFFFF的数值,ES6中支持以\u{XX...}
的形式显示码点更大的字符。
# Iterator接口 ES6
对于字符串来说,遍历的结果是每一个字符。
# 模板字符串 ES6
# 基于模板字符串的模板引擎
待填坑
# 更多
# URI编码
encodeURI()、decodeURI()转义不属于uri本身的字符,比如空格会被转换为%20
,但/
不会被转换。这两个方法转义URI本身。
encodeURIComponent()、decodeURIComponent()转义所有特殊字符的编码,像http://
会被转换成http%3A%2F%2F
。这两个方法用于转义URI中的参数。
# eval()
动态执行javascript代码。eval内执行的代码虽然不会被提升(hoisting),但也能访问当前环境。
# 异步
setTimeout(handler: any=>any, delay: number)用于延时执行代码。返回值是一个Timeout对象。
setInterval(handler: any=>any, interval: number)用于间隔一定时间重复执行代码,第一次执行在一次interval后。返回值是一个Timeout对象。
clearTimeout()与clearInterval()接受一个Timeout对象,用于中止异步操作。
# Error构造函数
包括Error()、EvalError()、RangeError()、ReferenceError()、SyntaxError()、TypeError()、URIError()。