当前位置: 首页 > Web前端 > JavaScript

JavaScript知识点

时间:2023-03-26 23:22:12 JavaScript

1。JavaScript简介1.1javascript的组成部分(1)ECMAScript,描述语言的语法和基本对象(2)文档对象模型(DOM),描述处理网页内容的方法和接口(3)浏览器对象模型(BOM),它描述了与浏览器交互的方法和接口。1.2javascript的特点(1)解释型语言,nodejs是它的解释器(2)弱类型语言,变量的数据类型取决于值a的数据类型。变量的数据类型在初始化时就确定了b.变量的数据类型可以随时改变c.类型细分不明显(3)按顺序解释执行,即从上到下执行(4)可以作为前端脚本语言,也可以作为后端语言,取决于应用平台和使用的框架1.3在body和head中使用JavaScript的区别(1)body部分的JavaScript会在页面加载时执行,head部分的JavaScript会在调用时执行。(2)浏览器从上到下解析Html。当JavaScript放在head时,会先解析,但是因为此时body还没有解析,所以会返回一个null值。一般会绑定一个监听器,在解析完所有html文档后执行代码。1.4JavaScript数据类型(一)5种基本数据类型(值类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、符号(es6中新增的增量,代表一个唯一值)(2)引用数据类型:对象(Object)、数组(Array)、函数(Dunction)1.5Undefined与Null的关系(1)undefined继承null,所以undefined==null为真,但Null表示空对象,undefined表示undefined(2)Null与undefined不同。null可以用来表示一个空对象,但是没有必要显式地将变量的值设置为undefined。(3)undefined===null为false,因为类型不同。1.6深拷贝实现方式(1)通过json对象(JSON.stringify,JSON.parse)实现深拷贝(2)Object.assign()拷贝(3)Lodash函数库实现深拷贝(4)递归方式实现深拷贝复制2运算符和类型转换2.1运算符2.1.1算术运算符(5种)(1)+加法(2)-减法(3)*乘法(4)/除法(5)%余数2.1.2一元运算符(8种常用used)(1)+将操作数转换为数字,字符串连接(2)-将操作数转换为数字,同时变成负数(3)!逻辑非(4)++自增(5)--自减(6)delete删除数组或对象中特定索引的值(7)typeof返回当前操作数的类型(8)voidvoid运算符返回任意值undefined2.1.3赋值运算符(6种)(1)=(2)+=(3)-=(4)*=(5)/=(6)%=2.1.4比较运算符(8种)(1)==等于(2)===值等于且类型等于(3)!=值不等于(4)!==值不等于或类型等于(5)>大于(6)<小于(7)>=大于或等于(8)<=小于或等于2.1.5逻辑运算符(1)&&和(如果相同则为真,如果为假则为假)(2)||或(仅当为真时为真,如果为假则为假)(3)!not2.2JavaScript隐式转换2.2.1原始类型转换(1)加减乘除:1.将一个数字与一个字符串相加,该数字将被转换为一个字符串。Number-by-number或string-by-string不需要转换。在加法的过程中,先对等号左右两边的原值进行ToPrimitive()操作,然后如果有两个或两个以上的原始值,只要其中一个是String类型,则两个或者更多的原始值被处理。将字符串转换为toString()操作,进行字符串拼接;否则,将两个或多个原始值转换为数字toNumber()操作进行数字加法。(2)数字减去字符串,字符串转化为数字。如果字符串不是纯数字,它将被转换为NaN。从字符串中减去数字也是如此。两个字符串相减也是先转换成数字。(3)乘、除、大于、小于、减的转换相同。(4)关于==a的隐式转换。undefined等于nullb。当比较字符串和数字时,字符串被转换为数字c。将数字与布尔值进行比较时,布尔值将转换为数字d。比较字符串和布尔值时,两者都是2.2.2引用类型的转换(1)如果PreferredType被标记为Number,将执行以下操作过程来转换输入值。A。如果输入值已经是原始值,则直接返回b。否则,如果输入值是对象,则调用对象的valueOf()方法,如果valueOf()方法的返回值是原始值,则返回原始值。C。否则,调用此对象的toString()方法。如果toString()方法返回原始值,则返回原始值。d.否则,将抛出TypeError异常。(2)如果PreferredType被标记为String,则将进行如下操作过程,将输入值a进行转换。如果输入值已经是原始值,则直接返回b。否则,将调用此对象的toString()方法,如果toString()方法返回原始值,则返回原始值。C。否则,如果输入值是对象,则调用对象的valueOf()方法,如果valueOf()方法的返回值是原始值,则返回原始值。d.否则,将抛出TypeError异常。注意:PreferredType的值将根据以下规则自动设置:如果对象是Date类型,PreferredType将设置为Stringb。否则,PreferredType会被设置为Number2.2.3冒泡排序//冒泡排序//1,比较相邻的两个元素,如果前者大于后者,则交换位置。//2。经过第一轮比较,最后一个元素就是最大的元素。//3。此时最后一个元素是最大的,所以最后一个元素不需要参与大小比较。函数bubbleSort(arr){varlen=arr.length;//外层控制循环多少次for(vari=0;iarr[j+1]){vartemp=arr[j];arr[j]=arr[j+1];arr[j+1]=温度;}}}returnarr;}//给一个数组vararr=[20,18,27,19,35];//使用函数bubbleSort(arr)2.2.4break和continue的区别(1)执行后brea,会立即跳出循环体(2)执行continue时,不会跳出循环,而是立即结束当前循环,进入下一个循环。3.函数3.1函数的作用(1)函数的封装(2)直接调用(3)提高代码重用率3.2函数声明(1)函数声明函数函数名(参数列表){//函数体}(2)functionexpressionvarfunctionname=function(formalparameterlist){//functionbody}这种形式看起来像一个普通的变量赋值,先创建一个匿名函数,然后将其赋值给变量functionname。我们知道,在JS中要想使用一个变量,首先要给变量赋值,函数表达式也不例外。在调用之前,你必须先给它赋值。否则会报错。3.3函数的内部属性(1)argumentsa.函数的参数由函数内部的类数组对象表示。这个类似数组的对象是参数。b.arguments是一个类似数组的对象,包含传递给函数的所有参数。arguments的主要目的是保存函数参数,但是这个对象还有一个属性叫callee,是指向函数c的指针。表示对当前对象的引用。A。在方法中,this表示该方法所属的对象。b.如果单独使用,则表示全局对象。C。在函数中,this代表全局对象。d.在事件中,这表示接收事件的元素。e.在显式函数绑定中,我们可以决定this指向什么。3.4IIFE自执行函数(1)IIFE:表示立即调用的函数表达式,即在声明函数时立即调用该函数(2)函数a.页面加载后只执行一次的设置函数。b.将设置函数中的变量包裹在局部范围内,不会泄漏到全局变量中。(3)函数声明和IIFE的区别在函数声明中,我们首先看到的是function关键字,而IIFE我们首先看到的是左边的(。也就是说,用一对()将函数语句括起来,让JS编译器不再认为这是一个函数声明,而是一个IIFE,也就是需要立即执行的函数,两者的目的是一样的,都是声明一个函数,然后调用函数foo.(4)IIFE的写法a.不处理返回结果(函数(形参){函数体内容})(实参);b.不处理返回结果(函数(形参){函数体内容}(实参));C。返回一个布尔值,然后取反!函数(形参){函数体内容}(实参)d.对数字返回原结果,对非数字函数(形参){函数体内容}(实参)返回NaN+e.对于数字,符号反转,对于非数字,返回NaN-函数(形参){函数体内容}(实参)f。对于数字,返回如果正负号颠倒则负1,非数字返回-1~函数(形参){函数体内容}(实参)g。返回结果为undefinedvoidfunction(形参){函数体内容}(实参)(5)案例列表-经典面试题-IIFEfor(vari=0;i<6;i++){functionoutput(){console.log(i);//为什么输出是6而不是0,1,2,3,4,5//因为输出i在全局范围内,循环结束后i的值为6,所以输出i为6。}}output()for(vari=0;i<6;i++){(function(j){console.log(j);//0,1,2,3,4,5})(i)//因为在JS中,调用函数传递的参数是按值传递的,所以当函数立即执行时,会先复制参数i的值,然后创建函数作用域来执行函数,并且5将在循环5次作用域后创建,因此每个输出在不同的作用域中访问i的值。}(6)为什么需要IIFE?IIFE的出现是为了弥补JS(ES5)在作用域方面的缺陷:JS只有全局作用域(globalscope)和函数作用域(functionscope)。从ES6开始,只有块作用域(blockscope)(7)回调函数的作用回调函数一般用在耗时操作中:因为main函数不需要等待回调函数执行完毕,它可以继续执行自己的代码。比如ajax请求,比如处理文件等等。(8)什么是闭包?闭包是指一个函数有权访问另一个函数作用域内的变量(9)闭包a的产生有3个必要条件。函数嵌套函数B.内部函数引用外部函数中的数据(属性、函数)c.参数和变量不会被回收(10)闭包的目的a.您可以读取函数b内的变量。时刻将这些变量的值保存在内存中。(11)使用闭包的缺点a.由于闭包会导致函数中的变量存放在内存中,内存消耗大,所以不能滥用闭包,否则会导致网页出现性能问题b。闭包会在父函数之外,改变父函数内部变量的值。当父对象的变量对象被修改时,所有的子函数都会受到影响。4.数组4.1数组的特点(1)每一项可以存储任意类型的数据。(2)数组的大小可以动态调整。(3)数组的length属性:可读可写,可以通过设置length的值从数组末尾移除项或向数组添加新项方括号“[]”表示元素之间用逗号分隔",vararr=[12,name,true,"larry",{},function(){},[],null];(2)通过Array构造函数创建数组varnames=newArray();varnames=newArray('terry','robin')4.3数组访问访问数组元素数组变量名[index]通过索引访问数组,数组的索引从0开始,如果索引array超出了数组的长度,未定义的值将被访问而不会出错。通过length属性获取数组的长度a)[index]直接访问,索引可以超出索引范围,但是访问的值未定义b)length-1=Max(index)c)length+N或者length-N创建一个新的删除内存空间或者数组元素4.4ArrayAPI4.4.1数组序列化(1)toString()默认以逗号分隔的字符串形式返回数组项vararr=[1,5,2,8,10,{a:1}];console.log(arr.toString());//"1,5,2,8,10,[objectObject]"(2)join()用指定字符串分隔数组stringvararr=[1,5,2,8,10,{a:1}];console.log(arr.join("-"));//"1-5-2-8-10-[objectObject]"4.4.2构造方法(1)Array.isArray()用于判断是否avariableisanarrayobject(2)Array.from()iscreatedfromanarray-likeobjectoraniterableobjectAnewarrayinstance.(3)Array.of()根据一组参数创建一个新的数组实例,支持任意数量和类型的参数4.4.3栈和队列方法(1)Array.prototype.push()push()方法可以向数组末尾添加一个或多个元素并返回新的长度。(2)Array.prototype.pop()pop()方法用于删除数组的最后一个元素,并返回删除的元素。(3)Array.prototype.shift()shift()方法用于删除数组的第一个元素,并返回第一个元素的值。(4)Array.prototype.unshift()unshift()方法向数组的开头添加一个或多个元素并返回新的长度。4.4.4排序方法(1)Array.prototype.reverse()reverse()方法用于反转数组中元素的顺序。(2)Array.prototype.sort()sort()方法用于对数组的元素进行排序。调用该方法时如果不带参数,则按字母顺序排列(Ascall编码)4.4.5操作方法(1)Array.prototype.concat()concat()方法用于连接两个或多个数组(2)Array.prototype.slice()slice()方法可以提取字符串的一部分,并将提取的字符串作为新字符串返回Part(3)Array.prototype.splice()splice()方法用于添加或删除数组中的元素。4.4.6Position方法(1)Array.prototype.indexOf()indexOf()方法可以返回指定元素在数组中的位置。(2)Array.prototype.lastIndexOf()lastIndexOf()方法可以返回指定元素在数组中的最后位置,从字符串的后面向前查找。4.4.7迭代方法(1)Array.prototype.every()every()方法用于检查数组的所有元素是否满足指定条件(由函数提供)。every()方法使用指定函数检查数组的所有元素:-如果检测到数组的一个元素不满足要求,则整个表达式返回false,并且不再检查其余元素。-如果所有元素都满足条件,则返回true。(2)Array.prototype.some()some()方法用于检查数组中的元素是否满足指定条件(由函数提供)。some()方法将依次执行数组的每个元素:-如果一个元素满足条件,则表达式返回*true*,其余元素将不会被检查。-如果没有满足条件的元素,则返回false。(3)Array.prototype.filter()filter()方法创建一个新数组,通过检查指定数组中所有满足条件的元素来检查新数组中的元素。(4)Array.prototype.map()map()方法返回一个新的数组,数组中的元素为原数组元素调用函数后处理后的值。(5)Array.prototype.forEach()forEach()方法用于调用数组的每个元素,并将元素传递给回调函数。