引用类型是一种数据结构,是引用类型的实例,也可以称为类似于类的"对象定义"。
Object类型:
创建一个实例:
var person=new Object();
var person={}
上面这两个是相等的
属性和方法赋值:
> var person=new Object();
> person.name="simalinjia";
> person.age=29;
or
var person={
name:"simalinjia",
age:29
}
上面这种方法是字面量对象表示法!!!
表示一个带属性的对象:
{name:“simalinjia”,age:29}
获取属性的方法是有两种,一种是[],一种是点语法
person['name'];//可以解决name中出现空格这种情况无法调用的问题等
person.name//极力推荐
Array数组类型:
数组里面的元素的数据类型可以不一样!!!
创建数组对象:
var arr=new Array();//new关键字是可以省略的;
or
var arr=[];
其中:
var arr=new Array(3);
的意思是里面只允许有3个元素
var arr=new Array(“blue”);
的意思是里面只有一个元素的字符串数组
var arr=[];是字面量表示法
错误写法:
var arr=[, , , , , ];或者是var arr=[1,2,];
获取元素的方法:arr[0];
arr.length:这是获取数组长度的方法!!!
arr.length=2;这是给数组赋值长度的方法!!!
检测这个值是不是数组:
Array.isArray(val);
自带方法:
toLocalString();
toString();//调用这个方法,会返回一个元素加逗号的字符串
value();//调用这个返回的仍然是数组
join();括号里面的参数,是返回的字符串以何种形式拼接的。
如果数组中有一项是null,那么用上述方法返回的都是一条空字符串!!!
栈方法:
什么是栈,这种内存管理形式就是后进先出的原则!!!数组有类似栈的方法,push()和pop(),不管你是插入(增加)还是弹出(删除),都是在顶上进行的!
push()//方法返回的是增加后的数量
pop()//方法返回的是增加后的数量
堆方法:
队列,就是先进先出
arr.shift();//移除第一项,并返回第一项
arr.unshift();//添加第一项,并返回数组长度
arr.unshift()配合arr.pop(),能达到添加第一项,删除最后一项的效果!!!
排序方法:
reverse();//反顺序
sort();//将数组每一项先toString(),转化成字符串,然后在比较,小的排在第一项,依次往下排!!!
sort()参数,建议是放一个比较函数,如:
function computed(a,b){
return a-b;
}
就可以影响排序了!!!
arr.slice(1);
//意味着从数组第1项元素起到末尾,拿到中间的元素创建新数组!
arr.slice(2,6);
//意味着从数组第2项元素起到第6项,拿到中间的元素创建新数组!
当前arr数组有5项,那么a(-2,-1)和a(3,4)获取的新数组是一样的。因为5+(-2)=3,5+(-1)=4啊!!!
arr.splice(0,2);
//意思是滴0项开始删除,第二个参数是删除的项数
arr.splice(2,0,"hello","haha");
//这句话的意思是,在当前数组的第二项中插入"hello"和"haha"两个项,返回一个新数组,0可以换成你要删除的项
上面的做法是改变arr的值,返回的其实是一个新数组。
indexOf()和lastIndexOf(),一个是从前往后找,一个是从后往前找,参数为一个的时候,找不到就返回-1.找到了就返回该项所在的位子是几。
两个参数的话,第二个参数的意思是从第几项开始查起!!!
迭代方法:
arr.every();以下数组方法的参数都是一个函数:
function(item,index,array){
//item 数组中每一项的值
//index数组中每一项的位置
//array数组本身
return item;//这里就是处理参数的
}
arr.every();和arr.some();都可以用于查询数组中的项是否满足某个条件
arr.filter();过滤方法,可以返回一个你过滤过的值,比如说数组中有很多项,你可以设置一个大于2的项,返回出所有大于2的数组出来。
arr.map();可以返回一个经过计算的数组,比方说原数组中的每一项,通过一个乘以2的函数作为参数的新数组,方法很管用!!!
arr.foreach();通过函数作为参数进行遍历
归并方法:
arr.reduce();和arr.reduceRight();这两个方法除了方向不一样,其实得值一样的
参数是一个函数:
function(prev,cur,index,array)
{
//prev前一个值
//cur当前值
//index项的索引
//array 数组本身
return prev+cur;
}
Date类型:
创建实例:
var date=new Date();
Date.parse();//返回日期毫秒数
var datetime=new Date(“May 25,2004”)和var datetime=new
Date(Date.parse(“May 25,2004”))
是等价的,你不用Date.parse();其实在后台他也要经过这个去解析以下的。
Date.UTC//返回日期毫秒数,但是他是基于年月日时分秒的,如:
var datetime=new Date(Date.UTC(2005,4,5,17,55,55));
只不月份要减1,比如说1月份的话,在里面就要写0
如果你想获取执行一段代码所用的时间,那么就用Date.now();来实现吧!
var one=Date.now();
function alertA()
{
alert("haha");
}
alertA();
var two=Date.now();
var three=two-one;
如果遇到兼容问题:
var one=+new Date();
function alertA()
{
alert("haha");
}
alertA();
var two=+new Date();
var three=two-one;
日期的方法:
var d = new Date();
// var date= d.getTime();//1563931708820,返回表示日期的毫秒数,与valueOf()方法返回的值一样
// d.setTime(1563931708820);//2019年7月24日星期三09:28:28 GMT + 0800(中国标准时间),以毫秒数设定日期,会改变日期
// d.setTime(-77771564221);
// var date=d.getFullYear();//2019,取得四位数年份
// var date=d.getUTCFullYear();//2019 ,取得UTC日期的四位数年份
// d.setUTCFullYear(2018)//Tue Jul 24 2018 09:34:28 GMT + 0800(中国标准时间),设置UTC日期年份,传入的年份必须是4位数字
// var date=d.getMonth()//6,返回日期中的月份,0代表1月,11代表12月
// d.setUTCMonth(12);//Fri Jan 24 2020 09:38:11 GMT+0800 (CST),设置UTC月份,传入的值必须是大于0,超过11则增加年份
// var date=d.getDate();//24,返回日期月份中的天数(1到31)
// var date=d.getUTCDate();//24,返回UTC日期月份中的天数(1到31)
// d.setDate(33)//Fri Aug 02 2019 09:42:25 GMT+0800 (CST) ,设置日期月份中的天数,如果传入的值超过了该余额中应有的天数,则增加月份
// d.setUTCDate(33)//Fri Aug 02 2019 09:43:34 GMT+0800 (CST) ,设置UTC日期月份中的天数,如果传入的值超过了该余额中应有的天数,则增加月份
// var date=d.getDay();//3,返回日期中星期的星期几(0表示星期日,6表示星期六)
// var date=d.getUTCDay();//3,返回UTC日期中星期的星期几(0表示星期日,6表示星期六)
// var date=d.getHours();//返回日期中的小时数
// var date=d.getUTCHours();//返回UTC日期中的小时数
// d.setHours(10);//Wed Jul 24 2019 10:07:21 GMT+0800 (CST),设置日期中的小时数,传入的值超过了23,则增加月份中的天数
// d.setUTCHours(10);//Wed Jul 24 2019 10:07:21 GMT+0800 (CST),设置UTC日期中的小时数,传入的值超过了23,则增加月份中的天数
// var date=d.getMinutes();//8,返回日期中的分钟数(0到59)
// var date=d.getUTCMinutes();//8,返回日期中的分钟数(0到59)
// d.setMinutes(60);//Wed Jul 24 2019 11:00:54 GMT+0800 (CST),设置日其中的分钟数,传入的值超过59则增加小时数
// d.setUTCMinutes(60);//Wed Jul 24 2019 11:00:54 GMT+0800 (CST),设置UTC日其中的分钟数,传入的值超过59则增加小时数
// var date=d.getSeconds();//8,返回日期中的秒数(0到59)
// var date=d.getUTCSeconds();//8,返回日期中的秒数(0到59)
// d.setSeconds(60);//Wed Jul 24 2019 11:00:54 GMT+0800 (CST),设置日期中的秒数,传入的值超过59则增加分钟数
// d.setUTCSeconds(60);//Wed Jul 24 2019 11:00:54 GMT+0800 (CST),设置UTC日期中的秒数,传入的值超过59则增加分钟数
// var date=d.getMilliseconds();//8,返回日期中的毫数
// var date=d.getUTCMilliseconds();//8,返回日期中的毫数
// d.setMilliseconds(60);//Wed Jul 24 2019 11:00:54 GMT+0800 (CST),设置日期中的毫秒数
// d.setUTCMilliseconds(60);//Wed Jul 24 2019 11:00:54 GMT+0800 (CST),设置UTC日期中的毫秒数
var date=d.getTimezoneOffset();//返回本地时间与UTC时间相差的分钟数,,例如,美国东部标准时间返回300.在某地进入夏令的情况下,这个值会有所变化
document.write(date);
RegExp类型(正则):
正则表达式:/xxxxxxx/flags
flags中可选的就是g,i,m
g:全局模式,将被应用与所有字符串,而不是发现第一个匹配项就立即停止
i:不区分大小写
m:多行模式,到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项
[abc]hh,能够匹配的是ahh\bhh\chh
元字符:
() [] \ {} ^ $ | ? * + .
要用这个就必须要转义
比如说要匹配[abc]hh,并且不区分大小写,那么正则就要写成:/\[abc\]hh/i
上面的字面量写法还可以写成:
var patten=new RegExp("\\[abc\\]hh","i");//推荐
看到了吗,上面用到了双重转义"\\"
RegExp实例的方法:
patten.exec()方法;参数就是字符串,patten就是正则表达式
patten.test()方法;参数就是字符串,patten就是正则表达式
RegExp构造函数属性:
.input//整个字符串
.leftContext//左边的
.rightContext//右边的
.lastMatch//查询本身项
.lastParen//(.)代替的内容
.multiline//是否多行
var text="this has been a short summer";
var patten = /(.)hort/g;
if(patten.test(text)){
document.write(RegExp.input);//this has been a short summer
document.write(RegExp.leftContext);//this has been a
document.write(RegExp.rightContext);//summer
document.write(RegExp.lastMatch);//short
document.write(RegExp.lastParen);//s
document.write(RegExp.multiline);//false
}
也可以这样写,防止看别人装逼的代码看不懂,一定要记住短的别名:
var text="this has been a short summer";
var patten = /(.)hort/g;
if(patten.test(text)){
document.write(RegExp.$_);//this has been a short summer
document.write(RegExp["$`"]);//this has been a
document.write(RegExp["$'"]);//summer
document.write(RegExp["$&"]);//short
document.write(RegExp["$+"]);//s
document.write(RegExp["$*"]);//false
}
还存在一些捕获组属性,比如$1~$9,依次尝试一下吧!!!
函数类型(function):
函数声明总是优先的,这就是为什么,及时你调用函数在前,函数的代码体在后面却依旧可以执行的的原因!!!
函数内部有两个特殊对象:arguments和this,其中arguments是一个类数组对象,他有一个属性callee,这个属性是一个指针 :
其他语言正常的递归:
function factorial(num){
if(num<=1){
return 1;
}else{
return num *factorial(num-1);
}
}
JavaScript的递归为了避免有错误发生:
function factorial(num){
if(num<=1){
return 1;
}else{
return num *arguments.callee(num-1);
}
}
this属性,在全局变量中是代表了window,在函数体内可以理解为当前函数体本身。
函数作为对象来讲,也是有属性和方法的
length,可以得到函数的参数数量
prototype,保存所有实例方法的源头
每个函数都有两个非继承而来的方法:
call();
apply();
绑定方法:
bind();