定义
栈是一种LIFO(Last-In-First-Out,后进先出)的数据格式,ECMASript为数组专门提供了push()和pop()方法,实现类似栈的行为
push 接收任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度. var shuzu=[]; shuzu.push("1","2","3");//推入多项 console.log(shuzu);//["1", "2", "3"] shuzu.push("4");//推入一项 console.log(shuzu);//["1", "2", "3", "4"] pop 从数组末尾移除最后一项,减少数组的length值,然后返回移除项 var shuzu=[]; shuzu.push("1","2","3");//推入多项 console.log(shuzu);//["1", "2", "3"] shuzu.push("4");//推入一项 console.log(shuzu);//["1", "2", "3", "4"] console.log(shuzu.pop());//推出一项,返回4 console.log(shuzu);//["1", "2", "3"]定义
队列是一种FIFO(Fisrt-in-First-Out,先进先出)数据格式.ECMASript为数组专门提供了unshift()和shift()方法,实现类似栈的行为
unshift 接收任意数量的参数,把他们逐个添加到数组首部,并返回修改后数组的长度. var shuzu1=["0"]; shuzu1.unshift("1","2","3");//推入多项 console.log(shuzu1);//["1", "2", "3", "0"] shift从数组首部移除最后一项,减少数组的length值,然后返回移除项 var shuzu1=["0"]; shuzu1.unshift("1","2","3");//推入多项 console.log(shuzu1);//["1", "2", "3", "0"] console.log(shuzu1.shift());//推出一项,返回1 console.log(shuzu1);//["2", "3", "0"]自定义排序规则
var shuzu2=[1,2,3,6,5]; shuzu2.sort((x,y)=>{ return x-y; });//自定义升排序 console.log(shuzu2);//[1, 2, 3, 5, 6] shuzu2.sort((x,y)=>{ return y-x; });//自定义升排序 console.log(shuzu2);//[6, 5, 3, 2, 1]如果参数中有负数,则相当于数组长度加上该数
var shuzu6=[4,5,7,8,6,10]; var shuzu7=shuzu6.slice(0,4); console.log(shuzu7);//[4, 5, 7, 8] var shuzu=8shuzu6.slice(0,-1);//等价于(0,4) console.log(shuzu8);//[4, 5, 7, 8]如果结束为止小于起始位置
var shuzu6=[4,5,7,8,6,10]; var shuzu9=shuzu6.slice(4,2); console.log(shuzu9);//[] splice 删除 可以删除任意数量的项,只需指定2个参数:要删除的第一项的位置和要删除的项数 var shuzu10=[4,5,7,8,6,10]; shuzu10.splice(2,1);//从下标为2的位置开始删除一项 console.log(shuzu10);//[4, 5, 8, 6, 10] 插入 可以向指定位置插入任意数量的项,只需提供3个参数:起始位置,0(要删除的项数),和要插入的项,任意数量的项数 var shuzu11=[4,5,7,8,6,10]; shuzu11.splice(2,0,"red","bule");//从下标为2的位置开始插入多项 console.log(shuzu11);//[4, 5, "red", "bule", 7, 8, 6, 10] 替换 可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定3个参数:起始位置,要删除的项数和要插入任意数量的项 var shuzu12=[4,5,7,8,6,10]; shuzu12.splice(2,2,"red","bule");//从下标为2的位置开始删除两项,并添加两项 console.log(shuzu12);//[4, 5, "red", "bule", 6, 10]第一次执行回调函数,prev是1,cur是2,第二次是3(1加2的结果),cur是3(数组的第三项).这个过程会持续到把数组中的每一项都访问一遍,最后返回结果
调用构造函数而不传递参数的情况下,新创建的对象自定获取当前日期和时间。
var now=new Date();//2020-10-24T09:04:12.399Z Date.parse 接受一个日期字符串格式,返回毫秒值,如果传入的字符串不能表示日期,会返回NaN“月/日/年”,如5/25/2004“英文月名 日,年”,如January 12,2004ISO 8601扩展格式YYYY-MM-DDTHH:mm:ss.sssZ(2004-05-25T00:00:00)接收类似new Date(年,月(0-11),日,时(0-23),分,秒,毫秒)这种写法 console.log( Date.parse("5/25/2004"));//1085414400000 console.log( Date.parse("May 25,2004"));//1085414400000 console.log( Date.parse("2004-05-25T00:00:00"));//1085414400000 console.log(new Date(2000,0,1,0,0,0));//1999-12-31T16:00:00.000Z(标准时间)其实new Date(),后台也会调用Date.parse();
var someDate=new Date(Date.parse("May 25,2004")); var someDate1=new Date("May 25,2004"); console.log(someDate)//2004-05-24T16:00:00.000Z console.log(someDate1)//2004-05-24T16:00:00.000Z Date.UTC 返回表示日期的毫秒值,参数分别是:年份,基于0的月份(一月是0,二月是1,以此类推),月中的哪一天(1到31),小时数(0到23),分钟,秒以及毫秒数. //返回的UTC是一个从标准时间1970/01/01 0点开始计算毫秒值,标准时间是 // console.log(Date.UTC(2000,1,1,0,0,0));//949334400000示例1: 北京时间2000/01/01 00:00:00,比较标准时间快8小时
北京时间的2000/01/01 00:00:00,换算成标准时间是1999/12/31 16:00:00此时的Date.parse(“2000/01/01 00:00:00”)==Date.UTC(1999,11,31,16,0,0,0)示例2: 标准时间2000/01/01 00:00:00,比北京时间慢8小时
标准时间的2000/01/01 00:00:00,换算成北京时间就是2000/01/01 08:00:0
此时Date.UTC(2000,0,1,0,0,0,0)==Date.parse(2000,1,1,8,0,0,0)
Date.now 返回调用这个方法时的日期和时间的毫秒值
console.log(Date.now())/返回此时时间的毫秒值Date类型的valueOf方法返回的不是字符串,而是返回日期的毫秒值。因此,可以方便使用比较操作符(小于或大于)来比较日期值.
示例 北京时间2000/1/1 00:00:00
console.log(new Date(2000,0,1,0,0,0).valueOf());//946656000000 console.log(Date.parse("2000/01/01 00:00:00"));//946656000000 var date1=new Date(2000,0,1,0,0,0); var date2=new Date(2000,1,1,0,0,0); var date1=new Date(2000,0,1,0,0,0); var date2=new Date(2000,1,1,0,0,0); console.log(date2>date1);//true,由于比较符会自动调用引用类型的valueOf,所以直接比较的是毫秒值示例 北京时间2000/1/1 00:00:00
var date=new Date(2000,0,1,0,0,0) console.log(date.toDateString());//Sat Jan 01 2000,格式显示星期几,月,日和年 console.log(date.toTimeString());//00:00:00 GMT+0800 (GMT+08:00),格式显示时,分,秒和时区 console.log(date.toLocaleDateString());//2000-1-1,以特定地区的格式显示星期几,月,日,年 console.log(date.toLocaleTimeString());//0:00:00,以特定地区的格式显示星期时,分,秒 console.log(date.toUTCString());//Fri, 31 Dec 1999 16:00:00 GMT,特定于实现的格式完整的UTC日期示例
//北京时间:2000-01-01T00:00:00.000Z //标准时间:1999-12-31T16:00:00.000Z
获取毫秒值 var date=new Date(2000,0,1,0,0,0); console.log(date.getTime());//946656000000,返回毫秒值,与valueOf返回值一样 console.log(new Date(date.setTime(1000)));//1970-01-01T00:00:01.000Z,返回的是以标准时间为基准的日期,会改变日期 年ps:注意点:由于new Date()返回的是标准时间格式
//获取年 var date1=new Date(2000,0,1,0,0,0); console.log(date1);//1999-12-31T16:00:00.000Z,返回标准时间日期格式 console.log(date1.getFullYear());//2000,返回北京时间,年 console.log(date1.getUTCFullYear());//1999,返回标准时间,年 //设置北京时间年 var date2=new Date(2000,0,1,0,0,0); var dt1=new Date(date2.setFullYear(2001));//设置北京时间的年为2001年 console.log(dt1);//2000-12-31T16:00:00.000Z,标准时间日期 console.log(dt1.getFullYear());//北京时间年2001 console.log(dt1.getUTCFullYear());//标准时间时间年2000 //设置标准时间年 var date3=new Date(2000,0,1,0,0,0); var dt2=new Date(date3.setUTCFullYear(2001));//设置北京时间的年为2001年 console.log(dt2);//2001-12-31T16:00:00.000Z,标准时间日期 console.log(dt2.getFullYear());//北京时间年2002 console.log(dt2.getUTCFullYear());//标准时间时间年2001 月(0-11)setUTCMonth与setMonth区别
setMonth是按照月份后,标准时间加上8小时就是北京时间格式了 var date6=new Date(2000,0,1,0,0,0); var dt3=new Date(date6.setMonth(2));//标准时间,2000-02-29T16:00:00.000Z,北京时间,2000-03-01T00:00:00.000Z, var dt4=new Date(date6.setMonth(3));//标准时间,2000-03-31T16:00:00.000Z,北京时间:2000-04-01T00:00:00.000Z setUTCMonth是按照本月的第一天+31天,设置的日期 //设置标准时间月 var date7=new Date(2000,0,1,0,0,0); //1999年的2月份是28天,所以加上31天就到了3月份的3号 var dt5=new Date(date7.setUTCMonth(1));//1999-03-03T16:00:00.000Z //1999年的4月份是30天,所以加上31天就到了5月份的1号 var dt6=new Date(date7.setUTCMonth(3));//1999-05-01T16:00:00.000Z //获取月 var date5=new Date(2000,0,1,0,0,0); console.log(date5);//1999-12-31T16:00:00.000Z,返回标准时间日期格式 console.log(date2.getMonth());//0,返回北京时间,月 console.log(date5.getUTCMonth());//11,返回标准时间,月 //设置北京时间月 var date6=new Date(2000,0,1,0,0,0); var dt3=new Date(date6.setMonth(0));//设置北京时间的月为1月 console.log(dt3);//1999-12-31T16:00:00.000Z,标准时间日期,北京时间2000-01-01T00:00:00.000Z console.log(dt3.getMonth());//0,北京时间,1月 console.log(dt3.getUTCMonth());//11,标准时间时间,12月 //设置标准时间月 var date7=new Date(2000,0,1,0,0,0); var dt4=new Date(date7.setUTCMonth(0));//设置标准时间为1月底 console.log(dt4);//1999-01-31T16:00:00.000Z,标准时间日期,北京时间1999-02-01T00:00:00.000Z console.log(dt4.getMonth());//1,北京时间,2月初 console.log(dt4.getUTCMonth());//0.标准时间月,1月底 日(1-31) //获取日 var date8=new Date(2000,0,1,0,0,0); console.log(date8);//1999-12-31T16:00:00.000Z,返回标准时间日期格式,北京时间是2000-01-01T00:00:00.000Z console.log(date8.getDate());//1,返回北京时间,1日 console.log(date8.getUTCDate());//31,返回标准时间,31日 //设置北京时间日 var date9=new Date(2000,0,1,0,0,0); var dt5=new Date(date9.setDate(15));//设置北京时间为15日 console.log(dt5);//2000-01-14T16:00:00.000Z,标准时间日期,北京时间2000-01-15T00:00:00.000Z console.log(dt5.getDate());//15,北京时间,15日 console.log(dt5.getUTCDate());//14,标准时间时间,14日 //设置标准时间日 var date10=new Date(2000,0,1,0,0,0); var dt6=new Date(date10.setUTCDate(15));//设置标准时间为15日 console.log(dt6);//1999-12-15T16:00:00.000Z,标准时间日期,北京时间1999-12-16T00:00:00.000Z console.log(dt6.getDate());//16,北京时间,16日 console.log(dt6.getUTCDate());//15.标准时间月,15日 星期(0代表星期日,(1-6)星期) //获取星期 var date11=new Date(2000,0,1,0,0,0); console.log(date11);//1999-12-31T16:00:00.000Z,返回标准时间日期格式,北京时间是2000-01-01T00:00:00.000Z console.log(date11.getDay());//6,返回北京时间,星期6 console.log(date11.getUTCDay());//5,返回标准时间,星期5 时(0-23) //获取时 var date12=new Date(2000,0,1,0,0,0); console.log(date12);//1999-12-31T16:00:00.000Z,返回标准时间日期格式,北京时间是2000-01-01T00:00:00.000Z console.log(date12.getHours());//0,返回北京时间,0时 console.log(date12.getUTCHours());//16,返回标准时间,16时 //设置北京时间时 var date13=new Date(2000,0,1,0,0,0); var dt7=new Date(date13.setHours(15));//设置北京时间为15日 console.log(dt7);//2000-01-01T07:00:00.000Z,标准时间日期,北京时间2000-01-01T15:00:00.000Z console.log(dt7.getHours());//15,北京时间,15时 console.log(dt7.getUTCHours());//7,标准时间时间,7时 //设置标准时间时 var date14=new Date(2000,0,1,0,0,0); var dt8=new Date(date14.setUTCHours(15));//设置标准时间为15日 console.log(dt8);//1999-12-31T15:00:00.000Z,标准时间日期,北京时间1999-12-31T23:00:00.000Z console.log(dt8.getHours());//23,北京时间,23时 console.log(dt8.getUTCHours());//15.标准时间月,15时 分(0-59) //获取分 var date13=new Date(2000,0,1,0,0,0); console.log(date13);//1999-12-31T16:00:00.000Z,返回标准时间日期格式,北京时间是2000-01-01T00:00:00.000Z console.log(date13.getMinutes());//0,返回北京时间,0分 console.log(date13.getUTCMinutes());//0,返回标准时间,0分 //设置北京时间分 var date14=new Date(2000,0,1,0,0,0); var dt9=new Date(date14.setMinutes(15));//设置北京时间为15分 console.log(dt9);//1999-12-31T16:15:00.000Z,标准时间日期,北京时间2000-01-01T00:15:00.000Z console.log(dt9.getMinutes());//15,北京时间,15分 console.log(dt9.getUTCMinutes());//15,标准时间时间,15分 //设置标准时间分 var date15=new Date(2000,0,1,0,0,0); var dt10=new Date(date15.setUTCMinutes(15));//设置标准时间为15日 console.log(dt10);//1999-12-31T16:15:00.000Z,标准时间日期,北京时间2000-01-01T00:15:00.000Z console.log(dt10.getMinutes());//15,北京时间,15分 console.log(dt10.getUTCMinutes());//15,北京时间,15分 秒(0-59) //获取秒 var date16=new Date(2000,0,1,0,0,0); console.log(date16);//1999-12-31T16:00:00.000Z,返回标准时间日期格式,北京时间是2000-01-01T00:00:00.000Z console.log(date16.getSeconds());//0,返回北京时间,0分 console.log(date16.getUTCSeconds());//0,返回标准时间,0分 //设置北京时间秒 var date17=new Date(2000,0,1,0,0,0); var dt11=new Date(date17.setSeconds(15));//设置北京时间为15分 console.log(dt11);//1999-12-31T16:00:15.000Z,标准时间日期,北京时间2000-01-01T00:00:15.000Z console.log(dt11.getSeconds());//15,北京时间,15秒 console.log(dt11.getUTCSeconds());//15,标准时间时间,15秒 //设置标准时间秒 var date18=new Date(2000,0,1,0,0,0); var dt12=new Date(date18.setUTCSeconds(15));//设置标准时间为15秒 console.log(dt12);//1999-12-31T16:00:15.000Z,标准时间日期,北京时间2000-01-01T00:00:15.000Z console.log(dt12.getSeconds());//15,北京时间,15秒 console.log(dt12.getUTCSeconds());//15,北京时间,15秒 毫秒(0-999) /获取毫秒 var date19=new Date(2000,0,1,0,0,0); console.log(date19);//1999-12-31T16:00:00.200Z,返回标准时间日期格式,北京时间是2000-01-01T00:00:00.200Z console.log(date19.getMilliseconds());//0,返回北京时间,0毫秒 console.log(date19.getUTCMilliseconds());//0,返回标准时间,0毫秒 //设置北京时间毫秒 var date20=new Date(2000,0,1,0,0,0); var dt13=new Date(date20.setMilliseconds(200));//设置北京时间为200毫秒 console.log(dt13);//1999-12-31T16:00:15.200Z,标准时间日期,北京时间2000-01-01T00:00:15.200Z console.log(dt13.getMilliseconds());//200,北京时间,200毫秒 console.log(dt13.getUTCMilliseconds());//200,标准时间时间,200毫秒 //设置标准时间毫秒 var date21=new Date(2000,0,1,0,0,0); var dt14=new Date(date21.setUTCMilliseconds(200));//设置标准时间为200毫秒 console.log(dt14);//1999-12-31T16:00:15.200Z,标准时间日期,北京时间2000-01-01T00:00:15.200Z console.log(dt14.getMilliseconds());//200,北京时间,200毫秒 console.log(dt14.getUTCMilliseconds());//200,北京时间,200毫秒 返回本地时间与标准时间相差分钟值 //设置标准时间毫秒 var date22=new Date(2000,0,1,0,0,0); console.log(date22.getTimezoneOffset())//-480,相差了480分钟表达式:var expression =/ pattern /flags;
g:表示全局模式,应用于所有字符串,而非在发现第一个匹配项时立即停止 var str="1at.2at5a"; var pat=/at/g console.log(str.match(pat));//[ 'at', 'at' ] i:表示不区分大小写模式 var str1="1at.2At5a"; var pat=/at/gi console.log(str1.match(pat));//[ 'at', 'At' ] m:表示多行模式,即到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项 var str1= `1at.2At5a At,s,at`; var pat2=/at/gim console.log(str1.match(pat2));//[ 'at', 'At', 'At', 'at' ]字面量模式与构造函数等价的字符串
字面量模式等价的字符串/\[bc\]/at“\\[bc\\]at”/\.at/“\\.at”/name\/age“name\\/age”全局模式 第一次匹配是从头部开始,第二次匹配从上一次lastIndex开始匹配直到下一次匹配到为止
var text ="cat,bat,sat,fat"; var pattern2=/.at/g; var matches=pattern2.exec(text); console.log(matches) console.log(matches.index)//0 console.log(matches[0])//cat console.log(pattern2.lastIndex)//3 var matches=pattern2.exec(text); console.log(matches) console.log(matches.index)//4 console.log(matches[0])//bat console.log(pattern2.lastIndex)//7 test() var text1 ="cat,baa"; var pattern3=/.at/g; console.log(pattern3.test(text1));//true console.log(pattern3.lastIndex);//3 console.log(pattern3.test(text1));//false console.log(pattern3.lastIndex);//0其余9个用于捕获组的属性,$1,$2…$9
var pattern4=/(..)or(.)/g pattern4.test(text2); console.log(RegExp.$1);//sh console.log(RegExp.$2);//tECMSCript正则表达式不支持种类
匹配字符串开始和结尾的\A和\Z锚向后查找并集合交集类原子组Unicode支持命名的捕获组s(单行)和x(无间隔)匹配模式条件匹配正则表达式注释可以把函数名想象成指针,当创建同名函数式,第二个会覆盖第一个函数
function sum(num1,num2){ return num1+num2; } function sum(num1,num2){ return num1; } console.log(sum(1,2));//1js解析器对函数声明和函数表达式并非一视同仁,解析器会率先读取函数声明,并使其在执行任何代码之前可用,(可以访问);至于函数表达式,必须等到解析器执行到它所在的代码行才会真正解释执行
函数声明
console.log(sum1(1,2));//3 function sum1(num1,num2){ return num1+num2; }函数表达式
console.log(sum1(1,2));//TypeError: sum1 is not a function var sum1=function (num1,num2){ return num1+num2; }可以使用var定义变量,变量如果没有赋值,那变量的初始值为undefined
变量作用域指变量起作用的范围。变量分为全局变量和局部变量。全局变量在全局都拥有定义;而局部变量只能在函数内有效。 在函数体内,同名的局部变量或者参数的优先级会高于全局变量。也就是说,如果函数内存在和全局变量同名的局部变量或者参数,那么全局变量将会被局部变量覆盖。 所有不使用var定义的变量都视为全局变量
JavaScript的函数作用是指在函数内声明的所有变量在函数体内始终是有定义的,也就是说变量在声明之前已经可用,所有这特性称为声明提前(hoisting),即JavaScript函数里的所有声明(只是声明,但不涉及赋值)都被提前到函数体的顶部,而变量赋值操作留在原来的位置。如下面例子: 注释:声明提前是在JavaScript引擎的预编译时进行,是在代码开始运行之前。
var scope = 'global'; function f(){ console.log(scope); var scope = 'local'; console.log(scope); }由于函数内声明提升,所以上面的代码实际上是这样的
var scope = 'global'; function f(){ var scope; //变量声明提升到函数顶部 console.log(scope); scope = 'local'; //变量初始化依然保留在原来的位置 console.log(scope); }经过这样变形之后,答案就就非常明显了。由于scope在第一个console.log(scope)语句之前就已经定义了,但是并没有赋值,因此此时scope的指是undefined.第二个console.log(scope)语句之前,scope已经完成赋值为’local’,所以输出的结果是local。
可能会有人觉得最后输出的结果是1。让我们来分析一下,这个例子涉及到了变量声明提升和函数声明提升。正如前面说到的函数声明提升,函数声明function getName(){}的声明会被提前到顶部。而函数表达式var getName = function(){}则表现出变量声明提升。因此在这种情况下,getName也是一个变量,因此这个变量的声明也将提升到底部,而变量的赋值依然保留在原来的位置。需要注意的是,函数优先,虽然函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量。因此上面的函数可以转换成下面的样子:
function getName(){ //函数声明提升到顶部 console.log(1); } var getName; //变量声明提升 getName = function(){ //变量赋值依然保留在原来的位置 console.log(2); } getName(); // 最终输出:2所以最终的输出结果是:2。在原来的例子中,函数声明虽然是在函数表达式后面,但由于函数声明提升到顶部,因此后面getName又被函数表达式的赋值操作给覆盖了,所以输出2。
场景
当我们读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。
示例
var s1=“some text”; var s2=s1.substring(2);处理流程
创建String类型的一个实例在实力上调用指定的方法销毁这个实例 var s1=new String("some text"); var s2=s1.sunstring(2); s1=null;Boolean,Number流程也是类似
如果转换成falseObject类型,与基本类型做运算falseObject&&true,是true,我们本意是false&&true得到是false,所以封装对象后的 Boolean类型会造成误导,尽量不要使用
按照指定的小数位返回数值的字符串表示,四舍五入规则
var num=10; console.log(num.toFixed(2));//10.00返回以指数表示法表示的数值的字符串形式
var num=10; console.log(num.toExponential(1));//1.0e+1可能返回固定大小格式,也可能返回指数格式,具体规则是看哪种格式最合适。
var num=99; console.log(num.toPrecision(1));//1e+2 console.log(num.toPrecision(2));//99 console.log(num.toPrecision(3));//99.0创建一个字符串的副本,删除前置及后缀的所有空格
var str=" 1234567890 "; console.log(str.trim());//1234567890使用特殊字符序列
var text ="cat, bat, sat, fat"; var result= text.replace(/(.at)/g,"ond,($1)"); console.log(result);//ond,(cat), ond,(bat), ond,(sat), ond,(fat)第二个参数也可以是一个函数
function htmlEscape(text){ return text.replace(/[<>"&]/g,function(match,pos,originalText){ switch(match){ case "<": return "<"; case ">": return ">"; case "&": return "&"; case "\"": return """; } }) } console.log(htmlEscape("<p class=\"greeting\">Hello world!</p>"));//<p class="greeting">Hello world!</p> split,可以基于指定的分隔符将一个字符串分割成多个字符串,并将结果放在一个数组中,第二个参数用于指定数组大小 var colorText="red,bule,green,yellow"; var colors1=colorText.split(","); console.log(colors1);//[ 'red', 'bule', 'green', 'yellow' ] var colors2=colorText.split(",",2); console.log(colors2);//[ 'red', 'bule' ]接收一或多个字符编码,然后转换一个字符串
console.log(String.fromCharCode(104,101,108,108,111));//hello可以看成一个javascript解析器
var msg="hello,world"; eval("console.log(msg)")//hello,world第八章详细介绍
返回大于等于0小于1的随机数
console.log(Math.random());//0.3805432775071105