学习视频:https://www.bilibili.com/video/BV1YW411T7GX?p=16
参考文章:https://juejin.im/post/6844904160719011848#heading-39
js基本简介
前期为了处理网页中前端验证,优化体验,将验证放在客户端。
- 组成部分:
- 以JavaScript+JScript=>ECMAScript(ES核心)为标准文档,由浏览器厂商实现JS引擎
- DOM 文本对象模型: 如何通过js操作网页
- BOM浏览器对象模型:如何通过js操作浏览器
- JS特点:
- 解释性语言,无需编译
- 类似C和JAVA的语法结构
- 动态语言
- 基于原型的面向对象
字面量和变量
- 字面量(常量):是不可改变的值
- 变量:用于保存字面量,可以改变值。
- 声明变量:使用var来声明一个变量,var a; 为变量赋值,b=123;
- undefined:var a; 声明了一个变量,但是没有赋值。
var let const的区别
- var:声明变量
- let:ES6新增的命令,也用于声明变量
- const:
- 一旦声明必须赋值,不能使用null占位。
- 声明后不能再修改
- 如果声明的是复合类型数据,可以修改其属性
var(ES5)
let(ES6)
const(ES6)
变量提升
不存在变量提升
声明变量是全局的
仅在块级作用域内有效
可以重复声明
不能在同一块作用域内重复声明
let可以改属性
const不能改属性
参考: https://www.cnblogs.com/zhaoxiaoying/p/9031890.html
标识符
自主命名的都可以叫标识符(变量名,函数名,属性名)。
命名规则:
- 可以含字母,数字,_,$
- 不能以数字开头
- 不能是ES的关键字,保留字
- 驼峰命名
JS底层保存标识符时实际采用的Unicode(UTF-8)编码,所有的UTF-8都可以作为标识符。
数据类型(字面量的类型)
- String类型:字符串,对称引号引起来。
转义字符:常用" ' n
- Number类型:数值(Int整数和Float浮点数)
- JS中可以表达的最大值用Number.MAX_VALUE,超过最大值Infinity(正无穷),最小值-Infinity(负无穷),typeof返回number,表示大于0的最小值用MIN_VALUE。
- typeof类型检测:可以使用运算符typeof来检查一个变量的类型: typeof 变量
- NaN:一个特殊数字,Not a number,typeof NaN 返回number
- isNaN:判断b的值是否是NaN,所以可以用isNaN()函数来判断一个值是否是NaN
var b = NaN;
console.log(isNaN(b)); // 返回true
- JS进行整数基本可以保证精确,计算浮点元素可能不精确,比如(0.1+0.2),计算钱的数字放在服务器计算。
- Boolean类型:布尔值(true/false),主要用来做逻辑判断。
- Null:空值,未开辟空间。
- typeof null:返回object,机器码空指针,低三位000,也是js遗留的bug
- Undefined:开辟空间未赋值
- typeof undefined:返回undefined
- Object:对象,引用数据类型,属于一种复合的数据类型,在对象中可以保存不同类型数据的属性。
- 不足:基本数据类型都是单一的值,值之间没有关系。
- 基本类型储存在栈中,对象储存在堆中,
强制类型转换
将一个数据类型强制转换成其他的数据类型
- 将其他类型转换成String类型
- 方法一:调用被转换类型的toString()方法;
- 该方法不会影响到原变量,它会将转换的结果返回。
- 缺点:有局限性,null和undefined没有toString()方法。
- 举例:var a = 123; //number a = a.toString(); //返回string类型“123”
- 方法二:调用String()函数,并将被转换的函数作为参数传递给函数;
- 与toString()方法的区别:String()函数会将null和undefined直接转换成字符串"null"和"undefined"
- 举例:var b = 123; //number b = String(b); //返回string类型“123”
- 方法三(隐式类型):任何字符的值和字符串做加法运算,都会先转为字符串,然后做拼串,所以可以给字符加上空字符串做拼串。
- 举例:var c = 123; //number c = c + ""; //返回string类型“123”
- 将其他类型转换成Number类型
- 方法一:调用Number()函数;
- 缺点:有局限性,"123px"字符串无法转换。
- 方法二:作用于字符串;
- parseInt()函数和parseFloat()函数;
- 举例:var b = "456px"; //string b = parseInt(b); //返回Number类型“456”
- 如果对非String类型使用parseInt()函数,会将其先转为String后再操作。
- 举例:var c = true //boolean
c = parseInt(c) =parseInt("true")=NaN; //返回Number类型NaN
- 方法三(隐式类型):可以对一个其他数据类型使用 +,将其转换number,原理和Number()函数一样。
- 举例:var a = "123"; //string a = +a; //返回number类型123
var b = true; //boolean b = +b; //返回number类型1
- 将其他类型转换成Boolean类型
- 方法一:调用Boolean()函数;
除了undefined、null、false、''、0、NaN转换时false,其余都为true
- 方法二(隐式类型):可以为任意类型进行两次非运算,即可转为布尔值。同Boolean函数()。
- 举例:var a = "123"; //string a = !!a; //返回boolean类型true
对象类型转换: 默认调用{}的valueOf
运算符(也叫操作符)
可以对一个或多个值进行运算,并获取运算结果,都会返回结果,比如typeof就是运算符,可以来获得一个值的类型,它会将该值的数型以字符串的形式返回,number,。string,Boolean,undefined,object。
算数运算符
- +:会拼串
- :都会转成number
- :
- / :
- %: 求模运算,取余数。
区别:任何值做- /运算时都会将值转换成number,可以利用这个特点做隐式的类型转换,-0 /1 1将其转换为number,原理和Number()函数一样,使用起来更简单。
- result = true + 1; // 返回2 ,对非number计算时,会将值先转为number再计算
- result = true + false;// 返回1
- result = 2 + NaN; // 返回NaN,任何数和NaN进行计算,都等于NaN
- result = "123"+"456" // 返回123456,两个字符串相加,会做拼串,长字符串可以采用这种方式做拼串。
- result = "123" + 2 // 返回1232,
- result = true + "123" // 返回true123,任何字符的值和字符串做运算,都会将其先转为字符串,再做拼串
一元运算符
- :不会对数字产生影响
- :负号对数字进行取反,对非number值会将其转为number再计算,
(隐式类型转换):可以对一个其他数据类型使用+,将其转换number,原理和Number()函数一样。
自增和自减:
- 自增:在自身的基础上增加1,对于一个变量自增以后,原变量值会立即自增1,自增分为2种:后++(a++)和前++(++a),都会使原变量自增1。
区别:a++和++a的值不同,a++先赋值后运算,++a先运算后赋值。
旧值:a++等于原变量的值(自增前的值)
新值:++a的值等于新值(自增后的值)
- 自减:自减分为2种:后--(a--)和前--(--a),都会使原变量自减1。
逻辑运算符
- ! 非:取反
- 对布尔值进行取反;
- 对非布尔值取反,先转为布尔值再运算
var a = true; a = !a //返回false
var b = 10; b=!b //返回false
- (隐式类型转换):可以为任意类型进行两次非运算,即可转为布尔值。同Boolean函数()
var a = 10; a=!!a //返回true
- && 与:两端都是true,则返回true,只要有一个false,则返回false。
js中的“与”属于短路的“与”,如果第一个值为false,则不会看第2个值。
result = false && true; // false
逻辑“与”和短路“与”
- || 或:只要有一个true,则返回true。
- && 和 || 非布尔值的情况
对于非布尔值进行与或运算时,则会将其转换为布尔值,然后再运算,并且返回原值。
var result = 1 && 2 //返回2 如果两个值都为true,返回后边的
如果两个值中有false,则返回靠前的false。
赋值运算符
- = :可以将符号右侧的值赋值给符号左侧的值
- +=: a+=5 等价 a = a+5
- -=: a-=5 等价 a = a-5
- =: a=5 等价 a = a*5
- /=: a/=5 等价 a = a/5
- %=: a%=5 等价 a = a%5
关系运算符
通过关系运算符可以比较两个值之间的大小关系,如果关系成立会返回true,如果关系不成立则返回false。
大于号:判断符号左侧的值是否大于右侧的,如果关系成立返回true。
= 大于等于
- < 小于
- <= 小于等于
- 非数值情况:对非数值进行比较时,会将其转换为数字再进行比较。
- 任何值和NaN做任何比较都是false。
console.log(10 <= "hello"); //false
- 如果符号两侧的值都是字符串时,不会将其转换为数字比较,而会比较字符串中字符的Unicode编码,比较字符编码时时一位一位进行比较,比较字符串的时候要进行转型,可以对英文进行排序。
console.log("11" < "5"); //true
console.log("a" < "b"); //true
- 在字符串中使用转义字符输入Unicode编码: u四位编码 (这里编码十六进制)
- 在网页中使用Unicode编码:编码;(这里编码是十进制)
相等运算符
使用相等运算符用来比较两个值是否相等,相等返回true。
- == 相等:使用==比较两个值时,如果类型不同,则会自动进行类型转换,然后再进行比较,大部分时候转成number进行比较。
console.log(true == "1"); //true 转成number
- undefined衍生自null,所以这两个值做相等判断时,会返回true。
console.log(undefined == null); //返回true
- NaN不和任何值相等,包括他本身,所以用isNaN()
console.log(NaN == NaN); // 返回false
- 判断b的值是否是NaN,所以可以用isNaN()函数来判断一个值是否是NaN
var b = NaN;
console.log(isNaN(b)); // 返回true
- !=不相等:用来判断两个值是否不相等,不相等也会对变量进行类型转换。
- ===全等:判断两个值是否全等,不会做类型转换。
- !==不全等:用来判断两个值是否不全等,不会做自动类型转换。
条件运算符(三元运算符)
语法:条件表达式?语句1:语句2;
条件运算符在执行时,首先对条件表达式进行求值,
如果该值为true,则执行语句1,并返回执行结果
如果该值为false,则执行语句2,并返回执行结果
false?alert("语句1"):alert("语句2"): // 语句2
,运算符
, 运算符 :使用,可以分割多个语句,声明多个变量
var a = 1, b =2 , c= 3;
运算符的优先级
- 运算符优先级表:(如果优先级相同,从左往右算。)
可以通过加()改变优先级。
- 先乘除后加减
- &&的优先级大于||
var result = 1 || 2 && 3 //返回
- 如果||的优先级高,或者两个一样高,则应该返回3
- 如果与的优先级高,则应该返回1
语句 代码块
语句是由上自下的顺序一条条执行,在js中可以使用{}来为语句进行分组。
同一个{}中的语句我们称为一组语句,要么都执行,要么都不执行。
一个{}中的语句我们也称为一个代码块,在代码块后面不用再编写;了。
js在的代码块只具有分组的作用,代码块的内容在外部都是完全可见的
流程控制语句:
通过流程控制语句可以控制执行流程,
语句的分类:
- 条件判断语句 (if语句)
- 条件分支语句 (switch语句)
- 循环语句
条件判断语句 if...else...
if语句:if语句在执行时,会先对条件表达式进行求值判断,如果表达式值为true,则执行if后的语句,if语句只能控制紧随其后的那个语句。
语法一:if语句
if(条件表达式) {
语句
}
语法二:if...else...语句
if(条件表达式) {
语句...
} else {
语句...
}
语法三: if...else if... else 语句
if(条件表达式) {
语句...
} else if(条件表达式){
语句...
} else if {
语句...
}
prompt()函数:可以弹出带文本框的提示框,用户输入的内容将会作为函数返回值返回,可以定义一个变量,返回值类型是string。
冒泡排序:
条件分支语句 switch...case...
switch语句:
执行流程:switch...case...语句在执行时会依次将case后的表达式的值和switch后的条件表达式的值进行全等比较,如果比较结果为true,则从当前case处进行执行代码,当前擦色后的代码都会执行,所以要加break,确保只执行当前case语句。
语法:
switch(条件表达式) {
case 表达式:
语句...
break;
default : // 同else
语句...
break;
}
循环语句 while/do...while.../if
- while循环:
执行流程:while语句在执行时,先对条件表达式进行求职判断,如果值为true,则执行循环体,值为true,则继续循环,以此类推,如果值为false,则终止循环。
语法: while(条件表达式) {
语句... //{}里的循环体
}
像这种条件表达式写死为true的循环叫死循环,除非浏览器关闭,死循环在开发中慎用,可以使用break来终止循环。
while(true) {
语句... //{}里的循环体
if(n == 10){
break; // 退出循环
}
}
创建一个循环需要三个步骤:
- 初始化一个变量 var i = 0;
- 在循环中设置一个条件表达式
while(i < 10){
alert(i);
//3. 定义一个更新表达式,每次更新初始化变量
i++;
}
- do... while... 循环
区别: do...while先执行后判断。while是先判断后执行。do...while可以保证循环体至少执行一次,while不能,日常中while用的更多。
语法: do {
语句... //{}里的循环体
} while (条件表达式)
- for 循环:
语法: for (①初始化表达式;②条件表达式;④更新表达式) {
③语句... //{}里的循环体
}
执行顺序:①②③④ ②③④ ②③④
for、forEach 、for in、for of 循环的区别
相同点:都可以遍历数组;
区别:
- for:缺点:不能直接遍历对象。
- forEach():缺点:不能直接遍历对象,循环不能跳出。
- for...in:优点:可以直接遍历对象,缺点:消耗性能;保存的是键名,返回 0 1 2 3
- for...of【最优】:可遍历array,object,string,map,set等,可以跳出循环;保存的是键值,返回 arr1 arr2 arr3
缺点:不适用于处理原有的原生对象。
参考: https://blog.csdn.net/wjx666666/article/details/104940660
break和continue
break:
- break可以用来退出switch或循环语句,不能在if语句中使用break和continue
- break默认只对离他最近的循环产生影响。
- 可以为循环语句创建一个label,来标识当前的循环,break后加上label名称即可结束指定的循环,而不是默认的。
continue:
- continue跳过当次循环,但是继续后面的循环。
- continue默认只对离他最近的循环产生影响。
区别:
- break终止整个循环(跳过整个循环);
- continue用来跳过当次循环(只跳过一次);
优点:
优化性能,可以使用计时器console.time("test")和console.timeEnd("test");检测耗时。
质数练习题优化:
对象(引用数据类型)
基本数据类型的缺点:值和值之间没有任何联系。
对象:复合数据类型,在对象中可以保存多个不同数据类型的属性。(容器)
优点:关系明确,操作方便。
对象的分类:
- 内建对象
由ES标准中定义的对象,在任何的ES的实现中都可以使用
比如:Math String Number Boolean Function Object ...
- 宿主对象
由JS的运行环境提供的对象,目前主要指浏览器提供的对象。
比如:BOM DOM
比如:console.log(); document.write();
- 自定义对象
创建对象:使用new关键字调用的函数,是构造函数constructor,构造函数是专门用来创建对象的函数,赋值给obj。
使用typeof检查对象时返回object。
属性值:js对象的属性值,可以是任意的数据类型。
in运算符:通过该运算符可以检测一个对象中是否含有指定的属性。
语法:"属性名" in 对象
console.log("name" in obj) //返回true或false
基本数据类型和引用数据类型的区别:
- js的变量都是保存在栈内存中的,基本类型的值直接在栈内存中存储,值与值之间是独立存在的,修改一个变量不会影响其他的变量
- 对象储存在堆内存中,每创建一个新的对象,就会在堆内存中开辟一个新的空间,二变量保存的是对象的内存地址(对象的地址),如果两个变量保存的是同一个对象引用,当一个通过一个变量修改属性时,另一个也会受到影响。
- 基本数据类型保存的是值,对象保存的是地址。
- 当比较两个基本数据类型的值时,就是比较两个值。
- 而比较两个引用类型时,它是比较两个对象的内存地址,就算两个对象是一模一样的,但是地址不同,他也会返回false。
对象字面量
- 用构造函数创建一个对象:
var obj = new Object();
- 用对象字面量来创建一个对象,本质相同。
var obj = {};
语法:{属性名:属性值,属性名:属性值...}
属性名的双引号可加可不加,如果使用一些特殊名称必须加引号。
属性名和属性值是一组组的名值对结构,名和值之间使用:连接,多个名值对之间用,隔开,如果一个属性之后没有其他属性,就不要写逗号。
函数
函数也是一个对象,函数中可以封装一些功能(代码),在需要时可以执行这些功能。
用typeof检测一个函数对象是,会返回function。
创建函数
- 使用构造函数来创建一个函数对象(基本不用)
创建一个函数对象,可以将要封装的函数以字符串的形式传递给构造函数,我们在实际开发中很少使用构造函数来创建一个函数对象
var fun = new Function ("string");
- 使用 函数声明 来创建一个函数
- 封装到函数中的代码不会立即执行
- 函数中的代码会在函数调用时执行
- 调用函数语法: 函数对象()
- 当调用函数时,函数中封装的代码会按照顺序执行
语法: function 函数名([形参1,形参2,形参3]){
语句...
}
- 使用 函数表达式 来创建函数
语法:var 函数名 = function (形参1,形参2,形参3) {
语句...
}
函数的参数(形参和实参)
定义一个用来求和的函数,可以在函数中的()中来指定一个或多个形参(形式参数),声明形参就相当于在函数内部声明了对应的变量,但是并不赋值。
调用函数时解析器不会检查实参类型,也不会检查实参数量,多余实参不会被复制,少于实参数量时,没有对应实参的形参将是undefined。
函数的返回值 return
- return语法: return 值
- return后的语句都不会执行,如果return后不跟值,返回undefined,不写return,也会返回undefined
- 函数也可以是对象,将匿名函数做为实参传递给函数:
- 返回值和函数对象:
- // getArea() 调用函数 相当于使用的函数的返回值
- // getArea 函数对象 相当于直接使用函数对象
brack、continue和return的区别
立即执行函数
立即执行函数只会执行一次。
只调用一次,用()扩起来一个匿名函数标识他是一个整体,函数对象();
方法
- 对象的属性值可以是任何数据类型,也可以是函数
- 函数作为对象的属性时,我们称这个函数是这个对象的方法
枚举对象中的属性 for...in遍历
- 对象中有几个属性,循环体就执行几次
- 执行时会将对象的属性名赋值给变量
全局作用域/函数作用域
作用域指一个变量作用的范围
1. 全局作用域:
- 直接写在script标签的都在全局作用域 。
- 在页面打开时创建,在页面关闭时销毁。
- 在全局作用域中有一个全局对象window,由浏览器创建,可以直接使用,创建的变量都会作为window对象的属性保存【var window.a = 10; window.alert(); 】;
变量提升
参考:https://www.w3school.com.cn/js/js_hoisting.asp
使用var关键字声明的变量,会在所有代码执行之前被声明,不用var时不会被声明提前。
函数提升
- 函数提升:function 函数(){},最先被创建,可以提前
- 函数表达式不提升:不能在声明前调用
2. 函数(局部)作用域:
- 调用函数时创建函数作用域,函数执行完后作用域销毁。
- 每调用一次创建一个新函数作用域,他们之间是互相独立的。
- 局部可以访问到全局的变量,全局不能访问局部变量。
- 局部会先在自身作用域寻找变量,就近原则。
debug
this
含义:解析器在调用函数时,每次都会向函数内部传递一个隐含的参数,这个隐含的参数就是this,this是浏览器传进来的参数,this指向的是一个对象,这个对象我们称为函数执行的上下文对象。
- 普通函数中 this 的指向,是 this 执行时的上下文
- 箭头函数中 this 的指向,是 this 定义时的上下文
ES5三种函数调用方式:
- fun(a,b);
- obj.child.method(a,b);
- fun.call(context,a,b); //指向context,默认undefined(指向window),
this的5种绑定
- 默认绑定(非严格模式下this指向全局对象, 严格模式下this会绑定到undefined)
- 隐式绑定(当函数引用有上下文对象时, 如 obj.foo()的调用方式, foo内的this指向obj)
- 显示绑定(通过call()或者apply()方法直接指定this的绑定对象, 如foo.call(obj))
- new绑定
- 箭头函数绑定(this的指向由外层作用域决定的)
参考:
https://zhuanlan.zhihu.com/p/23804247
https://www.w3school.com.cn/js/js_this.asp
创建对象
使用工厂模式创建对象
使用构造函数创建对象
构造函数:
- 创建一个构造函数,用来创建Person对象,首字母大写
- 和普通函数的区别:普通函数直接调用,构造函数需要使用new关键字调用
- 执行流程:
- 创建一个新对象
- 将新建的对象设置为函数中的this,在构造函数中实体this引用新对象
- 逐行执行函数中的代码
- 将新建对象作为返回值返回
原型对象
原型对象prototype
原型对象:prototype
隐含属性:__proto__
- 当函数以构造函数的形式调用时,它所创建的实例对象都会有一个隐含的属性__proto__,指向该构造函数的原型对象,通过__proto__访问该属性;
- 原型对象相当于一个公共区域,同一个类的实例都可以访问到这个原型,我们可以将对象公共内容统一设置到原型对象中;
- 我们访问对象的一个属性或方法时,会先在自身找, 自身没有则访问原型对象;
- 优点:不会污染全局作用域
向原型对象中添加方法
实例:
检查属性in和hasOwnProperty
原型的toString()方法
原型链
原型链是利用原型,让一个引用类型继承另一个 引用类型的属性和方法。
实例的contructor = 构造函数
垃圾回收(GC)
垃圾回收:
- 当一个对象没有任何的变量或属性对它引用,我们无法操作该对象。
- js具有自动垃圾回收机制,会自动将垃圾对象从内存中销毁。
- 我们将不再使用的对象设置为null即可。
数组Array
数组简介
- 数组也是一个对象,与普通对象功能类似,作用存值。
- arr[index]:数组[索引],索引从0开始。
arr.length:数组.length可以获取数组的长度(元素的个数)。
- 向数组最后一个位置添加元素:arr[arr.length] = 70; // 数组[数组.length] = 值
数组的常见方法(2)
数组遍历
for循环遍历
实例:将年纪满18的提取出来
forEach()遍历
回调函数: forEach()方法需要一个函数作为参数,像这种函数,由我们创建但不由我们调用的称为回调函数。
缺点:不兼容IE8及以下
slice()
slice(开始位置索引,结束位置索引):slice从第a个截到第b个
splice()
- splice(开始位置索引,删除的数量,传递新元素) : splice从第a个删除b个;
- splice还可以再添加元素
splice数组去重
call() 和 apply()
相同:
- 都会调用函数执行
- call()和apply()可以将一个对象指定为第一个参数
- 此时这个对象将会成为函数执行时的this,参数是谁this就是谁
- 可以修改上下文对象this
不同:
- call()可以将实参在对象之后依次传递
- apply()需要将实参封装到一个数组中统一传递
this:
- 以函数的形式调用,this指向window
- 以方法的形式调用,this是调用方法的对象
- 以构造函数的形式调用,this是新创建的对象
- 以call和apply调用,this是指定的对象
arguments【类数组对象】
在调用函数时,浏览器每次都会传递进两个隐含的参数:
- 函数的上下文对象this
- 封装实参的对象arguments
- arguments是一个类数组对象,也可以通过索引来操作数组
Date【时间】
获取时间和获取时间戳:
Math【数学运算】
参考:https://www.w3school.com.cn/js/js_math.asp
Math:属于工具类,封装了数学运算相关的属性和方法
包装类
包装类:可以临时将基本数据类型转为对象,浏览器底层自己用的
字符串相关方法
参考: https://www.w3school.com.cn/js/js_string_methods.asp
- 检索字符串
- 截取字符串
- 转为大小写
DOM(文档对象模型)
- Document Object Model:文档对象模型,用来操作网页的
Node:节点,构成网络的任何部分都是一个节点,类型不同。
- 文档节点:<html></html>
- 元素节点:<p></p>
- 属性节点:id="box"
- 文本节点:文字~
获取元素节点:
- getElementById():通过id获取一个元素节点对象
- getElementsByTagName():通过标签名获取一组元素节点对象
- getElementsByName():通过name属性获取一组元素节点对象,表单常用
- 事件:用户和浏览器的交互行为,比如点击按钮、鼠标移动、关闭按钮;所有的操作都属于事件,处理事件:
Dom事件: https://www.w3school.com.cn/js/js_htmldom_events.asp
文档的加载 window.onload
dom查询的其他方法
dom增删改
dom方法: https://www.w3school.com.cn/htmldom/dom_methods.asp
增删改demo1:
增删改demo2:
修改class
json
前端html写的 后端java写的
obj = {} : js对象 只有js认识
需要将js对象传给服务器 转为json
将json转为字符串 任何语言都认识
json的作用:交互传递数据,字符串,使不同语言都可以使用
json属性名必须加双引号。其他和js一致
json分类:
1. 对象: json对象
2. 数组: json数组
json只允许传递: 字符串,数值,布尔,null,普通对象,数组
键值对
json数组:保存多个json对象。
需要将字符串转为js对象
数据交换格式 轻量级数据格式
- JSON.parse():将json转为js对象
- JSON.stringify():将js对象转为json
IE7 JSON
兼容IE7以下,eval():可以用来执行一段字符串形式的js代码,并将返回,性能差不建议使用。
事件冒泡
事件冒泡(Bubble)
事件冒泡指事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同事件也会被触发。
取消冒泡:将事件对象的cancelBubble设置为true。
事件委派
js报错整理
https://blog.csdn.net/weixin_39843414/article/details/109108391
- Error:基本错误类型,一般是程序员抛出的异常
- SyntaxError :语法错误,解析错误
- TypeError :类型错误
- ReferenceError :引用错误
- RangeError :边界错误
- URIError:url错误
- 自定义异常
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。