js高级程序设计学习笔记2

Array类型:

ECMAScript每一项都可以保存任何类型的数据。而且大小是可以动态调整的。创建数组的两种基本方式:

var color = new Array();

创建length值为20的数组:

var colors = new Array(20);
var colors = new Array("green","red","blue");

也可以省略new 操作符。

var colors = Array(3);

第二种是使用数组字面量表示法。

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

与对象一样,使用这种方式并不会调用Array的构造函数。

判断某个对象是否是数组:
if(value instanceof Array){…}
问题:它假设单一的全局执行环境。
为了解决此问题,ECMAScript5新增了Array.isArray(value)方法。

alert(colors.join(“||”));//red||green||blue
如果数组中的某一项是null或者undefined,那么该值在join(),toString(),toLocaleString(),valueof()方法的返回值中以空字符串表示。

ECMASctipt数组提供了一种让数组的行为类似于其他数据结构的方法。例如。
数组可以表现的跟栈一样。通过push()和pop()方法。

colors.push("black","yellow");
colors.pop();
  • 模拟队列:shift()方法:移除改数组的第一项并返回。
colors = colors.push("black","red");
var item = colors.shift();//black
  • 反向模拟队列:unshift(),pop()方法。
    unshift()能够在数组前端添加任意个项并返回新数组的长度。

重排序方法:

reverse():反转
sort():默认按升序排列数组。sort方法会调用每个数组项的toString()方法,然后比较得到的字符串。即使数组中的每一项都是数值,也是如此。

var values = [0,1,5,10,15];
values.sort();
alert(values);//0,1,10,15,5

sort()方法可以传入一个比较函数。

function compare(val1,val2){
    return val1-val2;
}

操作方法

concat():基于当前数组的所有项创建一个新的数组。这个方法先创建当前数组的一个副本,然后接收到的参数添加到这个副本的末尾。最后返回新构建的数组。

var colors = ["red","green"];
var colors = colors.concat("yellow",["black","brown"]);

slice()方法:
返回从起始位置到结束位置之间的项–但不包括结束位置的项。可以接受一到两个参数。slice()不会影响原始数组。

var colors = ["red","green","yellow+"];
var colors2 = colors.slice(1);//green,yellow
var colors3 = colors.slice(1,2);//yellow

如果结束位置小于起始位置,返回空数组。

splice()方法:
删除:两个参数,要删除的第一项的位置和要删除的项数。splice(0,2):会删除数组中的前两项。
插入:三个参数,起始位置,0,要插入的项。

splice(2,0,"red","green");

替换:splice(2,1,”red”,”green”)会删除当前数组位置2的项,然后在位置2插入“red”,”green”。

位置方法

indexOf()和lastIndexOf()。都传入两个参数,要查找的项和(可选的)查找起点位置的索引。没找到返回-1.

迭代方法:接收两个参数,要在每一项上运行的函数和(可选的)运行该函数的作用域对象–影响this的值。
传入这些方法中的函数接收三个参数:数组项中的值,该项在数组中的位置和数组对象本身。
every():对数组中的每一项都运行给定函数,如果该函数对每一项都返回true,则返回true.
filter():返回该函数会返回true的项组成的数组。
forEach():没有返回值。
map():返回每次函数调用的结果组成的数组。
some():该函数任一项返回true则返回true.

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

缩小方法:reduce()方法从数组的第一项开始逐个遍历到最后。reduceRight()则相反。接收两个参数:在每一项上调用的函数和作为缩小基础的初始值。传给reduce的函数接收四个参数,前一个值,当前值,项的索引和数组对象。

var values = [1,2,3,4,5];
var sum=values.reduce(function(prev,cur,index,array){
    return prev+cur;
});
alert(sum);//15

Date类型

var now = new Date();

创建特定日期的时间。必须传入表示该日期的毫秒数。有两个方法简化了这个过程:

Date.parse()和Date.UTC()。
var someDate = new Date(Date.parse("May 25,2004"));

如果传入的字符串不能表示日期,那么它会返回NaN.如果直接将表示日期的字符串传递给Date构造函数,也会在后台调用Date.parse()。

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

Date.UTC()的参数分别是年份,基于0的月份,月中的哪一天,小时,以此类推。只有前两个参数是必须的。其他的如果省略则为0.

var allFives = new Date(Date.UTC(2005,4,5,17,55,55));

基于系统设置的本地时区创建:

var date = new Date(2005,4,5,17,55,55);
Date.now():返回表示调用这个方法时的日期和时间的毫秒数。
var start = Date.now();
doSomething();
var end = Date.now();
var result = end - start;

Date类型的valueOf()方法返回日期的毫秒表示。

日期格式化方法:

toDateString()
toTimeString()
toLocaleTimeString()
toLocaleDateString()
toUTCString()
toGMTString()

方法:get与set差不多
getTime():返回毫秒数
getFullYear():返回年份
getMonth()。(0-11)
getDate():返回日期中的天书(1-31)
getDay():返回星期几,0表示星期天。

RegExp

正则表达式。
var expression = /pattern/flags
flags:
g:表示全局模式,即模式被应用与所有字符串,而非在发现一个匹配项时立即停止。
i:不区分大小写。
m:多行模式。即在到达一行文本末尾时还会继续查找下一行中是否存在于模式匹配的项。
匹配所有以at结尾的3个字符的组合。不区分大小写。
var pattern = /.at/gi;
正则表达式中的元字符:
( [ { \ ^ $ | ? * + . } ] )
这些字符都必须转义。
匹配第一个[bc]at,不区分大小写。
var pattern = /[bc]at/i;

除了使用字面量来定义正则表达式之外,还可用RegExp构造函数。
var pa = new RegExp(“[bc]at”,”i”);
由于参数是字符串,所以有时要进行双重转义。例如字符\被转移为\\。
区别:在ECMAScript3中,正则表达式字面量始终会共享一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例。ECMAScript5明确规定,使用字面量必须像直接使用RegExp构造函数一样,每次都新建新的RegExp实例。

RegExp实例属性:

global:是否设置了g标志。
ignoreCase:是否设置了i标志。
lastIndex:开始搜索下一个匹配项的字符位置。从0算起。
multiline:是否设置了m标志。
source:正则表达式的字符串表示,以字面量返回。

实例方法:
exec():专门为捕获组而设计的。exec()接收一个字符串参数。返回第一个匹配项信息的数组。这个Array还包含两个属性,
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 day and baby"
alert(matches[0])//"mom and day and baby"
alert(matches[1)//and day and baby
alert(matches[2)//and baby

test()方法返回boolean值。
valueOf()返回正则表达式本身。

RegExp构造函数属性:

input:最近一次要匹配的字符串。
lastMatch:最近一次匹配的项。
lastParen:最近一次匹配的捕获组。
leftContext:input字符串中lastMatch之前的文本。
rightContext:
multiline:是否使用多行模式。
这些长属性名有相应的短属性名。在此就不列出来了。而且Opera浏览器不支持很多属性。

var text = "this has been a short summer";
var pattern = /(.)hort/g;
if(pattern.test(text)){
    alert(RegExp.input);
    alert(RegExp.leftContext);
    ....
}

Function类型:

每个函数其实都是对象,都是Function类型的实例。函数名是指向函数对象的指针。因此函数没有重载。
函数声明与函数表达式:解析器会率先读取函数声明,并使其在任何代码之前可用,而函数表达式必须等到解析器执行到它所在的代码行才会被执行。
函数内部两个特殊的对象:
arguments:主要用途是保存函数参数。他还有一个callee的属性,也是一个指针。

function factorial(num){
    if(num <=1) return 1;
    else 
    return num * factorial(num-1);
}

可以使用callee避免与函数名耦合。

function factorial(num){
    if(num <=1) return 1;
    else 
    return num * arguments.callee(num-1);
}

this:引用的是函数据以执行的环境对象。
ECMAScript规范了另一个函数对象的属性:caller.保存调用当前函数的函数的引用。

function outer(){
    inner();
}
function inner(){
    alert(inner.caller);
}
outer();

为了实现更松散的耦合。

function inner(){
    alert(arguments.callee.caller);
}

当函数在严格模式下运行时,访问arguments.callee会导致错误。并且不能为函数的caller属性复制。

函数的属性和方法:
length:函数希望接受的命名参数的个数。
prototype:保存他们所有实例的真正所在。不可枚举。

每个函数都包含两个非继承而来的方法:apply()和call()。用途是在特定的作用域中调用函数。实际上等同于设置函数体内this对象的值。
apply()接收两个参数,运行函数的作用域,参数数组。可以是Array的实例,也可以是arguments对象。

function sum(num1,num2){
    return num1+num2;
}
funciton callsum1(num1,num2){
    return sum.apply(this,arguments);
}
funciton callsum2(num1,num2){
    return sum.apply(this,[num1,num2]);
}

注:在严格模式下,未指定环境对象而调函数,this值将是undefined。
call()方法与apply()的作用相同。只不过接收的第二个参数的方式不同,它要一个个传。

funciton callsum2(num1,num2){
    return sum.apply(this,num1,num2);
}

他们两个真正强大的地方是扩充函数赖以执行的作用域。

window.color = "red";
var o = {color:"blue"};
function say(){
    alert(this.color);
}
say.call(this);//red
say.call(window);//red
say.call(o);//blue;

ECMAScript5还定义了bind()方法,这个方法会创建一个函数的实例,其this值指向传给bind()函数的值。

var o = {color:"red"};
function say(){
    alert(this.color);
}
var objectsay=say.bind(o);
objectsay();//red

每个函数继承的toLacaleString,toSString,valueOf方法都只返回函数代码。返回的格式因浏览器而异。

基本包装类型

3个特殊的引用类型:Boolean,Number,String.实际上,每当读取一个基本类型的值时,后台就会创建一个对应的基本包装类型的对象。例如读取字符串时,后台过程如下:
1. 创建String类型的一个实例。
2. 在实例上调用指定的方法
3. 销毁这个实例。
引用类型与基本包装类型的主要区别就是对象的生存期:使用new操作符创建的引用类型的实例在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象则只存在一行代码的执行瞬间然后立刻被销毁。例如:
var s1 = “some text”;
s1.color=”red”;
alert(s1.color);//undefined

对基本包装类型的实例调用typeof会返回“object”.而且所有基本包装类型的对象都会装换为布尔值true.
Object构造函数根据传入值的类型返回相应基本包装类型的实例。

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

注:使用new调用基本包装类型的构造函数与直接调用同名的转型函数是不一样的。

var value = "25";
var number = Number(value);
alert(typeof number);//number
var obj = new Number(value);
alert(typeof obj);//object

基本类型与引用类型的布尔值的区别:

var falseObject = new Boolean(fasle);
var result = falseObject &&true;
alert(result);//true
var falseValue = false;
result = falseValue && true;
alert(result);//false;

alert(typeof falseObject);object
alert(typeof falseValue);boolean
alert(falseObject instanceof Boolean);//true
alert(falseValue instanceof Boolean);//false;

建议:永远不要使用Boolean对象。

Number类型的方法:
toFixed():按照指定的小数位返回数值字符串表示。
toExponential():以指数表示法输出,参数指定小数位数。
toPrecision():以合适的格式返回。参数为所有数值的位数。

var num = 10;
alert(num.toFixed(2));//10.00
alert(num.toExponential(1));//1.0e+1
alert(num.toPrecision(1));//1e+1

String类型的方法:
charAt():
charCodeAt():返回特定位置的字符的编码
concat():拼接字符串。但一般使用+号操作。
slice(begin,end):
substr(begin,返回的个数):
substring(begin,end):

var str = "hello world";
alert(str.charCodeAt(1));//101
alert(str[1]);//e
alert(str.charAt(1));//e
alert(str.slice(3));//lo world
alert(str.substring(3));//lo world
alert(str.substr(3));//lo world
alert(str.slice(3,7));//lo w
alert(str.substring(3,7));//lo w
alert(str.substr(3,7));//lo worl

如果传给他们的是负值,slice()方法会将传入的负值与字符串的长度相加,substr()方法会将负的第一个
参数加上字符串的长度,而将负的第二个参数转换为0。substring()方法会将所有负值都转换为0.

var str = "hello world";
alert(str.slice(-3));//rld
alert(str.substring(-3));//hello world
alert(str.substr(-3));//rld
alert(str.slice(3,-4));//"lo w";
alert(str.substring(3,-4));//"hel"(这个方法会将小的数当成开始位置,大的数当成结束位置)
alert(str.substr(3,-4));//"";(空字符串)

字符串位置方法:
indexOf():从头向后搜索
lastIndexOf():从尾向前搜索
都是从一个字符串中搜索给定的字符串,然后返回子字符串的位置。没有返回-1.可接收第二个参数,从指定的位置开始搜索。

var str = "hello world";
alert(str.indexOf("o"));//4
alert(str.lastIndexOf("o"));//7
alert(str.indexOf("o",6));//7
alert(str.lastIndexOf("o",6));//4

trim():创建一个字符串的副本。删除前置及后置的所有空格,然后返回结果。
toLowerCase():
toLocaleLowerCase():
toUpperCase():
toLacaleUpperCase():
字符串的模式匹配方法:
match():本质上与调用RegExp的exec()方法相同。只接收一个参数,正则表达式或RegExp对象。

var text = "cat,bat,sat,fat";
var pattern = /.at/;
var matches = text.match(pattern);
alert(macthes.index);//0
alert(matches[0]);//"cat"
alert(pattern.lastIndx);//0

search():返回字符串中第一个匹配项的索引。没有返回-1.也是传进正则表达式。

var text = "cat,bat,sat,fat";
alert(text.search(/at/));//1

replace();替换字符串。接收两个参数,第一个是RegExp对象或字符串(不会被转换为正则).第二个为一个字符串或一个函数。如果第一个是字符串,那么只会替换第一个字字符串。要想替换所有字字符串必须提供一个正则表达式,并且指定全局匹配。

var text = "cat,bat,sat,fat";
alert(text.replace("at","ond"));//"cond,bat,sat,fat";
alert(text.replace(/at/g,"ond"));//"cond,bond,sond,fond";

localeCompare(param)方法:比较两个字符串。分别返回负数(小于param)
0(等于param),正数(大于param)。视地区而定。
fromCharCode():跟charCodeAt()相反的操作。静态方法
alert(String.fromCharCode(104,101,108,108,111));//hello

单体内置对象

内置对象:Object,Array,String.不依赖于宿主环境。
单体内置对象:Global Math.
encodeURI():对整个URI进行编码,并且不会对本身属于URI的特殊字符进行编码,例如冒号,正斜杠等。
encodeURIComponent():对任何非标准的字符进行编码。多用于uri后面的查询参数。相对用的比较多。
decodeURI():
decodeURIComponent():

eval():像一个完整的ECMASCript解析器。接收执行的js字符串。被执行的代码具有与该执行环境相同的作用域链。

eval("var msg='hello world'");
alert(msg);//hello world

严格模式下,在外部访问不到eval()中创建的变量或函数。

Math:

var max = Math.max(3,54,23,39);
alert(max);//54
var min = Math.min(3,54,23,39);
alert(min);//3

舍入方法:

Math.ceil():执行向上舍入
Math.floor():向下舍入
Math.round():标准舍入

Math.random():返回0到1的随机值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值