本篇文章记录一下标准库的常用对象的API。
包装对象Number、String、Boolean
valueOf()返回包装对象实例的原始值。
new Number(123).valueOf() // 123
new String('abc').valueOf() // "abc"
new Boolean(true).valueOf() // true
toString()方法返回对应的字符串形式。
new Number(123).toString() // "123"
new String('abc').toString() // "abc"
new Boolean(true).toString() // "true"
Boolean
if (Boolean(false)) {
console.log('true');
} // 无输出
if (new Boolean(false)) {
console.log('true');
} // true
if (new Boolean(false).valueOf()) {
console.log('true');
} // 无输出
Number
Number对象拥有以下一些静态属性.
Number.POSITIVE_INFINITY // 正的无限 Infinity
Number.NEGATIVE_INFINITY // -Infinity
Number.NaN // NaN
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MAX_VALUE < Infinity // true
Number.MIN_VALUE // 表示最小的正数 5e-324
Number.MIN_VALUE > 0 // true
Number.MAX_SAFE_INTEGER // 9007199254740991
Number.MIN_SAFE_INTEGER // -9007199254740991
Number实例方法
(10).toString() // "10"
10.005.toFixed(2) // 先转为指定位数的小数,然后返回字符串。 "10.01"
(10).toExponential(2) // 科学计数法形式 "1.00e+1"
(12.34).toPrecision(2) // "12"
(12.34).toPrecision(2) // "12" 将一个数转为指定位数的有效数字。
(123).toLocaleString('zh-Hans-CN-u-nu-hanidec') // "一二三" 当地书写形式
String
String.fromCharCode(104, 101, 108, 108, 111)
// "hello"
实例属性 String.prototype.length
实例方法
charAt方法返回指定位置的字符,参数是从0开始编号的位置。
var s = new String('abc');
'abc'.charAt(1) // "b"
'abc'[1] // "b"
charCodeAt()方法返回字符串指定位置的 Unicode 码点。concat``连接两个字符串,返回新串,不改变原字符串。slice substr从原字符串取出子串并返回,不改变原字符串闭闭【】。substring取出子串并返回,不改变原字符串 闭开【).indexOf lastIndexOf出现的位置。trim用于去除字符串两端的空格并,不改变原字符串。toLowerCase全部转为小写,toUpperCase全部转为大写。并且返回,不改变原字符串。match确定原字符串是否匹配某个子字符串,返回数组,成员为匹配的第一个字符串,还有index属性和input属性,分别表示匹配字符串开始的位置和原始字符串。(可传正则)search方法的用法基本等同于match,但是返回值为匹配的第一个位置index。(可传正则)replace用于替换匹配的子字符串(可传正则)。split按照规则分割串,返回数组。localeCompare用于比较两个字符串。返回-1,0,1。
Array
Array()作为构造函数,行为很不一致。因此字面量是更好的做法。
// bad
var arr = new Array(1, 2);
// good
var arr = [1, 2];
Array.isArray参数是否为数组。
实例方法
- valueOf
var arr = [1, 2, 3];
arr.valueOf() // [1, 2, 3]
- toString
var arr = [1, 2, 3];
arr.toString() // "1,2,3"
var arr = [1, 2, 3, [4, 5, 6]];
arr.toString() // "1,2,3,4,5,6"
push用于在数组的末端添加一个或多个元素.pop用于删除数组的最后一个元素,并返回该元素。会改变原数组。shift()用于删除数组的第一个元素,并返回该元素。会改变原数组。结合while可以遍历并清空一个数组。unshift()在第一个位置添加元素,接受多个参数,返回添加后的数组长度。会改变原数组。join()以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。默认用逗号分隔。concat方法用于多个数组的合并。返回一个新数组,原数组不变。拷贝的是对象的引用,改变原对象以后,新数组跟着改变。reverse用于翻转数组,该方法将改变原数组。slice(start, _ end)方法用于提取目标数组的一部分,原数组不变。arr.splice(start, count, addElement1, addElement2, ...)用于删除一部分,并可以在删除的位置添加新成员,返回被删除的元素。注意,该方法会改变原数组。sort用于排序,原数组将被改变。map()将数组的所有成员依次遍历,然后把每一次的执行结果组成一个新数组返回。forEach()遍历数组。filter()用于过滤数组成员,满足条件的成员组成一个新数组返回。some方法返回一个布尔值,只要一个成员的返回值是true就可以。
var arr = [1, 2, 3, 4, 5];
arr.some(function (elem, index, arr) {
return elem >= 3;
});
// true
every方法返回一个布尔值,是所有成员的返回值都是true才可以。reduce()方法和reduceRight()方法依次处理数组的每个成员,最终累计为一个值。
[1, 2, 3, 4, 5].reduce(function (a, b) {
console.log(a, b);
return a + b;
})
// 1 2
// 3 3
// 6 4
// 10 5
//最后结果:15
第一次执行:`a`是数组的第一个成员`1`,`b`是数组的第二个成员`2`。
第二次执行:`a`为上一轮的返回值`3`,`b`为第三个成员`3`。
第三次执行:`a`为上一轮的返回值`6`,`b`为第四个成员`4`。
第四次执行:`a`为上一轮返回值`10`,`b`为第五个成员`5`。至此所有成员遍历完成,整个方法的返回值就是最后一轮的返回值`15`。
[1, 2, 3, 4, 5].reduce(function (
a, // 累积变量,必须
b, // 当前变量,必须
i, // 当前位置,可选
arr // 原数组,可选
) {
// ... ...
indexOf方法返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1。lastIndexOf方法返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1。- 以上返回数组的方法可以
链式调用。
JSON
静态方法
JSON.stringify()方法用于将一个值转为 JSON 字符串。会忽略对象的不可遍历的属性。
var obj = {
'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3'
};
var selectedProperties = ['prop1', 'prop2'];
JSON.stringify(obj, selectedProperties) //第二个参数,指定属性转成字符串。
// "{"prop1":"value1","prop2":"value2"}"
JSON.stringify({ p1: 1, p2: 2 }, null, '\t') //第三个参数,增加可读性。
JSON.stringify()参数对象有toJSON()方法,就直接使用。
JSON.parse()将 JSON 字符串转换成对应的值。可以放在try catch中。
BOM
网页中嵌入 JavaScript 代码:
<script>元素直接嵌入代码。<script>标签加载外部脚本- 事件属性
- URL 协议
<a href="javascript: new Date().toLocaleTimeString();void 0;">点击</a>
浏览器一边下载 HTML 网页,一边开始解析。遇到script就(下载)将控制权交给JS引擎。为避免“阻塞效应”最好将脚本都写在在下方或者本地。或者直接用 defer 属性让脚本延迟执行(不影响下载)。或者用 async 开启另一个线程下载。
浏览器的核心是两部分:渲染引擎和 JavaScript 解释器(又称 JavaScript 引擎)。
google浏览器渲染引擎内核是webkit(渲染页面)(自家有开发了Blink), V8引擎是解析和执行脚本的。
window
window.name 主要配合超链接和表单的target属性使用
window.closed窗口是否关闭。
window.opener打开当前窗口的父窗口。
window.self和window.window属性都指向窗口本身。
window.frames页面内所有框架窗口
window.length当前网页包含的框架总数。
window.frameElement当前窗口嵌在另一个网页的情况
window.top属性指向最顶层窗口 window.parent属性指向父窗口
window.devicePixelRatio一个 CSS 像素物理像素的比率。
位置信息和大小信息:
screenX innerHeight outerHeight scrollX pageXOffset
组件对象 都有.visible
window.locationbar:地址栏对象window.menubar:菜单栏对象window.scrollbars:窗口的滚动条对象window.toolbar:工具栏对象window.statusbar:状态栏对象window.personalbar:用户安装的个人工具栏对象
全局对象
documen Location Navigator(环境信息)History localStorage sessionStorage console Screen
isSecureContext是否处在加密环境。如果是 HTTPS 协议,就是true
对象方法
window.alert()、window.prompt()、window.confirm()它弹出不同的无法定制的对话框。
window.open新建另一个浏览器窗口。
window.close关闭当前窗口。
window.stop()等同于单击浏览器的停止按钮。 window.moveTo(x,y)移动浏览器窗口到指定位置。moveBy是相对位置。
window.resizeTo()缩放窗口到指定大小,resizeBy是相对缩放。
window.scrollTo将文档滚动到指定位置,scrollBy指定距离。
window.print打印对话框。
focus blur。
window.getSelection表示用户现在选中的文本。
window.getComputedStyle(“节点”)返回一个包含该元素的最终样式信息的对象。
事件
onload onerror onafterprint onbeforeprint onoffline onpageshow onunload
多窗口
由于网页可以使用iframe元素,嵌入其他网页。
window.top w.self. w.parent
Naviagtor
属性:
userAgent 表示用户设备信息。
plugins 插件。 platform 操作系统。onLine 在线状态。language``languages
geolocation包含用户地理位置的信息。只有在 HTTPS 协议下可用。
cookieEnabled Cookie 功能是否打开。
静态方法:
javaEnabled 是否能运行 Java Applet 小程序。
sendBeacon()方法用于向服务器异步发送数
实验性属性:
deviceMemory 内存数量GB
connection ,包含当前网络连接的相关信息。
Screen window.screen
浏览器窗口所在的屏幕height,availHeight,pixelDepth,colorDepth,orientation
Cookie 浏览器每次发出请求,会自动附上。document.cookie
区分 Cookie 时不考虑协议和端口。
HTTP 响应可以包含多个Set-Cookie字段:
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
如果同时指定了Expires和Max-Age,那么Max-Age的值将优先生效。
Cookie 的SameSite属性用来限制第三方 Cookie,从而减少风险。
XMLHttpRequest
AJAX是 JavaScript 脚本发起 HTTP 通信的代名词。 AJAX 已成一个通用名词。
var xhr = new XMLHttpRequest();//没有参数
xhr.setRequestHeader('Content-Type', 'application/json');//设置 请求头
`overrideMimeType()`方法用来指定 MIME 类型,覆盖服务器返回的真正的 MIME 类型
xhr.ontimeout = function () {
console.error('The request for ' + url + ' timed out.');
};
//还可以监听:onloadstart,onprogress,onabort,onload,onloadend
xhr.onreadystatechange = function(){ //监听通信状态(`readyState`属性)的变化。
// 通信成功时,状态值为
- 0,实例已经生成,但是`open()`方法还没有被调用。
- 1,`open()`已经调用,但是`send()`还没调用,仍然可以使用实例的`setRequestHeader()`方法。
- 2,`send()`方法已经调用,并且服务器返回的头信息和状态码已经收到。
- 3,表示正在接收服务器传来的数据体(body 部分)。
- 4,表示服务器返回的数据已经完全接收,或者本次接收已经失败。
if (xhr.readyState === 4){
if (xhr.status === 200){
console.log(xhr.responseText|response|responseType("arraybuffer|blob二进制|document文档对象|json|text"));
} else {
console.error(xhr.statusText|responseXML|responseURL);
}
}
};
xhr.onerror = function (e) {
console.error(xhr.getAllResponseHeaders()); //服务器发来的所有 HTTP 头信息。
console.error(xhr.statusText);
console.error(xhr.withCredentials);//跨域请求时,用户信息是否会包含在请求之中
};
xhr.open('GET', '/endpoint', true); //建立 HTTP 连接的一些细节。
xhr.timeout = 10 * 1000;// 指定 10 秒钟超时
xhr.send(Blob|ArrayBufferView|Document|String|FormData); //发出请求
xhr.abort() //终止请求
Navigator.sendBeacon() 请求与当前页面线程脱钩,可以保证会把数据发出去。
同源限制 协议,域名,端口
window 可以读取其他非同源的网页属性:closed, frames,length,location(读写),opener,parent, self,top,window,blur(),close(),focus(),postMessage()(跨窗口通信,不论是否同源)
三种规避AJAX同源限制的方式:
JSONP: 网页添加一个<script>元素,向服务器请求一个脚本
<script src="http://api.foo.com?callback=callBackFountion()"></script>
WebSocket 使用ws://(非加密)和wss://(加密)作为协议前缀。
CORS 允许任何类型的请求。
CORS “跨域资源共享”(Cross-origin resource sharing )
CORS 需要浏览器和服务器同时支持。浏览器发现跨域请求,就会自动添加一些附加的头信息,有时还会多出一次附加的预检请求。因此只要服务器实现了 CORS 接口,就可以跨域通信。
Access-Control-Allow-Origin: * //预检请求需要的头部信息
Storage
sessionStorage用于浏览器的一次会话(session),当会话结束(通常是窗口关闭),数据被清空。
localStorage保存的数据长期存在,下一次访问网页可以直接读。
window.localStorage.setItem('key', 'value');
window.localStorage.key = 'value';
window.localStorage['key'] = 'value';
window.localStorage.length
window.sessionStorage.getItem('key')
window.sessionStorage.key(index) //返回该位置键名 配合length可遍历
window.sessionStorage.removeItem('key')
window.sessionStorage.clear() //清除所有数据
Storage 接口储存的数据发生变化时:
function onStorageChange(e) {
console.log(e.key|newValue|oldValue|url(网址)|storageArea(整个对象));
}
window.addEventListener('storage', onStorageChange);
History 当前窗口的浏览历史
window.history.length //表示当前窗口一共访问过n个网址
window.history.back() // 后退到前一个网址
window.history.forward() //移动到下一个网址
window.history.go(int) //默认0即刷新当前页面
var stateObj = { foo: 'bar' };
history.pushState(stateObj, 'page 2', '2.html'); //在历史中添加一条记录
replaceState //修改 History 对象的当前记录
history.state // {foo: "bar"} //堆栈最上层的状态值
window.onpopstate = function (event) {
console.log('只有用户点击浏览器倒退按钮和前进按钮,或者back forward go`方法时才会触发);
};
其他对象
Location对象提供以下属性和方法:
// 如当前网址为
// http://user:passwd@www.example.com:4097/path/a.html?x=111#part1
document.location.href //等同网址
document.location.protocol // "http:"
document.location.host hostname
document.location.port // "4097"
document.location.pathname // "/path/a.html"
document.location.search // "?x=111"
document.location.hash // "#part1"
document.location.username // "user"
document.location.password // "passwd"
document.location.origin // "http://user:passwd@www.example.com:4097"
document.location.assign('http://www.example.com') // 跳转到新的网址
document.location.replace('http://www.example.com') // 跳转到新的网址
window.location.reload(true); // 向服务器重新请求当前网址
URL
encodeURI()``decodeURI 用于整个URL。
encodeURIComponent() decodeURIComponent 只能用于URL的片段。
var url = new URL('http://user:passwd@www.example.com:4097/path/a.html?x=111#part1');
url.href
url.protocol
url.hostname host
url.port
url.origin
url.pathname
url.search
url.searchParams
url.hash
url.password
url.username
URLSearchParams toString(), append(), delete(), has(), set(), getAll(), keys(), values(), entries()
ArrayBuffer 对象表示一段二进制数据,用于操作内存。
Blob ( Binary Large Object)
表示一个二进制文件(图片等)。通常用来读写文件。
var myBlob = new Blob(value, {type : 'text/html'}); //传入值和\
myBlob.size
myBlob.type
// <input type="file" accept="image/*" multiple onchange="fileinfo(this.files)"/>
function fileinfo(files) {
for (var i = 0; i < files.length; i++) {
var f = files[i];
console.log(
f.name, // 文件名,不含路径
f.size, // 文件大小,Blob 实例属性
f.type, // 文件类型,Blob 实例属性
f.lastModifiedDate // 文件的最后修改时间
);
}
}
File相关 (FileList)(FileReader)
// <input type="file" onchange="onChange(event)">
function onChange(event) {
var file = event.target.files[0];
var reader = new FileReader();
reader.onload = function (event) { //onabort onerror onloadstart onprogress
console.log(event.target.result)
};
reader.readAsText(file);
}
var myFile = new File([], 'file.bin', {
lastModified: new Date(2018, 1, 1),
});
myFile.lastModified // 1517414400000
myFile.name // "file.bin"
myFile.size // 0
myFile.type // ""
FormData
var myForm = document.getElementById('myForm');
myForm.checkValidity() //是否通过校验
var formData = new FormData(myForm);
formData.set('username', '张三');
formData.append('username', '李四');
formData.get('username') // "张三"
formData.getAll('username')
formData.keys()
formData.values()
entries()
表单的编码属性 enctype:
application/x-www-form-urlencoded text/plain multipart/form-data
IndexedDB
IndexedDB 允许储存大量数据,不支持 SQL 查询语句,更接近 NoSQL 数据库。
特点: 键值对,异步,支持事务,同源限制,存储空间大,支持二进制存储。
各种对象:
- 数据库:IDBDatabase 对象
- 对象仓库:IDBObjectStore 对象
- 索引: IDBIndex 对象
- 事务: IDBTransaction 对象
- 操作请求:IDBRequest 对象
- 指针: IDBCursor 对象
- 主键集合:IDBKeyRange 对象
多线程Worker
var worker = new Worker('work.js');
worker.postMessage('Hello World');
worker.postMessage({method: 'echo', args: ['Work']});
worker.onmessage = function (event) {
doSomething(event.data);
}
worker.terminate(); // 主线程关闭
self.close();// Worker 线程关闭
轮训操作也可以放在Worker里面。
Date以国际标准时间(UTC)1970年1月1日00:00:00作为时间的零点,范围是前后各1亿天(单位为毫秒)。
var today = new Date(); //当前时间
//today 的值等同于today.toString()
Date对象可以接受多种格式的参数.
new Date(1378218728000) //毫秒数
new Date('January 6, 2013'); //日期字符串
// Sun Jan 06 2013 00:00:00 GMT+0800 (CST)
new Date(2013, 0, 1, 0, 0, 0, 0) // 整数代表年、月、日、小时、分钟、秒、毫秒。
//年和月是不能省略。`0`表示一月的,
Date.parse()能解析的字符串,都可为参数。
//以下为同一个时间
new Date('2013-2-15')
new Date('2013/2/15')
new Date('02/15/2013')
new Date('2013-FEB-15')
new Date('FEB, 15, 2013')
new Date('FEB 15, 2013')
new Date('February, 15, 2013')
new Date('February 15, 2013')
new Date('15 Feb 2013')
new Date('15, February, 2013')
静态方法
Date.now距1970年1月1日 00:00:00 UTC的毫秒数。
Date.parse解析字符串,返回毫秒数。
Date.UTC方法接受年、月、日等变量作为参数,返回毫秒数。
实例方法
to类:从Date对象返回一个字符串,表示指定的时间。get类:获取Date对象的日期和时间。set类:设置Date对象的日期和时间。
valueOf getTime返回毫秒数。
toString返回一个完整的日期字符串。
toUTCString返回对应的 UTC 时间,北京时间晚8个小时。
toISOString返回对应时间的 ISO8601 写法。
toJSON返回一个符合 JSON 格式的 ISO 日期字符串,结果同上。
toDateString返回日期字符串(不含小时、分和秒)。
toTimeString返回时间字符串(不含年月日)。
本地时间
var d = new Date(2013, 0, 1);
d.toLocaleString()
// 中文版浏览器为"2013年1月1日 上午12:00:00"
// 英文版浏览器为"1/1/2013 12:00:00 AM"
d.toLocaleDateString()
// 中文版浏览器为"2013年1月1日"
// 英文版浏览器为"1/1/2013"
d.toLocaleTimeString()
// 中文版浏览器为"上午12:00:00"
// 英文版浏览器为"12:00:00 AM"
// 可选参数 ([locales[, options]]) ('zh-CN',{month: long})
d.toLocaleDateString('en-US', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric'
})
// "Tuesday, January 1, 2013"
get
getTime():返回实例距离1970年1月1日00:00:00的毫秒数,等同于valueOf方法getDate():返回实例对象对应每个月的几号(从1开始)。getDay():返回星期几,星期日为0,星期一为1,以此类推。getFullYear():返回四位的年份。getMonth():返回月份(0表示1月,11表示12月)。getHours():返回小时(0-23)。getMilliseconds():返回毫秒(0-999)。getMinutes():返回分钟(0-59)。getSeconds():返回秒(0-59)。getTimezoneOffset():返回当前时间与 UTC 的时区差异,以分钟表示,考虑到了夏令时因素。
set setUTC** 就是对应的UTC方法
setDate(date):设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。setFullYear(year [, month, date]):设置四位年份。setHours(hour [, min, sec, ms]):设置小时(0-23)。setMilliseconds(ms):设置毫秒(0-999)。setMinutes(min [, sec, ms]):设置分钟(0-59)。setMonth(month [, date]):设置月份(0-11)。setSeconds(sec [, ms]):设置秒(0-59)。setTime(milliseconds):设置毫秒时间戳。
正则表达式
var regex = /xyz/; //字面量表示,以斜杠表示开始和结束。编译新建正则,效率较高
var regex = new RegExp('xyz'); //运行时新建正则
实例属性
var r = /abc/igm;
r.ignoreCase // true 是否设置了`i`修饰符。
r.global // true 是否设置了`g`修饰符。
r.multiline // true 是否设置了`m`修饰符。
r.flags // 'gim' 返字符串,包含了已经设置的所有修饰符,按字母排序。
r.lastIndex // 0 返回下一次开始搜索的位置。
r.source // "abc" 返回其字符串形式(不包括反斜杠)。
Math 不是构造函数,不能生成实例
静态属性 只读
Math.E // 2.718281828459045 常数`e`。
Math.LN2 // 0.6931471805599453 2 的自然对数。
Math.LN10 // 2.302585092994046 10 的自然对数。
Math.LOG2E // 1.4426950408889634 以 2 为底的`e`的对数。
Math.LOG10E // 0.4342944819032518 :以 10 为底的`e`的对数。
Math.PI // 3.141592653589793 常数`π`。
Math.SQRT1_2 // 0.7071067811865476 0.5 的平方根。
Math.SQRT2 // 1.4142135623730951 2 的平方根。
静态方法
Math.abs():绝对值Math.ceil():向上取整Math.floor():向下取整Math.max():最大值Math.min():最小值Math.pow():幂运算Math.sqrt():平方根Math.log():自然对数Math.exp():e的指数Math.round():四舍五入Math.random():随机数
三角函数
Math.sin():返回参数的正弦(参数为弧度值)Math.cos():返回参数的余弦(参数为弧度值)Math.tan():返回参数的正切(参数为弧度值)Math.asin():返回参数的反正弦(返回值为弧度值)Math.acos():返回参数的反余弦(返回值为弧度值)Math.atan():返回参数的反正切(返回值为弧度值)