JS 专题3 引用类型

对象是某个特定引用类型的一个新实例

OBJ引用类型:
创建OBJ实例有两种方法:第一种是用new 操作符后跟Object构造函数。 
                                                            var person = new Object(); person.name="ni";pserson.age=29;
                                               第二种是对象字面表示法: var pserson={name:"ni",age:29};  属性名也可以用字符串括起来
                                                 第二种方式不会调用Object的构造函数
访问对象的属性时候 一般有两种方式: person["name"]  和 person.name
第一种方式要用引号引起来,重要的是 第一种可以是变量 或者 属性名有空格的情况。 但用的更多的是后一种方式。


Array类型:大小动态调整,内部装的元素类型可以不一样。创建数组有两种方式:
1. var colors= new Array();  var colors= new Array(20);有20项   var colors= new Array{"nihao","woshi","da"}; //三个元素
2.字面量表示方法 var a= ["red","blue","green"]; 不会调用Array的构造函数
    
访问Array的方式:  a[0]
a.length 存数组的长度 ,可以动态设置
 缩小: var col=["1","2","3"]; col.length=2; alert(col[2]) ; //undefined
扩大       var col=["1","2","3"]; col.length=4; alert(col[4]) ; //undefined
技巧每次都在末尾添加:col[col.length]="nihao";

检测数组:isArray比较准确一些。 instanceof只有一个全局环境的时候正确,但是有多个框架 也就是多个执行环境,在中间 传值的时候,可能会有不同版本的Array构造函数,会出现问题。

转换方法:  所有对象都有toLocaleString(),toString(),vaueOf() 将产生由数组内每个字符串形式拼接而成的以逗号分隔的字符串。 实际上 为了创建这个数组 会调用数组每一项的toString()方法。 
   alert(array.toString()); alert(array);两者显示效果一样 其实后者在内部自动调用了 toString()方法。

  var person1={toLocaleString:function() {return "person1";},toString:function() {return "person2";}}
 var person2={toLocaleString:function() {return "person3";},toString:function() {return "person4";}}
var people=[person1,person2];
alert(people);   // pserson2,pserson4
alert(people.toString);   // pserson2,pserson4
alert(people.toLocaleString);   // pserson1,pserson3

join和 toString , toLocaleString一样功能,只是支持传入分隔符  join("||") 返回的字符串以||分隔
如果某一项的值是 null或者undefined 那么在 join ,toString , toLocaleString,valueOf中返回的结果中以空字符串表示

栈方法:用 array 自带的 push,pop方法模拟  push 还会把当前数组里边有几个元素都返回回来
队列:  用array自带的 push ,shift方法模拟(后入先出)。 和用array自带的unshift ,pop方法模拟(先入后出)

排序:reverse()和sort()方法。sort()方法会调每个数组项的toString()转型方法,然后比较得到的字符串。即使数组中每一项都是数值,比较的也是字符串。 sort()方法可以接受一个比较函数作为参数,以便我们确定如何比较

操作方法:
concat()方法
在木有给concat() 方法传递参数的情况下,它会复制当前的数组并返回副本。如果传递给concat()方法的是一个或多个数组,则该方法会将这些数值复制到当前数组后并放回副本。
 eg:  var colors=["red","green","blue"];
     var colors2=colors.concat("yellow",["black","orange"]);
     alert(colors); //red,green,blue
     alert(colors2);//red,green,blue,yellow,black,orange

slice()方法:
返回当前数组中一个或多个项的新数组的副本。如果有两个参数,该方法返回起始和结束位置之间的项,但是不包括结束位置的项。两个参数也可以接受赋值 slice(-2,-1) 如果length=3 等于 slice(1,2)
var colors=["red","green","blue"];
var colors2=colors.slice(1);
var colors3=colors.slice(1,2);
alert(colors2); //green,blue
alert(colors3);// green

splice()方法: splice会影响原数组的值

用slice()方法实现删除: splice(0,2) 会删除当前数组中的前两项
用slice()方法实现插入:splice(2,0,"red","green") 会从当前数组的位置2开始插入字符串red 和 green
用slice()方法实现替换:splice(2,1,"red","green")会删除2的项,然后再从位置2开始插入字符串red 和 green

var colors=["red","green","blue"];
var removed=colors.splice(0,1);
alert(colors);   //green,blue
alert(removed);  //red

removed=colors.splice(1,0,"yellow","orange");
alert(colors); //green,yellow,orange,blue
alert(removed);//空


removed=colors.splice(1,2,"red","purple");
alert(colors);//green,red,purple,blue
alert(removed);//yellow,orange


位置方法:
indexof(key ,start)从数组的开头往后找 
lastIndexof(key,start) 从数组的末尾开始往前找  在查找某一项时候都必须要求全等(===)

迭代方法:
every(): 对数组中每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
filter():  对数组中每一项运行给定函数,返回该函数会返回true的项组成的数组
forEach(): 对数组中每一项运行给定函数,这个方法木有返回值
map():对数组中每一项运行给定函数,返回每次函数调用的结果组成的数组
some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true.

var numbers=[1,2,3,4,5,6]
var everyResult=numbers.every(function (item,index,array){return (item>2);});


缩小方法:
reduce()  reduceRight()  都接受一个函数 ,在数组中的每一项 都运行指定的函数。不同的是 reduceRigth()是从后往前迭代。见下:
var value=[1,2,3,4,5]
var sum=values.reduce(function (prev,cur,index,array){return prev+cur;}); 
alert(sum); //15 


Date 类型 : var date=new Date();

parse() :接受一个表示日期的字符串参数,然后返回这个字符串相应日期的毫秒数
var someDate= new Date(Date.parse("May 25,2004"));
其实等级于: var someDate= new Date("May 25,2004"); 也就是说 内部也会自动调用parse函数的

UTC() 也是返回日期的毫秒数:
var tmp=new Date(Date.UTC(2005,4,5,15,55,55)); //其实: 月份是从0开始的,所以是2005-5-5  只有年,月必须其他可以省略 。 该函数在Date也是会自动调用。  var tmp= new Date(2005,4,5,17,55,55);

now()函数:返回表示当前日期的毫秒数
Date 类也重写了toLocaleString(),toString()和valueof() 。 
toString()返回带有时区信息的日期和时间
toLocaleString()返回与地区相适应的时期和时间
valueOf()不返回字符串,返回日期的毫秒数,也正是这个原因 日期可以用 >,<号比较。

日期格式和方法:
toDateString() toTimeString() toLocaleDateString() tolocaleTimeString() toTUCString()
略。。。


RegExp类型
var expression = /pattern/flags;  //flags (g全部,i忽略大小写,m多行模式)
还可以用 var expression =new RegExp("[bc]at","i");
如果 pattern 有元字符 要转义    var pattern3=/\[bc\.\]/gi; 匹配 [bc.]的字符串 [].都是元字符
RegExp构造函数的模式参数是字符串 ,所以有些时候需要双重转义。
第一种可以用字面量模式:
   字面量模式    等价的字符串模式
/\[bd\]at/              \\[bc\\]at
/\.at/                   \\.at
使用正则表达式字面量和使用RegExp构造函数创建的正则表达式不一样。正则表达式字面量始终会共享一个RegExp实例 而使用构造函数创建的每一个新RegExp实例都是一个新实例

var re=null,i;
for (i=0;i<10;i++) {re=/cat/g; re.test("catxxxxxxx");}
for (i=0;i<10;i++){re=new RegExp("cat","g"); re.test("catxxxxxxx");}
第一种模式:第一次能匹配到,第二次调用从索引为3的字符开始
第二种模式:每次都创建一个新的RegExp实例,内部不同的属性,所以每次匹配都是从第三个开始。
至少:IE9+ Firefox4+ 和 Chrome支持

RegExp实例属性:
global:布尔值 表示是否设置了g标志
ignoreCase: 布尔值 表示是否设置了i标志
lastIndex 整数 表示开始搜索下一个匹配项的字符位置 从0算起
multiline: 布尔值:表示是否设置了 m标志
source: 正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回

RegExp实例方法:
exec()方法:是专门捕获组而设计的。返回的数组是一个array实例,但是包含另外两个额外的属性 index 和 input。
index 表示匹配项在字符串中的位置  input表示应用正则表达式的字符串
var text="mom and dad and baby";
var pattern=/mom( and  dad( and baby)?)?/gi;
var matches=pattern.exec(text);
alert(matches.index); //0
alert(matches.input); // mom and dad and baby
alert(matches[0]);  //mom and dad and baby
alert(matches[1]);   // and dad and baby
alert(matches[2]); // and baby

如果设置了g符号,每次匹配完, index 都会变化。 如果木有设置g, 则每次调用都是从0开始尝试匹配
因浏览器而异。IE就不支持,在非g模式下,index也会变化
test()方法:匹配到返回true,匹配不到返回false
 toString()方法:返回正则表达式的字面量
toLocaleString()方法:返回正则表达式的字面量

RegExp构造函数属性:
长属性名              短属性名             说明
input                        $_              最近一次匹配的字符串
lastMatch                $&         最近一次的匹配项
lastParen                $+         最近一次的捕获组
leftContext               $`         input字符串中lastMatch之前的文本
multiline                    $*       布尔值
rigthContext             $'        Input字符串中lastMatch之后的版本

var text="this has been a short summer";
var pattern=/(.)hort/g;
if(pattern.test(text))
{
  alert(RegExp.input);  // this has been a short summer
  alert(RegExp.lastMatch);   // short
  alert(RegExp.lastParen);  // s
}
访问短属性时候 用如下方式:
alert(RegExp["$+"]); // s
除了上面介绍几个属性以为 还有9个捕获组:RegExp.$1, RegExp.$2....。RegExp$9  调用exec(),test()方法时,会被自动填充 。

模式的局限性,不支持如下特性:
匹配字符串开始和结尾  \A \Z
向后查找
并集和交集类
原子组
Unicode支持
命名的捕获组
s(单行) 和x (无间隔)的匹配模式
条件匹配
正则表达式注释

Function类型
表示1: function sum(num1,num2) {return num1+num2;}
表示2: var sum=function(num1,num2){return num1+num2;}
表示3 : var sum= new function("num1","num2","return num1+num2"); 不建议使用 效率低
 
重载:木有重载,只有重写 后边定义覆盖前面的定义
函数声明和函数重载:函数声明 解析器会率先读。但是函数表达式就不会先读,如果在函数表达式前面调用了这个函数就报错。 alert(sum(10,10)); var sum=function(num1,num2){return num1+num2};
函数可以作为参数传入其他函数,或者放回其他函数。

函数内部属性: 函数的名字仅是一个包含指针的变量而已
arguments:包含出入函数的所有参数。是一个数组对象,该对象还有一个属性:callee,指向拥有这个arguments对象的函数。
this:函数执行的环境对象

函数属性和方法:每个函数都是对象,也有属性和方法。
length :函数接受命名参数的个数
prototype:保存实例方法的真正所在。不可枚举,不能使用for-in发现
每个函数还包括两个非继承而来的方法: 
apply():接受两个参数,第一个是this对象的值 另一个是参数数组(可以是arguments 或者是Array的实例) 
call():接受两个参数。第一个是this值 第二个是具体的参数
       eg:  function sum(sum1,sum2){return num1+num2;}
              function callSum(num1,num2){return sum.call(this,num1,num2);}
             alert(callSum(10,10));
 两个函数的强大之处的是扩充函数赖以运行的作用域

bind():创建一个函数的实例,其this值会被绑定到传给bind()函数的值
window.color="red";
var o={color:"blue"};
function sayColor(){
      alert(this.color);
}
var objectSayColor= sayColor.bind(o);
objectSayColor();

toString(),toLocaeString(),valueOf()都返回函数的代码


基本包装类型:引用类型和基本包装类的主要区别就是对象的生存周期。new创建的引用类型实例 在作用域里一直在,而自动创建的包装类的对象,则只存在于一行代码的执行瞬间。
var s1="come text"; s1.color="red"; alert(s1.color); //undefined 。第二句代码会自动创建包装类,但是第三行代码的时候就销毁了

Boolean类型:
var booleanObject=  new Boolean(true);
Boolean类的实例重写了valueOf()方法 返回基本类型值true和false;重写了toString()方法,返回字符串的"true"和''false"
 注意: var abc=new Boolean(false);  alert(abc&&true); 返回true ,因为 abc是对象。。


Number类型: valueOf返回基本类型的数值,toLocaleString() ,toString()是返回字符串形式的数值
toFixed():按指定小数位返回数值的字符串表示 ,参数表示 保留几位小数
toExponential() :以指数表示法字符串形式的数字 参数表示 保留几位小数
toPrecision(): 参数表示 一共有几位数字,系统根据参数选择合适的形式返回   
                      var num=99; num.toPrecision(1); //1e+2;    num.toPrecision(2);99   num.toPrecision(3); 99.0
String类型:
length属性:字符串中的双字节符,length只算一个。
charAt():给定位置的字符
charCodeAt(); 给定位置字符的字符编码
concat():把一个或多个字符串拼接起来
slice(),substr(),substring(); 都返回一个基本类型的字符串,不会改变原string 的值,可以接受一个或两个参数。 第一个参数字符串开始的位置,第二个参数,slice(),substr() 返回给定位置前面的一个字符,substriing()则是指定返回字符的个数。
indexOf(); lastIndexOf();
trim():创建一个字符串的副本,删除前置和后缀的空格
toLowerCase() toUpperCase()
match()字符串的模式匹配,要么是一个正则表达式 要么是一个RegExp对象
serrch() ,参数和match()一样。返回字符串中第一个匹配项的索引;弱国木有找到匹配项,返回-1
replace();替换,调用的字符串木有影响,把结果字符串返回 
eg:   result=text.replace(/(.at)/g,"word ($1)");

replace()的第二个参数可以是一个函数
function htmlEscape(text){
return text.replace(){/[<>"&]/g,function(match,pos,originalText){
switch(match){
case"<":
return "&lt";
case">":
return "&gt";
case"&":
return "&amp";
case"\"":
return "&quot";
}};}

split()函数:把指定的字符串分割成一个或多个子字符串,并把结果放在数组中.接受一个或两个参数,第一个参数是分割符,第二个参数是返回数组的大小

localeCompare() : 比较字符串。
fromCharcode(): 接受一个或多个字符编码,然后将它们转成成字符串。
HTML方法:不建议使用

单体内置对象: Object, Array和String ,Global和 Math
Global对象:encodeURI(), encodeURIComponent(),decodeURI(),decodeURIComponent()
                       eval()方法,对传入的字符串进行解析操作
                       属性:undefined,Nan,Infinity,Object,Array,Function......

window对象:ECMAScript虽然木有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为window 对象一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,都成为了Window对象的属性。
如果不用window对象,可以用如下方式 得到Global对象:
var global=function(){return this;}();

Math对象:E,LN10,PI等等,方法:min(),max(),ceil()向上舍入  floor 向下舍入  round 标准舍入 random(),abs(),exp(),log(),pow()等等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值