js基础常用的函数,内置对象,语法总结

JavaScript

2021.9.9,学习JS基础做了以下总结,包含了内置对象,基础的语法

常用的js编辑工具

sublime Text , visual studio,

JS文件的引入方式

  1. 页头引入(head标签内)
  2. 页中引入(body标签内)
  3. 元素事件中引入(标签属性中引入);
  4. 引入外部JS文件

一般在body标签内容的最底部引入,如果要在前面引入则需要添加判断页面是否加载完毕在执行JS

数据结构

一般包含:标识符,关键字,常量,变量,等

数据类型

JavaScript数据类型有2大分类:一是“基本数据类型”,二是“特殊数据类型”。

基本数据类型

1.数字型(Number型):如整型84,浮点型3.14;进制数也可保存
2.字符串型(String型):如"Hele ll";
3.布尔型(Boolean型):true或false;

特殊数据类型

1.空值 (null)			赋值为null,对象为空
2.未定义值 (undefined)	声明变量未赋值,变量为空
3.转义字符
4.objectu 对象类型,应该属于 (自定义类型,类)

Number数字型三个特殊值

alert(Infinity); // Infinity 代表无穷大,大于任何数值
alert(-Infinity); // -Infinity 代表无穷小,小于任何数值
alert(NaN); // NaN  Not a number,代表一个非数值

判断变量是否非数字Number

isNaN(变量); 返回值,false是数字,true不是数字

判断变量数据类型typeof

console.log(typeof 1) // 结果 "number"
typeof(1)   // 返回的是"number"
typeof("js") // 返回的是"string"

判断是否为数组(转到 内置对象 数组对象 有写)


String转义符

(\r)回车,(\n)换行符,(\\)斜杠\,(\")引号,(\t)TAB缩进,(\b)空格 是blank的意思
var title = "标题" + "\n" + "第二行";

字符串模板

拼接字符串的方法
console.log(`小明今年${age}岁`)	//age是变量,其中`反引号是键盘上tab上方的键(英文)

数据类型转换

1.转换为字符串

var text = 123;
text.toString(); 
String(text);	 强制转换
text = text + "abc";  隐式转换,和字符串拼接后都变成字符串

2.转换为数字型(重要)

var text = "12";
parseInt(text);  转整数数字型(开头是数字就能取出)
parseFloat(text); 转浮点数字型
Number(text);	  强制转换,转数字型(不能含有字母其它符号)
text = text * 1 ; 隐式转换,利用算术运算转换为数字型(+不能转换)
let num = 10
console.log( num +  +'11')	//输出 21		+号作为正号解析可以转换成number

3.转换为布尔型

var text = "false";
Boolean(text);  转换为布尔型
-----------------------------
*代表空,否定的值 会被转换为 false,如:0、''、NaN、null、undefined
*其余值将被转换为 true, 如:1、菜鸟、abc、456

变量常量

变量

let index,mask;	//同时声明两个变量
var str = "";	//声明变量

const常量

具有块级作用域的特征,常量不可变,声明的时候必须赋值

const PI = 3.14;	//值类型的不可更改
const arr = [91,25];
arr[0] = 12;	//复杂数据类型 可以修改其中的值
arr = [12,13];	//但是不能修改整个数据,因为会改动地址

作用域

全局作用域,var是函数作用域,let是块作用域。

对象是没有作用域的,所以对象里面使用变量需要加this

说明:

在函数中声明了var,整个函数内都是有效的,比如说在for循环内定义的一个var变量,实际上其在for循环以外也是可以访问的

而let由于是块作用域,所以如果在块作用域内定义的变量,比如说在for循环内,在其外面是不可被访问的,所以for循环推荐用let

如果未声明直接使用 的变量,则会提升为全局变量

var

//var是函数作用域,在这里相当于是全局变量,当执行函数的时候,i已经变成了2,所以都是2
var arr = [];
for (var i = 0; i < 2; i++) {
    arr[i] = function () { console.log(i) };
}
arr[0]();   //调用	输出 2
arr[1]();   //调用	输出 2

let

//let是块级作用域,循环了两次,相当于创建了两个块,每个块里面i是独立的,所以不受影响
var arr = [];
for (let i = 0; i < 2; i++) {
    arr[i] = function () { console.log(i) };
}
arr[0]();   //调用	输出 0
arr[1]();   //调用	输出 1

运算符

算术运算符

运算符描述例子
+、-、*、/加、减、乘、除
%取余数(取模)返回除法的余数 9 % 2 =1;
++、–自身 递增1、递减1i++、i–、(放前面在某些时候效果不同 ++i、–i)
赋值运算符
var age = 10;
age += 5; //相等于age = age + 5;
age *= 10; //相等于age = age * 10;
age %= 5; //相等于age = age % 5; 得到0

比较运算符

比较比的是ASCII值,不要比较小数,因为有精度问题,NaN不等于本身

运算符描述例子结果
<、>、>=、<=小于,大于,大于等于,小于等于
==判断值是否相等(会转型)37==37true
!=不等于
=、!全等,值和数据类型都一致、全不相等37===“37”false

递增运算符(前置,后置 的差异)

------后置递增运算符差异: *先返回原值,后自加*
var num = 10;
alert(10 + num++);  //返回的是20
alert(num);  //返回的是11
------前置递增------------先自加,后返回
var num = 10;
alert(10 + ++num);  //返回的是21
alert(num);  //返回的是11

浮点数精度问题

var result = 0.1 + 0.2;   //结果不是0.3,而是0.30000000000000004
var result = 0.07 * 100;  //结果不是7,而是7.000000000000001
alert(result == 7) //返回 false
// 所以不能直接判断两个浮点数是否相等

逻辑运算符

常用于多个条件的判断,返回最后判断的值

let re = true && 10;	//返回的是10
let re = 0 && true;		//返回的是0
&&逻辑与,简称"与",andtrue && false //返回 false
||逻辑或,简称"或",ortrue || false //返回 true
!逻辑非,简称"非" not (取反)!true //返回 false
|| 如果第一个条件为假,则返回第二项的值,否则返回第一项的值
&& 如果第一个条件为假,则返回第一项的值,否则返回第二项的值

运算符优先级

优先级运算符顺序
1小括号()
2一元运算符i++,i–,(取反)!
3算术运算符先 *,/,%后 +,-
4关系运算符'>, >=, <, <=
5相等运算符,!=,=,!==
6逻辑运算符先 && 后 ||
7赋值运算符=

位运算符

位与 &,位或 |
位非		~	真为假,假为真
异或		^	相同为假,不同为真
有符号左移	<<,有符号右移	>>
无符号左移	<<<,无符号右移	>>>
详情:https://segmentfault.com/a/1190000013607145

判断运算符

consolo.log(obj instanceof Array); // 判断obj是不是数组
consolo.log(obj instanceof Obje); // 判断obj是不是对象
//instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上
//instanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上

流程控制 if

if else 判断语句

分支流程控制 if 判断语句

var usrAge = prompt('请输入您的年龄:');
if(usrAge >= 18){
	alert('您的年龄合法,欢迎来天际网吧享受学习的乐趣!');
} else {
	alert('您的年龄太小');
}
if (age > 18) alert("ok");	简写形式

if else if 语句(多分支)

var usrAge = prompt('请输入您的分数:');
if(usrAge >= 90){
	alert('优秀');
} else if (usrAge >= 60){
	alert('勉强及格');
}

三元表达式

表达式 ? 待选1 :待选2;

表达式 ? 表达式1 :表达式2;

var age = 60;
alert(age < 60 ? "不及格" : "及格了");
m = m || 0	//如果m是undefined就相当于是false,那么就会返回第二项,此时m=0

switch 语句

switch 表达式的值会与结构中的 case 的值做比较

如果存在匹配全等(===) ,则与该 case 关联的代码块会被执行,并在遇到 break 时停止

如果所有的值都不匹配,则执行default

注意:执行case 里面的语句时,如果没有break,则会继续往下执行

var age = 18;
switch(age) {
	case 1:
		//age=1时要执行的代码
		break; // 跳出
	case 2:
		//age=2时要执行的代码
		break;
	default:
		//表达式,不等于任何一个值时要执行的代码
}
// 如果不加 break跳出,那么当某个条件成立后,该条件后面的代码都会认为成立然后执行

if 和 switch的区别

switch…case 一般处理 值比较确定的情况

if…else 语句更灵活,常用语处理范围较大的情况

switch 条件判断后直接执行对应语句,效率更高,而if…else需要判断到满足条件的地方

1.当分支比较少时,if… else语句的执行效率比 switch语句高
2.当分支比较多时,switch语句的执行效率比较高,而且结构更清晰

if…in 的使用

var man = {name: "小明", age: 18};
if("age" in man){
	console.log("man对象中存在age属性")
} else{ //不存在该属性 }

循环

在JS中,主要有三种(for循环,while循环,do…while循环)

关键字continue,break

continue (到循环尾)跳出本次循环,继续下一次循环
break  (跳出循环)跳出整个循环,结束循环
return 返回

for循环

1.初始化变量:只执行一次,一般用于初始化一个计数变量

2.条件表达式:如果为true则继续循环,否则退出循环

3.操作表达式:每次循环都要执行的表达式,此时第一轮结束,一般用于更新或自增计数变量

for (初始变量; 条件表达式; 操作表达式) {
     //循环体
};
for (let i = 0; i < array.length; i++) {
     console.log(array[i]);
};

while循环

1.先执行条件表达式,如果为true,则执行循环体代码,如果为false,则退出循环

while(条件表达式) {
	//循环体代码
}

do…while循环

1.先执行循环体,在对条件表达式进行判断,如果为true则继续循环

do {
	//循环体代码
} while (条件表达式);

for…in循环

用于遍历对象属性 k 就是属性名,也可以遍历数组 k就是下标

for (let 变量k in 待遍历的对象) {
	//在此执行代码
}
例:
for (var k in obj) {
	console.log(obj[k]); //k是属性名,obj[k]是属性值
}

声明函数

声明函数

方式1:function 函数名(){};				命名函数
方式2:var getinfo = function(){};		  函数表达式
;(function(){})();	立即执行函数,上一行代码必须加分号;否则报错,或者加本行前面
;(function(){}());	立即执行函数
因为调用函数 函数名和括号 能换行,所以必须加分号

形参和实参

1.形参:函数定义时 传递的参数
function getinfo(形参1,形参2){};
2.实参:函数调用时,传递的参数,实参是传递给形参的
getinfo(实参1,实参2);
------------------------形参默认值------------------------
在js中,形参的默认值是undefined,也可以给定默认形参值
function getinfo(a=1,b=2){};
getinfo(undefined,b=2); //如果第一个参数要省略,需要填充undefined

函数返回值

如果函数没有 return,则返回值是undefined

arguments获取参数

当不确定有多少个参数传递时,可以用arguments获取,在js中arguments是一个内置函数,获取的结果是一个伪数组

1.具有length属性

2.按索引方式存储数据

3.不具有push,pop 等方法

function getinfo () {
	for(var i = 0; i < arguments.length; i++){
        console.log(arguments[i]);
    }
}

高阶函数=参数有函数的函数,回调函数=当做参数的函数

高阶函数=将函数当返回值返回

this

谁调用函数,this就指向谁

对象

js中对象分三种:自定义对象,内置对象,浏览器对象api

在JS中,一切皆为对象,例如 字符串,数值,数组,函数

对象就是一组无序的 相关属性和方法的集合

自定义对象

1.利用字面量创建对象

var star = {
	name: "张三",
    age: 18,
    say: function(){return "音乐唱歌";}
}
//star 也叫命名空间
//备注:类似自定义类型,也相当于一个类,也像C#中的结构
// 调用:
star.name;    //读取name
star['name']; //读取name,方式2
star.say();   //调用里面的方法

2.利用new Object创建对象

var star = new Object();
star.name = "张三";
star.age = 18;
star.say = function(){return "音乐唱歌";};
// 注意大小写,格式:对象.属性 = 值;

3.利用构造函数创建对象

构造函数约定 首字母大写,函数内的属性和方法前需添加 this,表示当前对象

构造函数中不需要 return 返回结果,创建对象时,必须用new来调用构造函数

function Getinfo(name,age){
	this.name = name;
    this.age = age;
    this.say = function(){};
}
//调用:
var bai = new Getinfo('大白',18); //返回的就是这个对象
console.log(bai.name);	//实例成员 只能通过实例化的对象来访问
//在构造函数身上添加的成员,就是静态成员
Getinfo.sex = 18;  console.log(Getinfo.sex);

删除属性

delete 对象名.属性名;
delete star.age;

遍历对象属性

利用for…in 语句可以对数组或者对象的属性进行循环操作,(在循环的章节里有)

for (let 键名 in 待遍历对象){}

内置对象

js中自带的对象,提供了一些最基本的功能

例如:Math,Date,Array,String ,Error等

MDN: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript

MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects

其它:https://segmentfault.com/a/1190000011467723

Math对象

Math不是构造函数,所以不用new,直接使用即可。具有数学常数和数学相关的运算方法(绝对值,取整,最大值)。

Math有8个常量

Math.PI // 圆周率

Math共有18个静态函数。都涉及到number隐式转换,若超出则返回NaN

Math.floor() // 向下取整
Math.ceil() // 向上取整
Math.round() // 四舍五入 就近取整 注意 -3.5 结果是 -3
Math.abs() // 绝对值
Math.max(数字1,数字2,数字3)/Math.min() //求一组数中最大和最小值
Math.max.apply(null,arr数组)	//取数组中最大值,通过apply改变this指向方法
Math.max(...arr数组)	//利用剩余参数展开数组传入max方法
Math.random() //返回0-1之间的随机数,0.93301024719719
Math.pow(x,y)	//求平方,x的y次方(次幂)
Math.sqrt(x)	//返回一个数的平方根 √ ̄
cos(x) 求余弦,sin(x) 求正弦

取指定范围内的整数随机数,包括两个数

function getRandom(min, max) {
	return Math.floor(Math.random() * (max - min + 1)) + min;
}

取随机字符串

console.log(Math.random().toString(16).slice(2)); // c21f331e6ce2b

----------------Date对象----------------

Date对象

主要用来处理日期和时间

日期时间表示:YYYY-MM-DD hh:mm:ss

静态方法

Date.now() // 返回当前13位时间戳 1630758820861
Date.parse("2021-09-04") //用于解析日期字符串,失败返回NaN
Date.UTC(年,月,日,时,分,秒,毫秒) // 年月日时作为参数,返回距1970-1-1 00:00:00的毫秒数

实例方法

Date是个构造函数,需要实例化才能使用。

//参数有多种时间格式,时间戳,字符串,多个整数
var now = new Date(); //获取客户端的当前系统时间
var now = new Date("2021-9-4"); // 创建自定义时间
console.log(now); //Sat Sep 04 2021 19:50:52 GMT+0800 (香港标准时间)
var date = new Date(yyyy, MM, dd, hh, mm, ss); //多个整数,创建自定义时间

get类方法

now.getFullYear();	//取年份
getMonth()		//取月份(0-11)
getDate()		//取日
getDay()		//取星期(0-6)(周日0-周六6)
getHours()		//取小时(0-23)
getMinutes()	//取分钟(0-59)
getSeconds()	//取秒
getMilliseconds()	//取毫秒
valueOf()/getTime()	//取13位时间戳		简写:+new Date()
Date.now();  //H5中的方法,取13位时间戳
//-----给get后加UTC则取的是世界时钟 getUTCFullYear()
//-----将get换成set则是设置时间,星期不能设置

to类方法

toString()   // Sat Sep 04 2021 20:24:04 GMT+0800 (香港标准时间)
toTimeString() //把时间部分转字符串
toDateString() //把日期部分转字符串
toLocaleString() //根据本地时间格式转字符串,2021/9/4 下午8:28:23
toLocaleTimeString() //根据本地时间格式,把时间转字符串
toLocaleDateString() //根据本地时间格式,把日期转字符串

----------------Array数组对象----------------

Array对象

创建数组的两种方式

字面量方式
var arr = []; //空数组
var arr = [1,3,6]; //创建含3个子元素的整数数组
实例化方式
var arr = new Array(); //空数组
var arr = new Array(20); //创建含20个子元素的数组

检测是否为数组

instanceof运算符,Array.isArray() H5中的方法

var arr = [1,23];
console.log(arr instanceof Array); //返回 true
console.log(Array.isArray(arr)); // 返回 true

Array属性

length	//数组长度

Array方法

Array方法分类:1.可以改变原数组,2.不能改变原数组

会修改原数组的方法

方法名称说明返回值
push(参数1…)添加新元素到数组末尾返回数组长度
unshift(参数1…)添加新元素到数组前面返回数组长度
pop()删除数组最后一个元素返回删除的元素值
shift()删除数组第一个元素返回删除的元素值
reverse()颠倒数组元素顺序返回新数组
sort()对数组元素排序,升序(细节在下方)返回新数组
splice(第几个开始,删除个数)向/数组添加/删除项目(细节在下方)返回被删的项目

不会改变原数组的方法

concat(待拼接数组2,待拼接数组3)  // 方法:连接两个或更多的数组,并返回新数组
join("分隔符")  // 将数组拼接成字符串返回,并用分隔符进行分隔,可用于取重复文本
slice(开始位置,结束位置) // 数组截取,结束位置空则到尾部,返回被截取的后的新数组
toString() // 把数组转成字符串,逗号分隔
toLocaleString()  // 把数组转换为本地字符串
valueOf() // 方法返回 Array 对象的原始值

数组索引方法

indexOf()查找给定的第一个索引存在返回索引号,不存在返回-1
lastIndexOf()在数组中的最后一个索引存在返回索引号,不存在返回-1

数组排序sort

var arr = [1,64,9,6];
arr.sort(function(a,b){
	return b-a; //降序
	// return a-b; //升序
})
//方法有一个可选参数,若未用参数,将按字母顺序对数组元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串
//如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字

//打乱数组思路
arr = arr.sort(function(a,b){ Math.random() - 0.5 });

splice方法

splice(开始位置,删除个数,要插入的数据)
var arr = ["a","b","c"];
arr.splice(0,2)  // 删除数组前2项
arr.splice(0,0,"abc") //在数组前面插入元素
//返回的是被删除的元素组成的数组
//若只有开始位置,则后面的全部删除

伪数组转真数组

var arr = Array.from(伪数组);

forEach遍历数组循环

var arr = [2, 5, 7];
arr.forEach(function (x, index, a) {
	console.log(x + "|" + index + "|" + a);
})
参数分别为:遍历的数组内容;对应的数组索引,数组本身

其它

map():映射,对数组中每一项运行给定函数,返回每次函数调用的结果组成的数组

from(伪数组,函数): 将伪数组遍历转换为真正数组

filter():“过滤”功能,数组中的每一项运行给定函数,返回满足过滤条件组成的数组
every():判断数组中每一项都是否满足条件,只有所有项都满足条件,才会返回true
some():判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回true

迭代数组 reduce() , reduceRight()

下面代码用reduce()实现数组求和,数组一开始加了一个初始值0
var arr = [2, 5, 3];
var sum = arr.reduce(function (prev, cur, index, array) { 
	return prev + cur; 
},0);
// 参数分别为:累计和,子元素,元素索引,数组本身
console.log(sum);

----------------String字符串对象----------------

String对象

字符串是不可变的,也有像数组一样的下标

属性

length  //字符串中的字符个数

常用方法

//查找文本----
index0f(待找文本,[开始查找位置]) // 寻找文本,返回找到的首次位置,找不到则返回-1
lastIndexOf(待找文本,[开始查找位置])  // 倒找文本,从后往前找
match(正则表达式或待找文本) //找到返回数组,找不到返回null
//截取文本----
substr(开始位置,[取的个数])  // 取文本中间
slice(开始位置,[end结束位置])  // 取文本中间,end不包含
substring(开始位置,[end结束位置])  // 同上
//分割文本----
split(分隔符或正则式,可选 返回数组最大长度)  // 分割文本,返回的是一个文本数组
//处理转换----
toUpperCase()  //到大写
toLowerCase()  //到小写
trim()       // 删首尾空格
//其它方法----
concat(str1,str2,,,) //连接多个字符串,等效  字符1 + 字符2
charAt(index)  // 返回指定索引的字符串
charCodeAt(index)  // 返回指定索引的字符串的ASCII码
str[index]  // 获取指定位置字符
startsWith("字符串") // 是否以指定字符串开头,返回布尔值
endsWith("字符串") // 是否以指定字符串结尾
// 替换文本
replace(被替换的文本,要替换为的文本) // 文本替换,只能替换第一个
在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串
参数1:正则表达式/字符串,必须,规定子字符串或要匹配的 RegExp 对象
参数2:replacement,必须,用于替换的字符串值
返回值:替换后的一个新字符串
var s = 'hello world hello';
console.log(s.replace('hello','hi')); //hi world hello
console.log(s.replace(/hello/,'hi')); //hi world hello
console.log(s.replace(/hello/g,'hi')); //hi world hi
如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串
//取重复文本1
var str = "a";
console.log(str.repeat(10));	//aaaaaaaaaa
//取重复文本2
function repeatStr(str,n){
	return new Array(n+1).join(str);
}
利用数组中的join连接字符串方法

模板字符串

//使用反引号定义,可以解析变量,可以执行函数,可以换行
var name = "小米"
var str = `早上好啊${name},吃饭了吗`	//
console.log(str);	//早上好啊小米,吃饭了吗

Number对象

详情地址:https://www.cnblogs.com/WindrunnerMax/p/13744845.html

它有9个属性,12个方法

Number.valueOf()	//返回原始值
Number.isNaN()		//判断是否为NaN
Number.isInteger()	//判断是否为整数
Number.parseFloat()	//转换为浮点数
Number.parseInt()	//转换为整数
Number.toString()	//转换为字符串
valueOf() //返回原始值,公共方法所有对象
var num = 1.369;	//四舍五入,返回的是字符串
num.toFixed(2) //1.37 保留两位小数
num.toPrecision(6) //保留6位数

num.toLocaleString() //Number 对象转换为本地格式的字符串

Global对象

属性

infinity	无穷大
NaN		非数字
undefined	未定义

方法

//编码转换
encodeURI(URIString);	//将字符串作为URI进行编码,和下方的编码范围不同
encodeURIComponent(URIString);	//将字符串作为URI组件进行编码
decodeURI(URIstring)	//解码
decodeURIComponent(URIstring)	//解码

isFinite(number)	//是否是无穷大
isNaN(x)	//是否非数字

Number(object)	//转换为数字
parseFloat("1.23")	//转浮点数
parseInt()	//转整数
String(obj)	//转字符串

JSON对象

对象和字符串互相转换,也可用于深拷贝对象

//字符串转成对象
JSON.parse(JSON字符串)	//返回值为 对象
//对象转成JSON字符串
JSON.stringify(对象) //返回 JSON字符串

FileReader对象

MDN: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

案例:https://www.cnblogs.com/LO-gin/p/6817319.html

标签属性  multiple 多选

属性

result	文件读取的结果存储在这里面,格式由读取方法决定

方法

abort()		中断读取
readAsBinaryString(file)	将文件读取为二进制
readAsDataURL(file)		将文件读取为DataURL,BASE64
readAsText(file,encoding编码格式默认UTF8)	将文件读取为文本

事件

onabort	中断
onerror	出错
onload	文件读取成功完成
onloadend	文件读取完成
onloadstart	读取开始
onprogress	读取中

使用方法

// 此代码用于将用户选择的文件展示在相应的位置
var file = document.querySelector('#file');
var pic = document.querySelector('#pic');
// 当用户选择文件后触发
file.onchange = function() {
    // 创建文件读取对象
    var reader = new FileReader();
    // 用户选择的文件列表 console.log(this.files);
    // 读取文件
    reader.readAsDataURL(this.files[0]); // 异步函数无法通过返回值获取结果
    // 监听onload事件
    reader.onload = function() {
        // reader.result能够获取图片显示的结果---一串路径字符串
        pic.src = reader.result;
    }

RegExp对象

RegExp也就是JS中的正则表达式对象

1.通过对象的构造函数创建

var reg = new RegExp(/表达式/, g);// 首个参数为常规字面量的构造函数
new RegExp('ab+c', 'g'); // 首个参数为字符串模式的构造函数

2.通过字面量创建

var 变量名 = /表达式/;

属性

re.lastIndex = 15;	//该索引表示从哪里开始下一个匹配

方法

test方法(检测字符串是否符合规则)

var re = /abc/;
re.test("abc123");	//只要包含abc,返回true

exec方法(匹配字符串返回结果数组)

var re = /[0-9]{4,6}/;
var str = "小艺科技,您的验证码是89216,二次63124";
arr = re.exec(str);	//只会匹配一次,如要多次需循环匹配
console.log(arr);	//["89216"]
//获取全部结果
re.lastIndex = 0
while ((arr = re.exec(str)) !== null) {
	console.log(arr.index, arr[0]);
}
// 如果匹配项就一个,可以用字符串对象的match方法(可直接获取全部字符数组)

正则表达式参数

//替换文本
//:  /表达式/switch参数:g全局匹配,i忽略大小写,m多行匹配,gi全局匹配+忽略大小写
var str = "abc123sdf";
str.replace(/123/g,"**");	//将123替换成**,g代表全部替换
//搜索文本
var n = str.search(/123/);

边界符

var re = /^abc/;	// ^ 行文本以abc开头
var re = /abc$/;	// $ 行文本以abc结尾

字符类

var re = /[abc]/;	// [] 只需包含其中任意一个字符,返回true
var re = /^[abc]$/;	// ^[]$ 只能包含其中任意一个字符,返回true,三选一
var re = /[a-z]/;	//只需包含26个英文字母中任意一个(小写)
var re = /[a-zA-Z0-9]/;	//只需包含26个英文字母中任意一个(大小写都行)或数字
. // 匹配除\n之外的任意单字符

字符类-取反

var re = /[^a-z]/;	//[^]  方括号内加^代表 不能包含a-z的字母

量词符

var re = /^[a-z]*$/;		// *   重复0次或多次
var re = /^[a-z]+$/;		// +   重复1次或多次
var re = /^[a-z]?$/;		// ?   重复0次或1次
var re = /^[a-z]{n}$/;		// {n}   重复n次
var re = /^[a-z]{n,}$/;		// {n,}  重复n次或多次
var re = /^[a-z]{n,m}$/;	// {n,m} 重复n到m次

小括号

var re = /^abc{3}$/;		// 让c重复3次
var re = /^(abc){3}$/;		// 让abc重复3次

或 |

var re = /^1[3]|[5][0-9]{9}$/; // 1开头,在跟着3或5,然后0-9的9位数字

预定义类

预定类说明
\d0-9之间任意一数字,相当于[0-9]
\D0-9之间以外的字符,相当于[^0-9]
\w匹配任意的字母,数字,下划线,相当于[A-Za-z0-9_]
\W非,字幕,数字,下划线以外的字符,相当于[^A-Za-z0-9_]
\s匹配空格(换行符,制表符,空格符),相当于[\t\r\n\v\f]
\S匹配非空格的字符,相当于[^\t\r\n\v\f]

一些表达式

var re = /^1[3|4|5|7|8][0-9]{9}$/;	//匹配手机号
var re = /[\u4e00-\u9fa5]/;	//匹配中文字符
var re = /[1-9][0-9]{4,}/;	//匹配QQ号

Window对象

window对象表示一个浏览器窗口或一个框架

属性方法事件

属性

innerheight/innerwidth	//窗口的文档显示高,宽
outerheight/outerwidth	//窗口的外部高,宽
length //设置或返回窗口中框架数量
pageXoffset/pageYoffset //页面相对窗口左上角的X,Y 位置
screenTop / screenLeft //窗口在屏幕上的坐标

方法

交互方法

window.alert('msg')		//信息框
window.confirm('msg')	//信息框,带有确认取消按钮,确认返回true
window.prompt('提示msg','默认文本')	//输入框
window.scroll(x,y) //滚动条滚动,不带单位

事件

window.load	页面加载完成事件(含图片,脚本,css等)
document.DOMContentLoaded	DOM加载完成事件(不包含图片,css,flash)
resize		调整窗口大小事件
scroll		滚动条事件

定时器

//返回的标识就是一个数字,谷歌从1开始
var timer = setTimeout(调用函数,毫秒数);	//时间到就执行,只执行一次
clearTimeout(timer);	//清除定时
var timer = setInterval(调用函数,毫秒数);	//周期执行,每隔指定时间执行一次
clearInterval(timer);	//清除定时

打开窗口

window.open(URL,name名称标记,Features,replace)	//打开一个新窗口
print()	//打印当前窗口内容
resizeBy():  按照指定的像素调整窗口的大小
resizeTo():  把窗口的大小调整到指定的宽度和高度
crollBy(x,y)	滚动条移动。会累加
scrollTo(x,y)	滚动到指定坐标
focus()		//获得焦点
blur()		//放弃焦点

location/nav/his对象

location对象

操作浏览器页面地址信息

属性

location.href	页面URL(可读写)
location.host	域名
location.port	端口号
location.pathname	路径
location.search		参数
location.hash		#后面常见于锚点链接

方法

location.assign(url)	重定向页面(也可跳转页面)
location.replace(url)	替换当前页面(不记录历史,所以不能后退)
location.reload(false)	刷新页面(如为true则强制刷新) ctrl+f5

navigator对象

包含了浏览器型号相关信息

navigator.userAgent;	//浏览器UA
// 检测浏览器类型
if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile | BlackBerry | IEMobile | MQQBrowser | JUC | Fennec | wOSBrowser | BrowserNG | WebOS | Symbian | Windows Phone)/i))) {
	window.location.href = ""; //跳转到手机地址
} else {
	window.location.href = ""; //电脑
}

history对象

浏览器访问的历史记录操作

back()		//后退
forward()	//前进
go(参数1)		//参数为1则是前进一次,-1为后退一次

screen对象

屏幕信息

screen.width //屏幕分辨率
screen.availWidth  //除任务栏的屏幕宽度

本地存储

Cookie

document.cookie = name+'='+value+';PATH=/ ; EXPIRES='+oDate.toGMTString();

window.sessionStorage

生命周期为关闭浏览器窗口后消失,同个网站共享,以键值对形式存储,最大5M

window.sessionStorage.setItem(key,value)	//存储
window.sessionStorage.getItem(key)		//获取
window.sessionStorage.removeItem(key)	//删除
window.sessionStorage.clear()		//全部删除

window.localStorage

生命周期永久有效,同个网站共享,以键值对存储,最大20M

属性

localStorage.length;	//已存储的key数量

方法

window.localStorage.setItem(key,value)	//存储
window.localStorage.getItem(key)	//获取
window.localStorage.removeItem(key)		//删除
window.localStorage.clear()		//全部删除
window.localStorage.key(n)	//取第n个键名
//枚举所有的localStorage键值对
for (var i = 0; i < localStorage.length; i++) {
	var key = localStorage.key(i);
	var value = localStorage.getItem(key);
	console.log(key, value); //键值对
}

DOM对象

文档:一个页面就是一个文档,DOM 中使用 document 表示
元素:页面中的所有标签都是元素,DOM 中使用 element 表示
节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM 中使用 node 表示

console.log(text) 打印内容
console.dir() 可以打印我们获取的元素对象,更好的查看对象里面的属性和方法
document.write() 写入文档,js代码写在哪里,则代表在哪里输出页面
document.write(`小明今年${age}岁`)	//age是变量

节点操作

节点node,概述

一般情况节点至少有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)
nodeType=1元素,nodeType=2属性,nodeType=3(文本节点包含文字、空格、换行等)
nodeName //#text=文本节点,标签返回大写标签名

获取节点

document.getElementById('id')		//通过元素ID获取
document.getElementsByTagName('标签名')	//通过标签名获取,返回数组
HTML5新增方法
document.getElementsByClassName('类名')	//通过类名获取,返回数组
document.querySelector('CSS选择器')			//通过选择器获取,返回第一个元素
document.querySelector  All('CSS选择器')		//通过选择器获取,返回伪数组
document.body		//获取body对象
document.documentElement	//获取html对象

节点层级

父节点
node.parentNode		//获取父节点,或返回null
子节点
node.childNodes	//获取子节点数组,包括元素节点,文本节点(不常用)
node.children		//获取子元素节点数组
node.firstChild	//获取第一个子节点(不常用)
node.lastChild	//获取最后一个子节点(不常用)
node.firstElementChild	//获取第一个子元素节点
node.lastElementChild	//获取最后一个子元素节点
兄弟节点
node.nextSibling	//获取当前元素下一个兄弟节点(不常用)
node.previousSibling	//获取当前元素上一个兄弟节点(不常用)
node.nextElementSibling	//获取当前元素下一个兄弟元素节点
node.previousElementSibling	//获取当前元素上一个兄弟元素节点3

创建节点

 document.createElement('标签名')	//效率低
 elm.innerHtml = html文本	//通过写内容来创建	//效率高
 document.write()	//直接写入文档,会导致重绘页面
 
 elm.insertAdjacentText(插入位置,文本)
 elm.insertAdjacentHTML(插入位置,HTML文本)
 位置参数:'beforebegin'元素自身的前面,'afterbegin'元素内部第一个子节点之前,'beforeend'元素内部最后一个子节点之后,'afterend'元素自身的后面

添加节点

node.appendChild(child)		//添加到内部子节点列表后面
node.insertBefore(child, 指定元素)		//添加到内部指定子节点前面
node.replaceChild(新节点, 要替换的旧节点);	//替换节点

删除节点

node.removeChild(child)		//删除节点内部的指定子节点,返回被删除的节点
elm.remove()	//删除自身

复制(克隆)节点

node.cloneNode(false)	//返回自身的一个副本,默认浅拷贝,true深拷贝	

元素属性

元素标签属性

改节点、主要修改元素的属性,dom元素的内容,属性表单等值

  1. 修改元素属性:src、href、title 等
  2. 修改普通元素内容:innerHTML、innerText
  3. 修改表单元素:value、type、disabled禁用元素等
  4. 修改元素样式:style、className
var elm = document.getElementById('app');
elm.style.width = "100px";	//修改元素宽度样式,(行内样式操作)
elm.className = "box";	//替换元素样式类名
element.innerHTML = "<em>abc</em>";	//修改元素HTML

自定义属性

主要用于方便存储一些临时的标记,数据等

var elm = document.getElementById('app');
elm.setAttribute('属性','值')	//设置属性
elm.getAttribute('属性')		//获取属性值
elm.removeAttribute('属性')	//移除属性
----------------------
elm.attributes	//返回所有属性的集合(数组)
elm.attributes['class'].value	//返回指定属性值,等同elm.attributes[0].value
H5新增方法--ie11+------------
elm.dataset.index = '1' 或者 element.dataset[‘index’] ='1'
//效果:<div data-index="1"></div>  会带上data-前缀 
------------------
如果属性名是data-开头,则需要全部小写
数据绑定(2021.9.8暂时未研究透)
attributes的数据会同步到property上,然而property的更改不会改变attribute

元素位置偏移属性

偏移

元素偏移量 offset 系列

1.获得元素距离带有定位父元素的位置,2.获得元素的宽高,3.得到的数据不带单位

offset可以得到确切数字。style只能得到行内样式中的,但可以修改值

element.offsetParent	获得该元素带有定位的父元素,没有则返回body
offsetTop		获得元素相对带有定位元素的上偏移,或距离文档位置
offsetLeft
offsetWidth		获得宽度(内边距padding + 边框border + 内容区content)
offsetHeight

元素可视区 client 系列

常用于获取元素的大小,页面大小

element.clientTop	元素上边框大小(只读)
clientLeft
clientWidth		元素宽度(padding+内容区)不含边框
clientHeight

元素滚动 scroll 系列

可以通过该属性知道浏览器滚动条往上滚动了多少距离,然后让侧边栏显示

element.scrollTop	元素被卷去的上侧距离(可读写)
scrollLeft
scrollWidth		元素宽度(padding+内容区+溢出区)不含边框,(只读)
scrollHeight
window.pageYOffset	页面被卷去的头部(Y轴),也可以利用元素的offsetTop得到
document.documentElement.scrollTop 页面被卷去的头部Y轴

getBoundingClientRect元素位置

var box=document.getElementById('box');         // 获取元素
alert(box.getBoundingClientRect().top);         // 元素上边距离页面上边的距离
alert(box.getBoundingClientRect().right);       // 元素右边距离页面左边的距离
alert(box.getBoundingClientRect().bottom);      // 元素下边距离页面上边的距离
alert(box.getBoundingClientRect().left);        // 元素左边距离页面左边的距离

元素样式操作

样式操作

elm.style.属性名 = 属性值
elm.style.text-align //需将-删除,把后面的a大写A
elm.style.textAlign

标签class类操作

elm.className = "box"

classList属性是H5新增的,返回元素类名,IE10+支持

elm.classList.add(class1,class2);	//添加类名或者多个
elm.classList.remove(class1,class2);	//移出一个或多个类名
elm.classList.toggle(class,true);	//切换类名:参数1 要添加或删除的类名,参2 true添加,false删除,该参数可不写则自动判断
elm.classList.contains(class1);//判断指定类名是否存在
elm.classList.item(index);	//根据索引返回类名,没有则返回null
elm.classList.length;	//数量

事件

事件源》事件类型》事件处理函数

绑定事件

1.传统注册方式		只能设置一个处理函数
var elm = document.getElementsByTagName("div")[0];
案例1:<div onclick="getinfo()">123</div>
案例2:elm.onclick = function(){代码;}
2.监听事件方式		可设置多个
格式:elm.addEventListener(type,listener,useCapture)
elm.addEventListener("click",事件处理函数,可选 是个布尔值 默认false)	//不带on
第三个参数,false=事件冒泡阶段调用,true=事件捕获阶段调用。
注意某些事件没有冒泡(onblur,onfocus,onmouseenter,onmouseleave)
elm.attachEvent("onclick",事件处理函数)	//带on,IE8独有命令

解绑事件

1.传统方式
elm.onclick = null;
2.监听方式
elm.removeEventListener("click",要解除的事件处理函数,false)
elm.datachEvent("onclick",要解除的事件处理函数)

事件对象

elm.addEventListener('click', function(event) {})
event就是事件对象,包含属性和方法
例如:
e.target	//事件触发对象
e.type		//事件类型 click
e.bubbles	//true=支持冒泡,false=该事件不冒泡
e.preventDefault()	//阻止默认行为 例不让链接跳转
e.stopPropagation()	//阻止冒泡/流动
e.clientX/e.clienty	// 相对于浏览器可视区左上角坐标
e.pageX		// 相对于document文档左上角坐标
e.offsetX/e.offsetY	//相对于元素自身左上角的位置
e.screenX	// 相对于屏幕的左上角坐标
e.key	//按下的键值,e.keyCode //按下的键的ASCII码
e.button	//鼠标按下的键,0左,1中,2右(标准浏览器),1左,4中,2右(IE)
e.altKey/e.ctrlKey/e.shiftKey //相应功能键是否按下

事件委托

事件冒泡的特性,有坏处,也有好处,需要灵活运用

<ul>
	<li>我是第1</li>
	<li>我是第2</li>
	<li>我是第3</li>
</ul>
//点击每个li都能弹出对话框,利用冒泡特性,只需要给ul注册事件即可
//然后判断事件对象,e.target.tagName = "LI"
e.target.localName = "li"

事件委托也称为事件代理,原理:给父元素设置事件监听,然后利用冒泡原理影响子元素

只操作了一次DOM,提高了代码性能

常用事件

部分事件

页面
load		//页面加载完毕事件
unload	//页面退出(关闭)事件
pageshow	//页面显示事件,给window添加
scroll	滚动条滚动触发,事件源document
部分
dblclick	//双击
change	//内容被改变
input		//文本框内容改变 实时
resize	//窗口或框架尺寸被调整
select	//文本被选定

鼠标事件

click	鼠标左键点击
dblclick	双击
mouseover	鼠标经过
mouseout	鼠标离开
mouseenter	鼠标经过(不会冒泡)
mouseleave	鼠标离开(不会冒泡)
focus	获得鼠标焦点
blur	失去鼠标焦点
mousemove	鼠标移动
mouseup	鼠标弹起
mousedown	鼠标按下
禁用鼠标右键菜单,利用菜单事件和事件对象
document.addEventListener('contextmenu', function (e) {
	e.preventDefault();
})

键盘事件

keydown		某键按下
keypress	某键按下,区分大小写(不识别功能键 ctrl,shift 箭头等)
keyup	某键弹起

移动端事件

触屏事件

touchstart		手指触摸到元素
touchmove		手指在元素上滑动
touchend		手指从元素移开

触摸事件对象TouchEvent

touches			正在触摸的所有手指列表
targetTouches	正在触摸当前元素的手指列表(重点)
changedTouches	手指状态发生了改变的列表,从无到有,从有到无变化

移动端拖动元素

  1. 触摸元素 touchstart 获取手指初始坐标,同时获取盒子原先位置
  2. 移动手指 touchmove 计算手指滑动距离,且移动盒子
  3. 离开手指 touchend
手指移动也会触发滚动屏幕,所以需要阻止默认的屏幕滚动 e.preventDefault();

click事件延时解决方案

移动端点击事件会有300ms的延时,因为有双击屏幕缩放页面的功能

1.禁用缩放,浏览器禁用默认的双击缩放行为

<meta name="viewport" content="user-scalable=no">

2.利用touch事件自己封装

1.当手指触摸屏幕,记录触摸时间
2.手指离开屏幕,用离开时间减去触摸的时间
3.如果时间小于150ms,并且没有滑动屏幕,那我们就定义为点击
//封装tap,解决click 300ms 延时
function tap(obj, callback) {
    var isMove = false;
    var startTime = 0; // 记录触摸时候的时间变量
    obj.addEventListener('touchstart', function (e) {
        startTime = Date.now(); // 记录触摸时间
    });
    obj.addEventListener('touchmove', function (e) {
        isMove = true; // 看看是否有滑动,有滑动算拖拽,不算点击
    });
    obj.addEventListener('touchend', function (e) {
        if (!isMove && (Date.now() - startTime) < 150) { // 如果手指触摸和离开时间小于150ms 算点击
            callback && callback(); // 执行回调函数
        }
        isMove = false; // 取反 重置
        startTime = 0;
    });
}
//调用
tap(div, function () { // 执行代码 });

3.使用插件,fastclick插件解决300ms延迟

fastclick插件 GitHub官网地址: https://github.com/ftlabs/fastclick

模拟触发事件

通过执行JS代码来模拟触发事件

例如,触发鼠标移入事件:
var onover = document.createEvent("MouseEvents"); //创建事件类型
onover.initMouseEvent("mouseover"); //初始化对应的事件信息
elm.dispatchEvent(onover); //触发该事件

u’, function (e) {
e.preventDefault();
})


键盘事件

keydown 某键按下
keypress 某键按下,区分大小写(不识别功能键 ctrl,shift 箭头等)
keyup 某键弹起


## 移动端事件

触屏事件

touchstart 手指触摸到元素
touchmove 手指在元素上滑动
touchend 手指从元素移开


触摸事件对象TouchEvent

touches 正在触摸的所有手指列表
targetTouches 正在触摸当前元素的手指列表(重点)
changedTouches 手指状态发生了改变的列表,从无到有,从有到无变化


移动端拖动元素

1. 触摸元素 touchstart 获取手指初始坐标,同时获取盒子原先位置
2. 移动手指 touchmove 计算手指滑动距离,且移动盒子
3. 离开手指 touchend

手指移动也会触发滚动屏幕,所以需要阻止默认的屏幕滚动 e.preventDefault();


click事件延时解决方案

移动端点击事件会有300ms的延时,因为有双击屏幕缩放页面的功能

1.禁用缩放,浏览器禁用默认的双击缩放行为

```

2.利用touch事件自己封装

1.当手指触摸屏幕,记录触摸时间
2.手指离开屏幕,用离开时间减去触摸的时间
3.如果时间小于150ms,并且没有滑动屏幕,那我们就定义为点击
//封装tap,解决click 300ms 延时
function tap(obj, callback) {
    var isMove = false;
    var startTime = 0; // 记录触摸时候的时间变量
    obj.addEventListener('touchstart', function (e) {
        startTime = Date.now(); // 记录触摸时间
    });
    obj.addEventListener('touchmove', function (e) {
        isMove = true; // 看看是否有滑动,有滑动算拖拽,不算点击
    });
    obj.addEventListener('touchend', function (e) {
        if (!isMove && (Date.now() - startTime) < 150) { // 如果手指触摸和离开时间小于150ms 算点击
            callback && callback(); // 执行回调函数
        }
        isMove = false; // 取反 重置
        startTime = 0;
    });
}
//调用
tap(div, function () { // 执行代码 });

3.使用插件,fastclick插件解决300ms延迟

fastclick插件 GitHub官网地址: https://github.com/ftlabs/fastclick

模拟触发事件

通过执行JS代码来模拟触发事件

例如,触发鼠标移入事件:
var onover = document.createEvent("MouseEvents"); //创建事件类型
onover.initMouseEvent("mouseover"); //初始化对应的事件信息
elm.dispatchEvent(onover); //触发该事件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值