javascript学习笔记——引用类型(1)

1.Object类型

①创建实例的方式:

a.使用new操作符

var person =new Object();
person.name="amy";
person.age=20;

b.对象字面量表示法:

var person={
name:"amy",
age:29     //属性名也可以使用字符串
};

②Object类型是所有对象的基础,所有对象都拥有该类型基本的属性和方法

③属性和方法

2.Array类型

数组的每一项可以保存任何类型的数组,大小可以动态调整

①创建数组的方式:

var colors=new Array();  //new操作符也可以省略
var colors=new Array(20);
var colors=new Array("red","green","blue");

var colors=[];  //创建空数组
var colors=["red","green","blue"];   //使用数组字面量表示法

②length属性

var colors=["red","green","blue"];
alert(colors.length);  //访问数组长度
colors.length=2;    //移除数组最后一项
colors[colors.length]="black";  //在数组末尾增加一项

③转换方法

var colors=["red","green","blue"];
alert(colors.toString());//返回以逗号连接的字符串
alert(colors.valueof()); //返回数组,数组的每一项都调用toString(),最后变成字符串
alert(colors.join("||"));//如果join没有参数或者是undefined,则返回结果用逗号分隔

④栈方法(先进后出)

var colors=new Array();
colors.push("red");   //push()可以在数组末尾添加任意数量的数值
colors.push("blue","green");
var item=colors.pop();   //在数组末尾移除最后一项
alert(item);   //green

⑤队列方法(先进先出)

var colors=new Array();
colors.push("red");   //push()可以在数组末尾添加任意数量的数值
colors.push("blue","green");
var item =colors.shift();  //删除数组的第一项
alert(item);   //red

var count=colors.unshift("red","orange"); //在数组开头添加任意项,并返回数值长度
alert(count);  //4

⑥重排序方法

var values=[2,3,6,1,7,0,4];
values.sort();  //0,1,2,3,4,6,7   对数组进行排序

values.reverse();  //7,6,4,3,2,1,0    反转数组

⑦操作方法

a.concat()基于当前所有项创建一个新数组,该方法的对于数组的操作都作用于新数组,对原数组没有影响

var colors=["red","green","blue"];
var s=["a","b","c"];
var c1=colors.concat();  //复制colors数组内容到新数组c1中
var c2=colors.concat(s);  //先把colors数组内容复制到新数组中,将s中的每一项都添加都新数组末尾
var c3=colors.concat("grey");  //直接将值加入新数组c3末尾

b.slice()方法基于当前数组的一项或多项创建一个新数组,对原数组没有影响

var colors=["red","green","blue","black"];

//只有一个参数时,返回新数组的项包括角标1到末尾的所有项
var s=colors.slice(1); //  green,blue,black
//两个参数时,返回1到2的所有项的新数组,不包括结束位置
var s=colors.slice(1,3);  //  green,blue

c.splice()

1)删除:删除任意数量的项

splice(位置,删除数量)

var colors=["red","green","grey"];
var re=colors.splice(0,2);  //删除数组的前两项,返回删除的项  red,green

2)插入:可以在指定位置插入任意数量的项

splice(位置,要删除的项数量,要插入的项)

var colors=["red","green","grey"];
var re=colors.splice(1,0,"pink","black"); //从当前数组的位置1开始插入“pink”和“black”

3)替换:可以在指定位置插入任意项,但同时删除任意数量的项

var colors=["red","green","grey"];
var re=colors.splice(1,1,"pink","black"); //在1位置删除一项,插入两项  red,pink,black,grey

⑧位置方法

var s=[1,2,3,4];
alert(s.indexOf(2));  //1  从头开始查找,返回脚标,找不到返回-1
alert(s.lastIndexOf(3));  //2  从数组最后开始往回查找,返回脚标,找不到返回-1

⑨归并方法

var s=[1,2,3,4];
var sum=s.reduce(function(pre,cur,index,array){  //返回数组项的和 正向相加
   return pre+cur;
});
alert(sum);  //10
var s=[1,2,3,4];
var sum=s.reduceRight(function(pre,cur,index,array){ // 返回数组项的和 反向相加
   return pre+cur;
});
alert(sum);  //10

⑩迭代方法

ES5为数组定义了五个迭代方法:every,some,forEach,map,filter;这五个方法都接收两个参数——要在每一项运行的函数和运行该函数的作用域的对象;在这五个方法中对数组的每一项运行给定的函数,各自返回不同的结果;

第一个参数:函数会接收三个参数分别为:数组项的值,该项在数组中的位置,数组对象的本身;即function(item,index,array)

a. every(),数组每一项都返回true时返回true

var number=[1,2,3,4,5,4,3,2,1];
var everyResult=number.every(function(item,index,array){
   return (item>2);     //返回false  
});

b. some() 数组中的任一项返回true,则返回true;

var number=[1,2,3,4,5,4,3,2,1];
var someResult=number.some(function(item,index,array){
   return (item>2);     //返回true  
});

c. filter() 返回该该函数会返回true的项组成的数组

var number=[1,2,3,4,5,4,3,2,1];
var filterResult=number.filter(function(item,index,array){
   return (item>2);     //返回[3,4,5,4,3] 
});

d. map() 返回每次函数调用的结果组成的数组

var number=[1,2,3,4,5,4,3,2,1];
var mapResult=number.map(function(item,index,array){
   return item*2;     //返回[1,4,6,8,10,8,6,4,1]  
});

e. forEach() 没有返回值

var number=[1,2,3,4,5,4,3,2,1];
number.forEach(function(item,index,array){
     //执行操作  
});

 ES6新增的数组有关方法:

a. Array.from()方法用于将类似数组的对象可遍历的对象转为真正的数组(返回的是一个新的数组实例

     类似数组的对象指的是:任何具有length属性的对象

     可遍历的对象指的是部署了遍历器接口(Symbol.iterator)的对象,比如Set和Map数据结构对象

// 字符串转数组
var str ='1234556'
console.log("str",Array.from(str));

// set结构转数组
var set=new Set([1,2,3,2,2,4,5]);
console.log("set",Array.from(set));

//map结构转数组
var map=new Map([[1,2],["name",'张三'],['age','10']]);
console.log("map",Array.from(map));

//类似数组的对象,想要完整的转化成数组,除了要具有length属性,
//键值要数值型的,如果为字符串则生成的是空数组,length的值为多少生成的新数组就多长;
//键值要小于等于数组的长度,才能生成对应的数组项,否则为undefined
var price ={
  '1':'$1.99',
  '4':'$0.45',
  '5':'$0.88',
  length:6
}

console.log("000",Array.from(price));

var price ={
  '1':'$1.99',
  '2':'$0.45',
  '3':'$0.88'
}

console.log("111",Array.from(price));

var price ={
  '0':'$1.99',
  '1':'$0.45',
  '2':'$0.88',
  length:3
}

console.log("2222",Array.from(price));

运行结果:

 

注意:

Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组

// set结构转数组
var set=new Set([1,2,3,2,2,4,5]);
console.log("99999",Array.from(set,x=>x*2)); // [2, 4, 6, 8, 10]

b.Array.of方法用于将一组值转换为数组

总是返回参数值组成的数组,如果没有参数,就返回一个空数组。

console.log(Array.of());  //[]
console.log(Array.of(1));   //[1]
console.log(Array.of(undefined));  //[undefined]
console.log(Array.of(1,3,"9"));    //[1,3,"9"]

c. find()  用于找出第一个符合条件的数组成员,入参为一个回调函数,所有的数组成员一次执行该回调函数,直到找到第一个返回值为true的成员,如果找不到则返回undefined

[2,1,3,24,3].find(n=>n>10)    //24

d.findIndex()  用于返回第一个符合条件的数组的成员的角标不符合条件则返回-1 

[2,1,3,2,4,3].findIndex(n=>n<2)   //1

 d. fill()  使用给定值填充一个数组。(用于空数组的初始化比较方便)

传入第二第三个参数可以用于指定填充的起始位置和结束位置。(左闭右开)

[1,2,3,4].fill(6);    //[6,6,6,6]
[1,2,3,4].fill(6,1,2);   //[1,6,3,4]

 e.数组实例的entries()、keys()、values()

entries()、keys()、values()都用于键值的遍历,可用for..of遍历,唯一区别在于keys()遍历的是键名values()遍历的是键值

entries()是对键值对的遍历

for(let index of ['a','b'].keys()){
  console.log("key",index);
}
for(let index of ['a','b'].values()){
  console.log("values",index);
}
for(let index of ['a','b'].entries()){
  console.log("entries",index);
}

 

f.数组实例的includes()

includes()方法返回一个布尔值表示某个数值是否包含给定的值

[1,2,3].includes(2)    //true

 该方法的第二个参数表示搜索的起始位置,默认为0。如果为负数,表示倒数的位置。大于数组的长度,则重置为0开始

[1,2,3].includes(3,4)  //false
[1,2,3].includes(3,-1)  //true

3.Date类型

①创建日期对象的方式

a.新对象自动获得当前的日期和时间

var now=new Date();

b.根据特定的日期和时间创建日期对象

  Date.parse(日期字符串)  返回相应日期的毫秒数

  Date.UTC(年份,月份,天,小时,分,秒,毫秒)  返回相应日期的毫秒数,其中参数月份(0-11)、小时(0-23)是从0开始,年和月     是必须

var someDate=new Date(Date.parse("May 25,2011"));

var someDate=new Date("May 25,2011");

var someDate=new Date(Date.UTC(2011,4,25,17,55,12));
//本地时间2011年5月25号17点55分12秒
var someDate=new Date(2011,4,25,17,55,12);

②Date.now() 返回调用这个方法的时间和日期的毫秒数

var start=Date.now();

③比较日期值

var date1=new Date(2011,0,1);
var date2=new Date(2011,1,1);

alert(date1<date2);  //true
alert(date1>date2);   //false

④将日期转化为特定格式“yyyy-MM-dd hh:mm:ss”或“yyyy-MM-dd”

为Date原型添加如下方法:(转:https://www.cnblogs.com/tugenhua0707/p/3776808.html

Date.prototype.format = function(fmt) { 
     var o = { 
        "M+" : this.getMonth()+1,                 //月份 
        "d+" : this.getDate(),                    //日 
        "h+" : this.getHours(),                   //小时 
        "m+" : this.getMinutes(),                 //分 
        "s+" : this.getSeconds(),                 //秒 
        "q+" : Math.floor((this.getMonth()+3)/3), //季度 
        "S"  : this.getMilliseconds()             //毫秒 
    }; 
    if(/(y+)/.test(fmt)) {
            fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length)); 
    }
     for(var k in o) {
        if(new RegExp("("+ k +")").test(fmt)){
             fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
         }
     }
    return fmt; 
} 



//调用
var time1=new Date().format("yyyy-MM-dd hh:mm:ss");  //2018-07-25 20:34:24
var time2=new Date().format("yyyy-MM-dd");  //2018-07-25

⑤日期转化为字符串

toDateString()  显示星期几、月、日和年

toTimeString() 显示时、分、秒和时区

4.Function类型

①函数的定义:

function sum(num1,num2){
   return num1+num2;
}

//函数表达式,调用函数要放在函数表达式后面,避免报错
var sum=function(num1,num2){
   return num1+num2;
};

//使用Function构造函数
var sum=new Function("num1","num2","return num1+num2");   //不推荐,因为代码要解析两次,影响性能

② apply()和call()

作用:参数传递、扩充函数赖以运行的作用域

区别:接收参数的方式不同,call()传递给函数的参数必须逐个列举

a.参数传递

function sum(num1,num2){
   return num1+num2;
}

function callSum(num1,num2){
   return sum.apply(this,arguments);   //传入arguments对象
}

function callSum2(num1,num2){
   return sum.apply(this,[num1,num2]);   //传入数组
}

function callSum3(num1,num2){
   return sum.apply(this,num1,num2);   //call()方法传递参数
}
callSum()在执行sum()方法时传入了this(因为callSum在全局中调用,即传入了window对象)
alert(callSum(10,10));  //20
alert(callSum2(10,10));  //20
alert(callSum3(10,10));  //20

b.扩充函数的作用域

window.color="red";
var o={color:blue};

function sayColor(){

  alert(this.color);
}

sayColor();  //red

sayColor.call(this);  //red
sayColor.call(window);  //red
sayColor.call(o);  //blue

//bind函数
var objsayColor=sayColor.bind(o);
objsayColor();   //blue

5.RegExp类型

1)以字面量形式定义正则表达式

var expression=/pattern/flags;

pattern:表示任何简单或复杂的正则表达式

flags:标志,每个正则表达式都有一个或多个标志,用以标明正则表达式的行为

正则表达式的匹配模式支持下列3个标志

g:表示全局模式,即模式将被应用于所有字符串

②  i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;

m:表示多行模式;

//匹配字符串中所有"at"的实例
var pattern1=/at/g;
//匹配第一个“bat”或“cat”,不区分大小写
var pattern2=/[bc]at/i;
//匹配所有以“at”结尾的3个字符的组合,不区分大小写
var pattern3=/.at/gi;
//匹配第一个“[bc]at”,不区分大小写
var pattern4=/\[bc\]at/i;
//匹配所有".at",不区分大小写
var pattern5=/\.at/gi;

 2)使用RegExp构造函数创建正则表达式;

var pattern2=/[bc]at/i;
var pattern3=new RegExp("[bc]at","i");

传递给RegExp构造函数的两个参数都是字符串(不能把正则表达式字面量传递给构造函数)

 3)exec()方法

接收一个参数,即要应用模式的字符串;

返回包含第一个匹配信息的数组,没有匹配项的情况下返回null;

返回的数组实例,还包含两个额外的属性:

index:表示匹配项在字符串中的位置;

input:表示应用正则表达式的字符串;

        exec(字符串)即使在模式中设置全局标志(g),每次也只会返回一个匹配项,在下一次调用中继续查找新匹配项;

设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。

var text="cat, bat, sat, fat";
var pattern=/.at/g;
var matches=pattern.exec(text);
alert(matches.index);     //0
alert(matches[0]);      //cat
alert(pattern.lastIndex);   //3
matches=pattern.exec(text);
alert(matches.index);     //5
alert(matches[0]);      //bat
alert(pattern.lastIndex);   //8

 

 4)test()方法

接收一个字符串参数;

在模式与该参数匹配的情况下返回true;否则返回false;

只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,使用这个方法非常方便;

var text="000-00-0000";
var pattren=/\d[3]-\d[2]-\d[4]/;
if(pattern.test(text)){
   alert("the pattern was matched");
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值