JavaScript数据类型(下)——对象(引用)类型

一、Object

1、创建Object实例

(1)new操作符

var person=new Object();

(2)对象字面量

var person={};

2、访问对象属性的方式

(1)点表示法

(2)方括号表示法

①方括号表示法能够使用变量名来访问属性,因此需要拼接属性名时使用方括号表示法。

②如果属性名中有会导致语法错误的字符或属性使用的是关键字或保留字,使用方括号表示法。

③除非需要用变量名来访问属性,一般使用点表示法。

1.1 Array类型

1、弱类型:

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

2、创建数组的方式:

(1)Array构造函数 如var colors=new Array()(new操作符可以省略)

可传入参数,当传入的参数是数字时,会创建给定相熟的数组,传递的是其他类型的参数,则会创建包含那个参数的只有一项的数组。

(2)字面量表示法

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

3、length属性

数组的length不是只读的,可以通过修改length的值修改数组的长度,当length大于数组项数的值时,新增的每一项会取得undefined值。

4、数组删除:

delete colors[0] 不会减小数组的长度,只会将第一个元素设置为undefined,但是索引不存在了,调用0 in colors返回false。

5、检测数组

(1)instanceof Array

(2)Array.isArray()

6、数组方法

(1)转换方法

①toString() 将数组转化成字符串,并且每一项使用逗号进行分隔。

②valueOf() 返回该数组。

③join(参数) 将数组转化成字符串,并且以相应的传参进行分隔。

(2)栈方法(后进先出)

push(参数),pop()

(3)队列方法

shift()从队列的前端取出元素, unshift(参数)在队列的前端添加任意元素。

(4)重排序

①reverse()
反转数组的顺序。

②sort(参数)
默认sort方法会将每一项转换成字符串然后升序进行排序,也可以在sort()中传入比较函数。

(5)操作方法

①concat(参数)

创建一个新数组,在原数组的基础上添加拼接传入的参数。(可去掉一次[]进行平级,如:
var colors=["red","green","blue"]);
var colors2=colors.concat("yellow",["black","brown"]);
//colors=["red","green","blue","yellow","black","brown"]

concat内可以添加任意数量的参数。

②slice(起始位置,结束位置)

slice用于切割数组,两个参数分别是起始位置和结束位置,当指传入一个参数时默认结束位置为数组的尾部。

③splice

splice(删除的起始位置,删除的项数,插入的第一项,插入的第二项,…)

(6)位置方法

①indexOf(要查找的项,起点位置)

起点位置参数可以省略,会返回查找项对应的索引。

②lastIndexOf(要查找的项,起点位置)

从后向前进行查找。

(7)迭代方法

参数都是function(item,index,array){}

①every()和some()返回值true/false

用于查询数组中的项是否满足要求,every所有项都满足要求时返回true,some某一项满足就会返回true。

②filter()

返回满足条件的项。

③map()

返回运行某种操作后的数组。

④foreach()

对原数组执行相应的操作和使用for遍历相同。
for in语句遍历对象中的属性(包含原型链上的属性),因此对于数组的话,其属性就是0,1,2…length-1。

(8)归并方法

参数function(prev,cur,index,array){}
reduce,reduceRight

1.2 Date类型

var now=new Date();
新创建的date对象自动获取当前日期和时间。
ECMAScript5新增了Date.now()方法可以直接获取当前的日期和时间
Date.now()的值和+new Date()相同。

1.3 RegExp类型

1、定义方式

(1)字面量

var reg=/abc/gim(两个左斜线)

(2)使用RegExp构造函数

var reg=new RegExp(“abc”,”gim”);

区别:

①是否创建新的RegExp对象

正则表达式字面量形式始终会共享一个RegExp对象,而new RegExp()每次创建不同的RegExp对象。如在循环中:

var re=null,i;
for(i=0;i<10;i++){
    re=/cat/g;
    re.test("catastrophe");      //true,false,true,...
}
for(i=0;i<3;i++){
    re=new("cat",g);
    reg.exec("abcd");     //true,true,true...
}

对于字面量方式由于共享同一个RegExp实例,第一次查找找到cat,下次从索引为3的位置开始(设置了参数g)。而构造函数形式,每次循环都是一个新的RegExp实例,都会从开头进行查找。
但ECMAScript5规定,使用正则表达式,每次也会创建新的RegExp实例,IE9+、Firefox4+和chrome都做了修改。

②特殊字符转义次数

字面量形式对于特殊字符进行一次转义即可,而由于RegExp构造函数传入的方式是字符串因此要在字面量转义的基础上再进行一次转义。
例如\n特殊字符,在字面量形式中转义结果为\n。在构造函数中的字符串应为“\\n”(\也要进行一次转义)。

2、正则表达式中的特殊字符

字符表示含义
.除换行符(\n \r \u2028 \u2029)外所有字符
\d数字0~9
\D非\d
\w数字0~9,字母a~z/A~Z,下划线
\W非\w
\s空格符、TAB、换行符、换页符
\S非\s
\tTAB
\r回车
\n换行
\v垂直制表符
\f换页符
[…]字符范围
[^…]字符范围外
^匹配行首
$匹配行尾
\b零宽单词边界
\B非\b
(x)分组并记录到匹配的字符串
\nn为数字,表示第n个分组项重复
(?:x)仅分组不重复(如:/(?:abc)(def)\1/.test(‘abcdefdef’);)
x*、x+>=0个匹配、>=1个匹配,贪婪算法
x*?、x+?>=0个匹配、>=1个匹配,非贪婪算法
x?出现0或1次
x{n}、x{n,}、x{n,m}重复n次,重复>=n次,重复次数n<=x<=m

3、正则表达式标志

(1)g:模式将被应用于所有字符串,而非发现第一个匹配项时停止;(如多次调用exec()会不断向后检索字符串)。

(2)i:表示不区分大小写,默认区分大小写。

(3)m:表示多行模式,到达一行末尾会继续查找下一行。

4、RegExp对象的属性

global、ignoreCase、multiline、lastIndex(搜索下一个匹配项的字符位置)、source(正则表达式的字符串表示)。

5、RegExp对象的方法

(1)exec(参数)

RegExp对象.exec(字符串)
返回结果是一个数组或null(没有匹配信息)
数组包含整个模式及捕获组的第一个匹配项:第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。

(2)test(参数)

模式与该字符串参数匹配时返回true,否则返回false。

(3)toLocalString()和toString()

返回正则表达式的字面量

(4)compile(参数)

能够对正则表达式进行编辑:

var reg=/abc/;
reg.compile("def");
reg.test("def");//true
1.4 Function类型

函数实际上是对象;函数名是指针,指向该函数对象。
使用不带圆括号的函数名是访问函数指针,而非调用函数。

1、函数的定义方式:

函数定义时不用指定是否返回值。

(1)函数声明

函数声明会被前置。

(2)函数表达式

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

function后面一般没有名字,有名字的话,在低版本的浏览器上sum==名字为false,高版本的浏览器会报错,名字 undefined。

2、函数内部对象:

在函数内部可以调用的对象。

(1)arguments

arguments对象和数字类似,但它并不是Array的实例。
函数定义中命名参数如以上的num1和num2,可通过arguments来访问。
当调用时传入相应的参数,通过修改arguments的值,会反映到相应的命名参数上。
但是如果没有传入相应的参数,修改arguments的值无效,在严格模式下会报错。
arguments.callee是个指针,指向拥有该arguments对象的函数。
使用arguments.callee可以解决递归调用中紧耦合的问题。

(2)this

this引用的是函数执行环境的对象。

①全局作用域中的this

this===window

②一般函数的this

function f1(){return this;}
f1()===window
function f2(){"use strict";return this;}
f2()===undefined

③作为对象方法(也可是原型链上的方法)的函数this

this指向该对象。

3、函数内部属性

caller:指向调用该函数的函数引用。

function outer(){inner();}
function inner(){argruments.callee.caller();}

4、函数属性和方法

属性:

(1)length:返回该函数参数的个数

(2)prototype:指向该函数的原型函数

方法:
(1)apply()

执行函数,可指定运行函数的作用域,参数以数组方式传递

(2)call()

执行函数,可指定运行函数的作用域,参数按顺序逐个传递

(3)bind()

创建函数实例,可指定函数的作用域,
??????curring化

6.5 基本包装类型

创建或读取基本类型时,后台就会自动创建一个基本包装类型的对象,但该对象只在执行代码的一瞬间。
如:

    var a="string";
    alert(a.length);
    a.t=3;
    alert(a.t); //出错!

所有基本类型的包装对象在转化成布尔值时都返回true。
如:

    var a=new Boolean(false);
    var b=a&&true;
    alert(b);//true

Object构造函数会像其他工厂方法一样,根据传入值的类型返回相应基本包装类型的实例。

    var obj=new Object("some text");
    alert(obj instanceof String);//true

转型函数VS构造函数
调用转型函数如Number数据的类型仍是基本类型number。

1、Boolean类型

布尔表达式中的所有对象都会被转换成true。

2、Number类型

(1)toFixed(参数)

参数指定小数点后面保留几位

(2)toExponential(参数)

转换成e表示,参数指定小数的位数

(3)toPrecision(参数)

转换成最合适的格式,参数表示所有数字的位数,不包括指数部分。

3、String类型

(1)charAt(参数)

指定位置的字符。

(2)charCodeAt(参数)

指定位置字符的字符编码。
(3)indexOf(参数1,参数2)

指定字符的位置。参数2为开始查找的位置。

(4)lastIndexOf(参数1,参数2)

指定字符的位置。参数2为开始查找的位置,从后向前查找。

(5)concat(参数1,参数2,…)

拼接字符串,也可直接使用+号。

(6)slice substring substr

①slice(参数1,参数2)

切割字符串,同数组方法类似,参数1,参数2分别为开始位置和结束位置。如果只有一个参数,则是到字符串的末尾,所有负值都将其与字符串的长度相加。

②substring(参数1,参数2)

子字符串,参数1和参数2为开始位置和结束位置(顺序可以互换),如果只有一个参数,则是到字符串的末尾,所有负值都将其变为0。

③substr(参数1,参数2)

截取子字符串,参数1为开始位置,参数2为字符的个数。
第一个参数为负值,将其加上字符串的长度;第二个参数为负值,将其变为0;

(7)trim()

用于删除字符串前置及后缀的所有空格。

(8)字符串大小写转换

toLowCase()、toUpperCase()、toLocaleLowerCase()、toLocaleUpperCase()
locale根据地区的方法来保证正确的转换。

(9)字符串模式匹配的方法

match()
search()
replace()
split()

(10)localeCompare(参数)

将两个字符串在字母表中的位置进行比较。
返回值,字符串位于参数之前返回负数(大多数情况下为-1)
字符串位于参数之前返回正数(大多数情况下为1)
两个字符串相等返回0。

(11)fromCharCode(参数1,参数2,…)
参数为多个字符串编码,返回对应的字符串。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值