四、JavaScript对象
(一)基本数据类型对象
1.String
var strString = new String("This is a string"); //创建对象
var anotherString = 'But this is also a string'; //创建字符串
new关键字很重要,如果省略,仅是字符串基本类型而不是String对象。但如果只是创建了字符串基本类型的变量,在该变量上调用与String相关的方法时,该变量就会被当作String对象的实例。
2.Boolean
var newboolean1 = new Boolean();
var newboolean2 = new Boolean(0);
var newboolean3 = new Boolean(false);
Boolean对象只有继承属性,方法包括toString()和valueof()
var newboolean = new Boolean("false");
var bool = newboolean.valueof();
var strbool = newboolean.tostring();
3.Number
- 属性
Number.MAX_VALUE
Number.MIN_VALUE
Number.NaN
Number.NEGATIVE_INFINITY
Number.POSITIVE_INFINITY
以上属性只可以通过Number对象进行访问,而不是对象实例。如果基于实例访问,将会返回undefined值。
- 方法
number.toExponential();
number.toFixed();
number.toPrecision();
number.toString();
number.valueOf();
以上方法为Number对象实例方法。与布尔不同的是,Number的toString()方法还接受另一个参数。
(二)其他功能的内置对象
1.Math
- 属性
Math.E; //常数e
Math.LN10; //10的自然对数
Math.LN2; //2的自然对数
Math.LOG2E; //以2为底,e的对数
Math.LOG10E; //以10为底,e的对数
Math.PI;
Math.SQRT1_2; //1/2的平方根
- 方法
Math.sin(x); //特定角度
Math.ceil(x); //向上取整
Math.floor(x); //向下取整
Math.round(x); //四舍五入取整
Math.exp(x); //e的幂值
Math.pow(2,3); //2的3次方
Math.max(1,2,3);
Math.random(); //[0,1)的随机数字
2.Date
var date = new Date();
当创建日期对象时,如果没有传入任何参数,那么所创建的日期是当前客户端计算机的日期和时间;如果传入可选的参数,则将创建出制定日期值的对象。
Date.now();
Date.UTC();
Date.parse();
实例方法包括访问日期各个部分的getter和setter方法,转成格式化字符串以及以上三个静态方法。
3.RegExp
var search = new RegExp('s+','g');
var search = /s+/i;
通过显式和RegExp字面量创建,表示这个一个正则表达式,不是其他类型的对象。
var re = /hello world/;
var re = /hello world/i; //不区分大小写
var re = /hello world/g; //全局匹配,如果不用,只会替换或返回第一个匹配项
var re = /hello world/m; //多行匹配 ^表示一行的开头,$表示一行的结束
var str = 'hello World';
re.test(str);
test()方法判断以参数传入的字符串是否与正则表达式相匹配。
var re = new RegExp("js*","ig");
var str = 'sdga;mlfjgjsdkgjs=@$sdnjs';
var resultArray = re.exec(str);
while(resultArray){
re.lastIndex
resultArray = re.exec(str);
}
exec方法根据模式在字符串中进行查找,并返回一个数组。
尽管在应用程序中使用RegExp对象,但是通常正则表达式和RegExp对象与String对象的regex方法一起使用。
3.1正则表达式的小知识
- 四种字符:(*)表示星号前面的字符出现零次或多次;(+)表示加号前面的字符出现一次或多次;(?)表示问号前面的字符出现一次或零词;(.)表示字符只出现一次
- 两种匹配:贪婪匹配(.*)可以查找到任何字符;延迟匹配(.*?)只能查找到一次
- \D:用于匹配非数字字符([^0-9]); \d:匹配数字([0-9]); \w:匹配任何数字字母字符(A-Za-z0-9)
(三)内置的聚合对象
1. Array
var newArray = new Array();
var newArray = new Array('1','hey');
var newarray = ['1','hey'];
通过构造函数和字面量值创建数组,JS会立即把字面量转换为Array类型的对象并将结果赋给变量。
newarray.length //返回数组的长度
newarray.splice(beginindex,number,'',''……) //返回数组中移除的元素,并替换原数组的元素。
newarray.concat(array);
newarray.slice(beginindex,lastindex);
newarray.reverse();
newarray.join(" "); //以空格隔开每个数组元素
2.基于Array方法的FIFO队列
- push方法:将元素添加到数组末尾 unshift方法:将元素添加到数组开始。两者返回值都是数组新的长度。
- pop方法:移除数组的最后一个元素 shift方法:移除第一个元素。两者返回值都是从数组移除的元素。
综合例题
//随机色彩生成器
function randomColor () {
var r = Math.floor(Math.random()*255).toString(16);
r = (r.length<2)? "0"+r ; r;
var g = Math.floor(Math.random()*255).toString(16);
g = (g.length<2)? "0"+g ; g;
var b = Math.floor(Math.random()*255).toString(16);
b = (b.length<2)? "0"+b ; b;
return "#"+r+g+b;
}
五、函数
函数实际上和对象相似,可以定义一个函数,创建一个新的函数,甚至输出一个函数。所以可以将一个函数赋给一个变量或数组元素,甚至可以将其作为参数传给另一个函数调用。
(一)声明式的函数(静态的)
function function_name (param1,param2,……,paramn) {
function statements
}
(二)匿名函数(动态的)
var function_name = new Function('param1','function statements');
function_name('param1');
通过构造器函数创建,函数本身不是直接声明的,也没有对其进行命名。当JS处理时,都动态的重新构建该函数。
(三)函数字面量(函数表达式)
var function_name = function(params){
statements;
}
var function_name = function func(params){
statements;
}
函数字面量像匿名函数一样也没有定义函数名称,但是除了把该函数赋给一个变量之外,函数字面量和声明式函数是类似的。也可以指定带有名称的函数,专门为递归函数设计。
1.递归函数
处理如DOM之类的tree-line结构数据,但是占用的内存和资源都比较多,也难以实现和维护。
2.嵌套函数和闭包
function outer(args){
function inner(args){
inner statements;
}
}
当一个内部函数是外部应用程序的返回值,并赋给一个外部变量时,内部函数的作用域就将被附加到外部函数上,然后再附加到主调应用程序中。这样才能保证内外参数和变量的完整性。
JavaScript中的闭包就是返回在其他函数中以内部对象形式创建的一个函数字面量,然后将其赋值给主调应用程序的一个变量。
3.回调函数
Array数组中有根据一些事件自动调用的方法,包括filter,forEach,every,map,some以及使用函数字面量定义的函数,当以这种形式使用时,称为回调函数。
- filter方法:用来确保添加到数组中的元素能够满足特定的标准。可以将任何东西存放到数组中,无需注意检查分别添加。
- forEach方法:参数是一个函数,这个函数逐一处理每一个元素且不对数组产生影响。
- map方法:对所有元素执行回调函数,并将结果创立一个新数组。
- every方法:对每一个元素执行回调函数,直到其中一个元素返回false为止。
- some方法:对每一个元素执行回调函数,直到其中一个元素返回true为止。