函数的属性与方法
函数也是对象,对象也有属性和方法。每个函数都有length和prototype,length是函数参数的个数,而prototype是保存他们所有实例方法的真正所在,toString()和valueOf()都保存在它的名下
m2
每个函数都包含两个非继承而来的方法apply()和call(),这两个方法的用途都是在特定的作用域中调用函数。
//apply的运用
function sum(num1,num2){
return num1+num2
}
function callSum1(num1,num2){
return sum.apply(this,arguments);
}
function callSum2(num1,num2){
return sum.apply(this,[num1,num2])
}
alert(callSum1(10,10));//20
alert(callSum2(20,30));//50
//call的运用
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.call(this,num1,num2)
}
alert(callSum1(10,15))//25
这两种方法还能够填充函数的作用域
window.color="red";
var o={color:"yellow"};
function sayColor(){
alert(this.color)
}
sayColor();//red
sayColor.call(window);//red
sayColor.call(o);//yellow
这里直接用call访问到了o的color属性
基本包装类型
基本类型不是对象,讲道理是没有方法的,但是ECMAscript提供了3个特殊的引用类型:Boolean、Number、String。每当我们读取一个基本类型值的时候,后台就会创建一个基本包装类型的对象
var s1="someText";
var s2=s1.substring(3);
console.log(s1)//someText
console.log(s2)//eText
实际上在后台已经完成了下列操作
- 创建String类型的实例
- 在这个实例上调用方法
- 然后销毁这个实例
var s1=new String("some text");
var s2=s1.substring(3);
var s1=null;
经过以上处理,基本的字符串就变得跟对象一样了。而且上面三个步骤也分别适用于Boolean和Number。
**引用类型和包装类型的区别在于他们的生存期不同,使用new操作符产生的包装类型的实例在执行离开当前作用域之前一直保存在内存中。而自动创建的基本包装类型的对象,只存在与一行代码执行的瞬间,然后立即被销毁。这意味着我们不能给基本类型添加属性和方法。
var s1="some text";
var s1.name="burning";
console.log(s1.name);//undefined
**对于基本包装类型的实例调用typeof会返回object,而且所有包装类型的对象都会被转换为true;
var obj=new Object("someText");
alert(obj instancof String);//true;
对于Boolean类型的基本包装类型值,即使给他传入false值,也返回的是true,因为所有包装类型的对象都转换为了true;所以我们基本不用Boolean对象
var falseObj=new Boolean(false);
var result =falseObj&&true;
alert(result);//true
Number对象
Number对象也重写了valueOf()、toLocalString()、toString()方法,且基本不使用他的实例化Number类型
valuOf()返回对象表示的基本类型的数值,另外两个方法则返回字符串形式的数值。
Number提供了几个特殊的内置方法。
var num=10;
alert(num.toString());//10
alert(num.toFixed(2));//10.00//精确到小数点后x位,并用字符串表示
alrt(num.toxponential(1);//1.0+1,格式化数值,参数同样也是指定小数位
alert(num.toPrecision(1);//1e+1
alert(num.toPrecision(3));10.0//该方法会根据数值决定到底使用哪个方法,
String对象
这个类型是字符串对象的包装类型,可以像创建其他类型一样创建
var StringObj=new String("burning");
像Number类型一样,拥有valueOf(),toString()、toLocalString()方法
他的每一个实例都有一个length方法
var str="burning rotk";
console.log(str.length);//12
1、访问字符串中的特定字符:charAt()、charCodeAt()。这两个方法接收一个参数,charAt()0方法以单字符字符串的形式返回给定位置的字符,charCodeAt()返回编码值
var str="burning rotk";
alert(str.charAt(2));//r
alert(str.charCodeAt(2));//114
2、拼合字符串
concat()可以讲两段字符串拼合为一段
var str1="hello";
var str2=",world";
console.log(str1.concat(str2));//hello,world
3、创建新字符串
slice()、substr()、substring()三种方法,这三种方法第一个参数指定起始位置,不同的是第二个参数
var str="hello world";
console.log(str.slice(3))//lo world
console.log(str.substr(3))//lo world
console.log(str.substring(3))//lo world
console.log(str.slice(3,6))//lo
console.log(str.substr(3,6))//lo wor,他的第二个参数决定了从开始到结束的字符个数
console.log(str.substring(3,6))//lo
当第一个参数为负数的时候,他们三个就不同了。slice()方法会将传入的参数与字符串的长度相加,substr()方法将负的第一个参数加上字符串的长度,而将负的第二个参数转换为0,最后,substring()方法会将所有的负数转换为0。
var str="hello world";
console.log(str.slice(-3));//rld
console.log(str.substring(-3));//hello world
console.log(str.substr(-3));//rld
console.log(str.slice(3,-4));//lo w
console.log(str.substr(3,-4));//""
console.log(str.substring(3,-4));//hel
在这个例子中,
str.slice(3,-4)等同于str.slice(3,7)
str.substr(3,-4)等同于str.substr(3,0)
str.substring(3,-4)等同于str.substring(0,3)
4、字符串位置方法
indexOf()与lastIndexOf(),一个从头开始,一个回忆过去
var str="hello,world";
console.log(str.indexOf("o"));//4
console.log(str.lastIndexOf("o"));//7
hello,world中,o第一次出现是在4的位置,最后一次是在7的位置,如果只出现了一次,那么两个值相同
//通过循环来找到匹配字符串
var str="If you wanna go,baby let us go,if wanna rock";
var strArr=new Array();
var num=str.indexOf("o");
while(num>-1){
strArr.push(num);
num=str.indexOf("o",num+1);
}
console.log(strArr);//4 14 29 41
5、删除前置空格方法
trim()方法
var str=" hello,world"
var trimStr=str.trim();
console.log(str)//(空格)hello,world
console.log(trimStr)//hello,world
6、大小写转换方法
toUpperCase()和toLowerCase()
toLocaleUpperCase和toLocaleLowerCase()
var str="burning";
console.log(str);//burning
console.log(str.toUpperCase());//BURNING
console.log(str.toLocaleUpperCase());//BURNING
var str2="ROTK";
console.log(str2.toLowerCase())//rotk
console.log(str2.toLocaleLowerCase())//rotk
正则表达式相关
String类型有几个用于匹配字符串的方法。有一个类似exec()的方法:match()
这种方法非常依赖你是否使用了global标志(g),而exec()在未设置g的时候将会是第一个的值,并且要多次调用
var text="cat,sat,eat,bat";
var pattern=/.at/g;
var matches=text.match(pattern);//一个是模式去匹配字符串,一个是字符串去匹配模式
console.log(matches[0]);//cat
console.log(matches[1]);//sat,没使用g将会显示undefined
String正则相关的search()类,这个方法返回字符串中第一个匹配项目的索引;如果未找到就返回-1,并且是始终从头向后查找
var text="bat,cat,sat,fat";
var pos=text.search(/at/);
console.log(pos);//1
ECMA还提供给了我们replace方法。这个方法接收两个参数,第一个是一个RegExp对象或者是字符串,第二个可以是一个字符串或是函数。
var text="cat,fat,bat,eat";
var result=text.replace("at","ond");
console.log(result);//cond,fat,bat,eat