线程机制和事件机制
应用程序必须运行在某个进程的某个线程上
一个进程中至少有一个运行的线程: 主线程, 进程启动后自动创建
一个进程中也可以同时运行多个线程, 我们会说程序是多线程运行的
一个进程内的数据可以供其中的多个线程直接共享
多个进程之间的数据是不能直接共享的
线程池(thread pool): 保存多个线程对象的容器, 实现线程对象的反复利用
执行流程
执行初始化代码, 将事件回调函数交给浏览器对应模块管理
当事件发生时, 管理模块会将回调函数及其数据添加到回调列队中
只有当初始化代码执行完后(可能要一定时间), 才会遍历读取回调队列中的回调函数执行
内建对象
Date
var d = new Date();
//年份全都写四位,避免歧义
//字符串格式:月份/日/年份 时:分:秒
var d2 = new Date("11/23/2003 14:20:00");
方法
getDate()
获取当前时间对应的几号
getDay()
获取日期对应的周几
- 0 表示 周日
- 1 表示周一
getMonth()
获取对应的月份
- 0 表示 一月
- 1 表示二月
getFullYear()
获取对应的年份
getTime()
获取对应的时间戳
Date.now()
获取当前时间戳
Math
Math.abs()
取绝对值
Math.ceil()
向上取整,小数点后的值都向上进
Math.floor()
向下取整
Math.round()
四舍五入
Math.random()
获取0-1之间的随机数
//生成 0 - x 之间的随机数
Math.round(Math.random()*x)
//生产一个 x - y之间的随机数
Math.round(Math.random()*(y-x) + x)
Math.max()
获取多个值中的最大值
Math.min()
获取多个值中的最小值
Math.sqrt()
对一个数进行开方运算
Math.pow(x,y)
求x的y次幂
String
属性
length
方法
charAt()
根据索引获取指定位置的字符
charCodeAt()
根据索引获取指定位置的字符的字符编码
fromCharCode()
根据字符编码获取字符
indexOf() / lastIndexOf()
查找指定内容在字符串中的位置
如果找到了,则返回第一次出现的索引,如果没找到则返回-1
indexOf是从前往后找,而lastIndexOf是从后往前找
参数
第一个:查找的内容string类型
第二个:查找的开始位置
slice()
截取一个字符串
参数:
第一个:截取开始位置的索引(包括开始位置)
第二个:截取结束位置的索引(不包括结束位置)
索引可以是负值,如果是负值则从后往前计算
第二参数可以省略,如果不写则一直截取到最后
substring()
可以用来截取一个字符串
参数:
第一个:截取开始位置的索引(包括开始位置)
第二个:截取结束位置的索引(不包括结束位置)
索引值不能为负,如果为负,则默认使用0
如果第一个参数大于第二个,则自动交换位置
第二参数可以省略,如果不写则一直截取到最后
substr()
可以用来截取字符串
参数:
第一个:截取开始位置的索引(包括开始位置)
第二个:截取的个数
索引可以是负值,如果是负值则从后往前计算
第二参数可以省略,如果不写则一直截取到最后
toLowerCase()
把字符串转换为小写
toUpperCase()
把字符串转换为大写
match()
从一个字符串中将符合要求的内容提取出来
需要一个正则表达式作为参数,将会根据该正则表达式去字符串中提取内容
将其提取到的内容,封装到一个数组中返回
search()
去一个字符串中搜索指定的内容
如果找到了,则返回内容第一次出现的索引,如果没找到则返回-1
需要一个正则表达式或字符串作为参数,会去字符串中搜索对应的内容
split()
根据指定的内容将一个字符串拆分为一个数组
- 需要一个字符串或正则表达式作为参数,将会根据该内容对字符串进行拆分
replace()
将字符串中的指定内容替换为新的内容
参数:
第一个参数,被替换的内容或正则表达式
第二个参数,新的内容
包装类
String()
Boolean()
Number()
当我们去使用一个基本数据类型的属性,或是调用一个基本数据类型的方法时
JS解析器会临时将基本数据类型包装为一个对象,然后去操作这个对象的属性或方法
操作完成以后将对象立即销毁
FileReader 文件读取
var fileReader = new FileReader();
fileReader.readAsDataURL(obj);
读取图片文件
fileReader.readAsText(obj);
读取文本文件
fileReader.onload 事件
input选取文件读取
<!--multiple = multiple 设置之后可以选择多个文件-->
<input id="readFile" type="file" multiple = multiple>
<script type="text/javascript">
var readFileDom = document.querySelector("#readFile");
var bodyDom = document.querySelector("body");
//监听input的onchange事件
readFileDom.onchange = function (ev) {
//获取到选取的所有文件
var filesArr = ev.target.files;
//遍历所有文件
for (var i = 0; i < filesArr.length; i++) {
var obj = filesArr[i];
//文件类型判断
if (obj.type.indexOf("image")>-1) {
setimg();
}
}
function setimg() {
//注意fileReader变量作用域问题,提取到一个函数中,保证不会被覆盖
var fileReader = new FileReader();
fileReader.readAsDataURL(obj);
fileReader.onload = function (ev) {
var imgDom = document.createElement("img");
imgDom.src = fileReader.result;
bodyDom.appendChild(imgDom);
}
}
}
Array数组
var arr = new Array();
var arr =[1,"你好",true,[1,3,2],obj ];
可保存任意类型的对象,也可以是数组
方法
添加元素
push()
-
该方法可以用来向数组的末尾添加新的元素,并返回数组的新的长度
var result = arr.push("唐僧","白骨精","蜘蛛精");
unshift()
-
向数组的最前边添加元素,并返回新的长度
result = arr.unshift("牛魔王","铁扇公主");
删除元素
pop()
用来删除并返回数组的最后一个元素
-
元素删除以后,会自动修正数组的长度
result = arr.pop();
shift()
删除数组最前边的元素,并返回被删除的元素
-
删除完元素以后,会自动调整数组的长度
result = arr.shift();
修改元素
splice()
####### 删除指定位置的元素,并添加新元素
- 它会影响到原数组,一旦执行原数组中的元素将会被删除
- 参数:
第一个参数,开始位置的索引
第二个参数,表示删除的个数
第三个参数,这个方法还可以传递多个参数
在第三个参数以后,可以跟多个元素作为参数,
这些元素将会被插入到开始位置之前的位置
-
它会将被删除的元素作为返回值返回
arr = ["孙悟空","猪八戒","沙和尚","唐僧"]; result = arr.splice(0,1); //牛魔王替换 索引为0的元素 result = arr.splice(0,1,"牛魔王"); arr.splice(2,2,"牛魔王","红孩儿","二郎神");
截取元素
slice(起始位置,结束位置)
- 参数:
- 第一个参数,截取开始的位置(包括开始的位置)
- 第二个参数,截取结束的位置(不包括结束的位置)
- 该方法不会影响到原数组,而是将截取到的内容封装为一个新的数组返回
- 可以传递一个负数作为参数,如果是负数,则从后往前数
- -1 表示 倒数第一
- -2 表示 倒数第二
- 如果省略第二个参数,则从开始位置一直截取到最后
遍历数组
通过for方法每个获取并取值
通过forEach()方法
需要一个函数作为参数来接收遍历的元素,索引,数组对象
forEach()方法不支持IE8及以下的浏览器,所以如果需要兼容IE8则不要使用
- forEach()中的回调函数,由浏览器调用,
数组中有几个元素函数就会被调用几次,
每次遍历到一个元素都会调用一次函数,浏览器会通过实参的形式来将遍历到内容传递进函数
浏览器在调用回调函数传递了三个实参:
第一个参数:正在遍历的元素
第二个参数:正在遍历的元素的索引
-
第三个参数:正在遍历的数组对象
arr.forEach(function(value , index , obj){ console.log("value = "+value + " index = "+index+" obj = "+obj); });
正则表达式
创建
var reg = new RegExp("正则表达式","匹配模式");
var reg = /正则表达式/匹配模式;
表达规则
方法
test()
检测一个字符串,返回true/false
var rgb = /[a-z0-9]/;
console.log(rgb.test("a-c-"));
匹配模式
i
忽略大小写
g
全局检查
语法
| 表示或 (a|b)
[] 表示或 [ab] a[bcd]g
[^ ] 除了
[a-z] 小写字母
[A-z] 任意字母
[0-9] 任意数字
{n} 正好n次
{m,n} m-n次
{m,} 至少m次
+ 至少一次,相当于{1,}
* 任意次,相当于{0,}
? 0到1次,相当于{0,1}
^ 表示开头
$ 表示结尾
. 表示任意字符
\ 转义字符
\. 表示.
\\ 表示\
\w 任意的字母、数字、下划线 [A-z0-9_]
\W 除了字母、数字、下划线 [^A-z0-9_]
\d 任意的数字
\D 除了数字
\s 空格
\S 除了空格
\b 单词边界
\B 除了单词边界
var reg = /\bchild\b/;
reg.test("lalalchildllall");false
reg.test("child lalal");true
//去除前后多余的空格
var reg = /^\s* | \s*$/g;
var str = " na me ";
var newStr = str.replace(reg,"");
//
字符串定义的时候
检查字符串是否有\
var reg = new RegExp("\\\\");
var reg = /\\/;
console.log(reg.test("lalal\lalal"));
\在字符串中也是转义字符
var reg = new RegExp("^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$");