JS:
1. 原始值和引用值类型及区别
19. JS中的String、Array和Math方法
Set和Map数据结构,防抖和节流
数组,3. 类数组与数组的区别与转换。4. 数组的常见API 。JS的map()和reduce()方法.16. Array.sort()方法与实现机制
数组:- 数组的存储性能比普通对象要好,开发中经常使用,来存储一些数据。数组中元素可以是任意的数据类型!
- 索引,从0开始的整数 ,就是索引!
创建数组: var arr= new Array() 。arr = new Arrar(10)。10个数组,
使用字面量来创建数组: 语法[]; var arr = []; arr=[10];创建一个数组,里面有10.
向数组添加元素: 数组[索引] = 值。arr[0] = 10;
读取数组的元素:数组[索引] 。
数组的属性:获取数组的长度length。constructor,length,prototype(原型)。
连续的数组:arr.length。可以获取数组的长度,(就是元素的个数)
非连续的数组,使用length。会是最大的索引+1。尽量不要创建非连续的数组!
修改的length大于原来的长度,多的部分会空出来。arr.length=10。
修改的length小于原来的长度,会删除多余的。修改length,修改数组。
向数组的最后一个位置添加元素。 arr[arr.length] = 70。永远在数组的最后一位添加元素。语法 a[a.length ]=
数组的方法:(方法都会有返回值。)
push。向数组的末尾添加一个或者多个元素。返回新数组的长度。 arr.push("1").
pop。删除数组的最后一个元素。 返回删除元素作为返回值返回!
unshift()。数组的开头,添加一个或者多个数组。(""),返回新数组的长度。
shift()。数组可以删除第一个元素。返回删除元素作为返回值返回。
slice(),splice()。 可以从数组中提取数据,并且作为新数组返回!slice(start,end) 包括左边,不包括右边!第二个参数可以不写,截取后面的。 splice。表示删除选中的元素,会印象到原来的数组,并且返回。替换元素。添加元素。arr.splice(3,0,"").arr.splice(0,1,"apple","caomei”)。arr.splice(1,1"arrple","caomei")。
concat: arr.concat(arr);该方法不会对原数组产生影响。不会对原来的数组产生影响。返回一个新数组。
join: 数组转化为一个字符串!方法不会对原数组产生影响,转化为字符串作为结果返回,join()可以指定一个字符串为参数,这个字符串会成为数组中元素的连接符。如果不能指定连接符,则默认使用','作为连接符。
reverse(): 会对原数组产生影响。
sort():对数组的元素进行排序。arr.sort。 按照Unicode编码进行排序。所有可能会产生错误。
我们可以指定排序的规则:元素不确定,但是在数组中a一定在b前面。!回调函数:需要两个参数。
浏览器分别使用数组中的元素作为参数调用回。如果返回是》0,交换位置,如果小于等于0,不交换位置!
读取数组,遍历数组:
1.for(let i =0; i<arr.length; i++) {console.log(arr[i] )}
function getAdult(arr) { var newArr= []; return newArr;//新数组返回!}
2.forEach()方法。
arr.forEach(); forEach()需要一个函数作为参数!(function(){})。
数组有几个元素,就会执行几次!由我们创建,但是不由我们调用,我们成为回调函数。
回调函数传递3个参数。(value,index,obj)第三个参数就是对象。
去除数组的重复数组。 var arr = [1,1,2,2] for(i ; i<len;i++) { for(j ) { arr.splic(j,1)}}
基础数据类型都是单一的值,“hello”,123,true,值和值都是没有联系的。
引用数据类型:复合的数据类型,在对象中可以 保存多个不同的数据类型的属性!
对象的分类:
1 内建对象: 在ES标准定义的对象,在任何的ES的实现都是可以使用。
Math String Number Boolean Function Object。
2 宿主对象:
JS运行环境提高的对象,目前主要是浏览器提供的对象。
比如DOM,BOM。
3 自定义对象:
由开发人员自己创建的对象。
创建对象:使用new关键字调用的函数,是构造函数constructor。
1 构造函数式专门用来创建对象的函数。 new Object()。
2 使用字面量,创建对象时,可以直接指定对象的属性。 语法:{属性名:属性值,}、属性名可以加引号,也可以不加引号。如果使用特殊的名字,则必须要引号。名和值使用:连接,多个名值之间必须要+引号!
对象中保存的值叫:属性。添加一个属性:对象.属性名 = 属性值。obj.name ="caomei"
读取对象中的属性。对象.属性名。
修改对象的属性名: 对象.属性名 = 新值。
删除对象的属性名: delete 对象.属性值。
特殊的属性名,不能采用.的方式。 使用另一种方式:语法:对象["属性名"] = 属性值。读取时候也需要采取[""]。 使用【】方式更加的灵活,obj[n],根据不同的变量值,会读取那个属性。
属性值,JS对象的属性值,可以是任意的数据类型,可以是基础数据类型,也可以是一个对象,也可是一个函数,如果是一个函数就称为方法。
in运算符:运算符在一个对象中,是否含有指定的属性,如果有返回true,没有返回false。语法: “属性名” in 对象。
for( var n in obj ) { } for in 语法,对象中有几个属性,循环会执行几次。for ( var n in obj) {console.log(n)} n就是属性的名。 属性值怎么办? for(var n in obj ) { obj[n] } []传入一个变量n。枚举对象的属性。
对象: 模板字符串 , 解构赋值, 深拷贝与浅拷贝
函数: 函数也是一个对象。函数可以封装一些代码,不同的时候使用。
创建函数:
1new Function()。new Function("")封装的代码可以字符串的形式存储在参数。
2 使用函数声明来创建对对象。命名函数。 function +函数名(){}
3 所谓的函数表表达式就是一个:匿名函数赋值给一个变量。let fun3 =function(){};
调用函数:函数中封装的代码,会按照顺序执行。
函数的参数。function sum(a,b){}。如果实参少于形参的数量,那么没有实参的形参是undefined。实参可以是任意的类型。可以传入对象,也可以传入参数!!!o。o.name,o.age,o.address。mianji() :调用函数,使用的是函数的返回值。 mianji:函数对象!
函数传入的隐藏的参数:this。隐含的参数就是this,this指向的是一个调用它对象。这个对象旧函数执行的上下文对象!
this的指向是调用它的对象,和声明this的地方没有关系!
1以函数的形式调用,this永远都是window。
2 以方法的形式调用,this就是调用方法的那个对象。
this可以根据调用者不同,调用不同调用者里面的值。更加的灵活。
函数的参数:arguments
函数的返回值。return。return可以结束整个函数。return返回的可以是任意的数据类型。可以是对象,可以是函数。里面定义一个函数,然后返回一个函数。那么就是闭包!
函数的类型:
1立即执行函数! (function(){}) 函数对象()()。函数()立刻调用!
2 构造函数(专门构造对象的)
new的原理。new 原理?如何实现一个new ? new 原理?如何实现一个new ?
new和Object.create的区别。
函数对象的方法:
构造函数的原型对象:原型和原型链。
prototype与__proto__的关系与区别
如何理解js原型链?为什么这样设计?
函数柯里化及其通用封装
1 let、const和var的概念与区别
检查变量类型: 1 typeof运算符 缺点:object不能检查出来。
变量提升与暂时性死区
变量的结构赋值
1 作用域:全局作用域。函数作用域。
作用域链。作用域链是什么时候确定的?
执行期上下文。
函数定义时会确定哪些东西?预编译阶段会发生了什么?描述一下AST?
闭包及其作用?
如何正确判断this?
bind、call、apply的区别
JS的垃圾回收机制: 1 标记清楚。2 引用计数。BOM(c++里面使用)
作用域:变量的作用范围。
JS中两种作用域: 1全局作用域: 直接写script的代码,都是全局作用域。页面打开时候创建,关闭页面销毁。 页面的任意部分都可以访问的到!
全局对象windows,代表的是浏览器的窗口。
创建的变量都是作为window对象的属性保存。
创建的函数都是作为window对象的方法保存。
变量的声明提升: var关键字声明的变量,在代码执行之前被执行,但是不会被赋值!
但是如果声明变量不适用var关键字,则不会被提前。
函数的声明提升:函数声明形式创建的函数 在所有代码之前就被声明,而且被创建!function fun(){}。 函数声明前会被调用。
但是函数表达式创建的则不行!
2函数作用域:调用函数时候,创建函数作用域。函数执行完毕,函数的作用域被销毁!
函数作用域可以访问到全局作用域变量!在全局作用域,无法访问到局部作用域。
函数作用域寻找变量,会在当前作用域找,如果找不到,如果未定义,则会到上一级。全局作用域还没有就会报错!
函数作用域,也会有变量的提前声明!
不适用var声明的变量,都会成为全局变量。 d=100。windows.d。
函数的形参相当于,局部创建变量。
c = 1 。 var c = 1 。 let c = 1 。 const c =1。
1 变量:
- 字面量: 不可以改变的值!字面量都可以直接使用。但是不太会使用字面量。数据类型,就是字面量的类型!
- 变量: 变量可以保存 字面量。 x=1234。1234是字面量。x是变量。方便使用! =就是运算符。> <。
声明变量。变量赋值。声明变量和赋值同事进行:
2 标识符: JS自主命名的都是标识符,变量名,函数名,属性名。1 不能以数字开头。2 可以有字母,数字,_,$。3 xxxYyyZzz
3 数据类型:就是字面量的类型。JS就有6中数据类型。
String,Number,Boolean,Nul(空值),undefined(未定义)。基本数据类型的数据存储在栈中,栈内存是自动分配内存的。
object。引用数据类型的数据存储在堆中,堆内存是动态分配内存的。用完对象设为null,减少无用的内存消耗!
string:
引号引起来 字符串里面\作为转义字符!\n换行,\\表示\。
输出字面量:alert("str"),输出变量:alert(str)
Number:
所有的数值都是number。包括整数和小数。
Number.MAX_VALUE 。Number.MIN_VALUE。无穷大:Infinity。负无穷:-Infinity。(typeof=Infinity返回number)
NaN:特殊数字。表示特殊数字not a Number。 typeof NaN = number
数字的运算:JS浮点数运算。 var c = 0.1+0.2。2 进制不能精确表示1/10。console.log二进制-》十进制-》字符串。取近似值。
布尔值Boolean:
逻辑判断!typeof true =="boolean"
null:类型只有一个,就是null。
null这个值专门表示一个空对象。 typeof null == ”object“
undefined: 当声明一个变量,但是不给变量赋值的时候,它的值就是undefined。
Symbol概念及其作用 ES6
JS中数据类型的存储。不同的对象都是使用二进制存储,null的二进制都是0,
a. 判断数据类型typeof、instanceof、Object.prototype.toString.call()、constructor!
b.数据类型的转化。
1 number->string: 方式调用 被转化数据类型 的toString(方法。)xxx.toString()
1 a.toString()。该方法不会影响到原变量,需要赋值。var b = a.toString()。a = a.toString();
a=null; a.toString()。 a=undefined. a.toString()。这两个没有toString,调用会报错!
2 String(a)函数; 调用string()函数,将a转化为字符串。
3 a = 1 +""。+隐式转化!
2 数据类型转换为Number():没有toNumber!
1 Number()函数: 空串转化为0。有字母转化为数字NaN。布尔转数字:true 1 false0 null0 undefien->NaN
2 专门用来对应字符串:parseInt()函数。parse解析,:把一个函数转化为Number。
parseFloat(a): 转化为浮点型。
对于非String使用parseInt(),会转化为string,然后转化。
3如果需要16进制的数字,需要0x开头!
16进制,0X。 8进制:0。2进制,需要0b开头。
parseInt(a,10);表示的 进制。
3 将其他的数据类型转化为Boolean。使用Boolean
1 调用Boolean()函数:
数字-》boolean。 0,NaN-》false。
字符串-》boolean。空串-》false。非空串都是1。
null和undefined都是false。
4 运算符:
typeof运算符,运算的值以字符串形式返回。
算数运算符:加法:
当非Number运算的时候,会转化为Number,然后进行计算!(除了+)
若对两个值会加法运算。
若对两个字符串相加,如果字符串相加会拼接。
若任何值和字符串相加,任何值都会转化为字符串,然后拼串。c=1 + ""。隐式转化,浏览器自动完成,也是调用String()
console.log("c = " +c)
减法:
b= 100-'1'。转化为Number,100-1=99。 b-0 转化为Number。隐式转化!
一元运算符:
对于非Number值,会转化为number,然后进行转化。属于隐式类型的转换。
+ - 会对其他的数据类型使用+,则会转化为number!1++“2”+3 。 1+ "2"+ 3。
自增运算符:
a++表达式的值等于,原变量的值。++a的表达式的值,则是新值。a则会立刻增加。
d= 0。d = d++。
逻辑运算符:
布尔值得逻辑运算符: ! || &&。 !取两次反。!!做两次非运算,就可以转化为布尔值。&&会返回boolean。
非布尔值的逻辑运算符:非布尔值进行 与或与那算,会先转化为布尔值,然后运算。返回原值。
&& 5&&6:都是true,返回后面的! 都是false,返回前的false。如果第一个true,则返回第二个!若为false,则直接返回。
赋值运算符: = 运算符!符号右侧的值 给符号左侧的变量。+=,-=,*=,\=
关系运算符:大小关系!关系成立,则会返回true,关系不成立返回false。 > ,<, >=,<=。 非数值的比较 1>true。true就是1.
如果两边都是字符串,二回比较字符串中的Unicode。“a”>"b" ,"1">"b" a:0061,b: 0062,nul:000
相等运算符:==两个值是否相等,
==:类型不同,则会转化为相同的类型!string -> Number。Boolean ->Number。 Null ==Undeined。
Object == String,Number,Symbol -> Object 转化为原始类型
NaN不和任何值相等,包括它本身!isNaN()函数判断是否是NaN。
!=:
===:全等。
===:类型不同,直接返回false。
!==:
条件运算符:三元运算符: 条件表达式?语句1:语句2;
先对条件表达式进行求值,如果值为true,则执行1,若为false,执行fasle。
条件表达式为非布尔值,"" ,会进行类型转化。
a >b ? alert("") :alter("");
获取a,b中的最大值。 var max = a >b ? a:b。var max = a> b? (a>c ?a:c) :(b>c? b:c)
()> 自增 -->单目运算符> +,-。
2 循环语句:
Iterator和for...of(Iterator遍历器的实现),循环语法比较及使用场景(for、forEach(数组)、for...in (对象)、for...of)
代码块:{},一个{}成为一个代码块,只有分组的作用,代码块的内容在外面是完全可以见!
条件判断语句,没有冒号,有()
if(true) alert();
while,for()
3 面向对象:
- es5几种继承方式 优缺点?es6继承?
继承的实现方式及比较
class基本语法及继承
4 EventLoop事件循环
宏任务与微任务
setTimeout用作倒计时为何会产生误差?
5 异步
12. Generator及其异步方面的应用
13. async函数
14. 几种异步方式的比较(回调、setTimeout、Promise、Generator、async)
9. Promise(手撕Promise A+规范、Promise.all、Promise相关API和方法)
- 如果要实现一个请求5s内没正常返回就返回我想要的,比如'超时',怎么用Promise实现?
- 一个异步请求,如果5s内有返回就正常返回,如果5s内没返回就输出'超时',如何用promise实现?
- promise几种状态?怎么实现promise.finally?
DOM常见的操作方式
addEventListener和onClick()的区别
DOM的location对象
currentTarget和target区别?
BOM属性对象方法
8. Proxy 创建代理。
Reflect对象
模块化:
模块加载方案比较(CommonJS和ES6的Module)
ES6模块加载与CommonJS加载的原理
JS模块包装格式有哪些?