JavaScript有一些内置类型,还有很多常用的内置的方法,本文稍作总结,以备查阅。
值类型
我的理解,值类型是分配在栈上的,而引用类型(当然也包括引用类型内部的值类型)是分配在堆上的。值类型是不可以改变的,比如:
var s = "hello"; s = "hello2";
上述并没有将字符串"hello"改成"hello2",而是新创建了一个字符串"hello2",前一个字符串仍然存在(只不过无法访问了),并于当前作用域被回收时销毁。
值类型很简单,有五种:undefined,null,boolean,number,string,都通过字面量来创建。有两点需要注意
- 值类型没有方法,诸如3.1415.toFixed(2)或者"hello".toUpperCase()的用法,实际上都已经对值类型进行了包装。
- undefined和null的区别:前者通常表示一个不存在的/非法的值类型变量,后者表示一个不存在的/非法的引用类型变量。
- number支持八进制012和十六进制0xA的字面值。
包装类型
在值类型变量上调用函数或方法,浏览器会事先对其进行包装为对象,然后调用该对象的相关方法,如3.1415.toFixed(2),就是先把值类型包装为内置的Number类型,然后调用Number类型的toFixed方法。我们也可以显式地进行手动包装:
var n = new Number(3.1415);
包装类型的实例可以看做是临时对象,在调用过需要的函数后就不能再访问了,因此其上的方法不会影响变量原先的值。比如:
var x = 3.1416; x.name = "PI"; // var tmpx = new Numer(x); // tmpx.name = "PI"; console.log(x.name);
包装类型有很多有用的内置方法:
Number
在值类型变量或字面量(为方便,举例都在字面量上直接调用,下同)上调用方法:
- toFixed(n):指定小数位数,如21.628.toFixed(2)返回"21.628"。
- toExponential(n):指定小数位数并以科学计数法输出,如21.628.toExponential(2)返回"2.16e+1"
- toPrecision(n):指定有效数字位数,如21.628.toPrecision(4)返回"21.63"。如果精度不到个位,以科学计数法表示,如21.628.toPrecision(1)返回"2e+1"。
注意,以上三个方法返回的都是字符串。
String
在值类型变量或字面量上调用方法:
- charAt(i):返回字符串中指定位置的字符(返回的类型还是字符串),如"hello".charAt(1)返回"e"。
- charCodeAt(i):返回指定位置字符编码,如"hello".charCodeAt(1)返回"101"。
- concat(arguments):连接字符串,接收任意多个参数。如"hello".concat(" world", "!")返回"hello world!"。但实际上,我们更常使用+运算符连接字符串。
- slice(i1, i2):返回指定两个索引值间的字串,如"hello world".slice(3, 7)返回"lo w"。如果i2没有指定,默认为最后一个字符的索引值。
- substring(i, n):返回从指定索引值开始,具有某个长度的子串,如"hello world".substring(3, 7)返回"lo worl"。如果n没有指定,效果与slice一致。
- substr(i1, i2):与slice(i1, i2)相同。唯一区别在于索引值i为负的时候,如"hello".substr(-3, 4)会被转化为"hello".substr(5-3, 4)返回"ll",而substr(-3, 4)会被转为"hello".substr(0, 4)返回"hell"。
- indexOf(s, i):从索引值i的位置顺序搜索字符串,返回子串第一次出现的位置,若不设定i,默认为0。
- lastIndexOf(s, i):从索引值i的位置逆序搜索字符串,返回子串第一次出现的位置,若不设定i,默认为length-1。
- trim():删除所有前置和后置的空格,如" hello world! ".trim()会返回"hello world!"。
- toLowerCase和toUpperCase():大小写转换,如"Hello".toUpperCase()会返回"HELLO"。
- localeCompare(s):字典法比较两个字符串大小,如"bag".localeCompare("bad")返回1,而"bag".localeCompare("baggage")返回-1。
字符串的模式匹配方法记录在正则表达式的章节。
引用类型
引用类型,也就是对象(object)。对象可以通过对象字面量来创建,也可以通过对象字面量来创建,也可以通过构造函数来创建。JavaScript的内置对象包括Object,Array, Date, Math, Function,RegExp,它们都继承自Object类型。继承的相关知识留在专门章节总结,函数和正则表达式也是。
Object
使用字面量创建的对象就是Object类型。Object类型的方法主要包括,注意其他内置方法也很可能有类似的方法,他们都(覆盖式地)继承自Object方法。
Array
- 可以通过字面量[1, "hello", {x:3}]创建数组,也可以通过构造函数new Array(20)或new Array(1, "hello", {x:3})创建数组。数组内置方法较多:
- toString(s):以逗号(默认)或其他分隔符输出数组(即对数组中每个元素调用toString()方法并用分隔符相连),如[1, "hello", {x:1}].toString(";")返回"1;hello;[object object]"。
- push(ele)和pop():从数组尾端压入或弹出元素。
- unshift(ele)和shift():从数组前端压入或弹出元素。
- reverse():反转数组。
- sort(func):升序排序数组,默认将数组中的所有元素转化为字符串排序(即使所有元素都是数字),如[10, 1, 5].sort会产生[1, 10, 5]。也可以利用参数func指定规则,func(v1, v2)如果v1<v2则返回-1(其实负值就行)。
- concat(arguents):连接数组,可以传入任意多个参数,如[1, 2].concat(3, [4, 5], 6)会返回[1, 2, 3, 4, 5, 6],注意该函数没有改变数组本身,而是返回了一个新对象。
- slice(i1, i2):提取子数组,与String中的slice类似,同样没有改变原数组,而是返回了新的对象。
- splice(i1, i2, ele1, ele2, ele3, ...):强大的方法,可以删除、插入、替换数组中的项。
- 删除:[1, 2, 3, 4, 5].splice(1, 3)会返回[2, 3, 4]而使原数组变成[1, 5]。
- 插入:[1, 2, 3].splice(2, 0, -1, -3)会返回[]而使原数组变成[1, 2, -1, -3, 3]。
- 替换:[1, 2, 3, 4, 5].splice(2, 2, -1, -2)会返回[3, 4]而使原数组变成[1, 2, -1, -2, 5]。
- indexOf(ele, i)和lastIndexOf(ele, i),返回指定元素的索引值,参考String类型的同名函数。
- some(func):对每一项执行func,若有一项返回true,该函数返回true。如[1, 2, 3].some(function(ele){return ele<1;})返回false。
- every(func):数组中的每一项都使func返回true,则返回true。如[1, 2, 3].every(function(ele){return ele<5})返回true。
- filter(func):返回一个子数组,其中的每一项元素都使func返回true。如[1, 2, 3].filter(func(ele, index){return index%2 == 0;})返回[1, 3]。
- forEach(func):对每一项元素都执行func,无返回值。如var arr=[]; [1, 2, 3].forEach(function(ele, index){arr.push(index);})返回[0, 1, 2]。
- map(func):对每一项元素执行func,并返回由返回值构成的数组。如[1, 2, 3].map(function(ele){return -ele;})返回[-1, -2, -3]。
- 以上五个迭代方法,func的签名都是func(ele, index, arr),三个参数分别表示数组项、索引值和原数组。如果想改变原数组,可使用arr[index]。
- reduce(func, ori):归并所有项并构建一个最终返回值,func为归并方法。如[1,2,3].reduce(function(prev, cur){return prev*2+cur}, -1)返回3,即(((-1)*2+1)*2+2)*2+3。 reduceRight(func, initial):迭代从数组尾部开始。
- 以上两个归并方法func的签名是func(prev, cur, index, arr),分别表示前一项,当前项,索引值和原数组。第一次归并时,prev取ori,若ori没有指定,默认为0。