前言
本系列是之前的学习积累,主要针对JS教程入门时进行学习的记录整理。使用到的参考资料有菜鸟教程、阮一峰JS入门教程系列、网道等多个网站。内容主要基于 ECMAScript 5.1 版本,这是学习 JavaScript 语法的基础。
Number对象
Number作为构造函数时,它用于生成值为数值的对象。
var n = new Number(1);
typeof n // "object"
作为工具函数时,它可以将任何类型的值转为数值
Number(true) // 1
1. 静态属性
Number对象拥有以下一些静态属性(即直接定义在Number对象上的属性,而不是定义在实例上的属性)。
- Number.POSITIVE_INFINITY:正的无限,指向Infinity。
- Number.NEGATIVE_INFINITY:负的无限,指向-Infinity。
- Number.NaN:表示非数值,指向NaN。
- Number.MIN_VALUE:表示最小的正数(即最接近0的正数,在64位浮点数体系中为5e-324),相应的,最接近0的负数为-Number.MIN_VALUE。
- Number.MAX_SAFE_INTEGER:表示能够精确表示的最大整数,即9007199254740991。
- Number.MIN_SAFE_INTEGER:表示能够精确表示的最小整数,即-9007199254740991。
2. 实例方法
Number对象有4个实例方法,都跟将数值转换成指定格式有关
2.1 Number.prototype.toString()
用来将一个数值转为字符串形式。toString方法可以接受一个参数,表示输出的进制。如果省略这个参数,默认将数值先转为十进制,再输出字符串;否则,就根据参数指定的进制,将一个数字转化成某个进制的字符串。
(10).toString(2) // "1010"
(10).toString(8) // "12"
(10).toString(16) // "a"
toString方法只能将十进制的数,转为其他进制的字符串。如果要将其他进制的数,转回十进制,需要使用parseInt方法。
2.2 Number.prototype.toFixed()
toFixed()方法先将一个数转为指定位数的小数,然后返回这个小数对应的字符串。
(10).toFixed(2) // "10.00"
10.005.toFixed(2) // "10.01"
由于浮点数的原因,小数5的四舍五入是不确定的,使用的时候必须小心。
2.3 Number.prototype.toExponential()
toExponential方法用于将一个数转为科学计数法形式。
(10).toExponential() // "1e+1"
(10).toExponential(1) // "1.0e+1"
(10).toExponential(2) // "1.00e+1"
(1234).toExponential() // "1.234e+3"
(1234).toExponential(1) // "1.2e+3"
(1234).toExponential(2) // "1.23e+3"
2.4 Number.prototype.toPrecision()
Number.prototype.toPrecision()方法用于将一个数转为指定位数的有效数字
(12.34).toPrecision(1) // "1e+1"
(12.34).toPrecision(2) // "12"
(12.34).toPrecision(3) // "12.3"
(12.34).toPrecision(4) // "12.34"
(12.34).toPrecision(5) // "12.340"
2.5 Number.prototype.toLocaleString()
Number.prototype.toLocaleString()方法接受一个地区码作为参数,返回一个字符串,表示当前数字在该地区的当地书写形式。
(123).toLocaleString('zh-Hans-CN-u-nu-hanidec')
// "一二三"
该方法还可以接受第二个参数配置对象,用来定制指定用途的返回字符串。该对象的style属性指定输出样式,默认值是decimal,表示输出十进制形式。如果值为percent,表示输出百分数。
如果style属性的值为currency,则可以搭配currency属性,输出指定格式的货币字符串形式。
(123).toLocaleString('zh-Hans-CN', { style: 'currency', currency: 'CNY' })
// "¥123.00"
(123).toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })
// "123,00 €"
(123).toLocaleString('en-US', { style: 'currency', currency: 'USD' })
// "$123.00"
3. 自定义方法
Number.prototype对象上面可以自定义方法,被Number的实例继承。
Number.prototype.iterate = function () {
var result = [];
for (var i = 0; i <= this; i++) {
result.push(i);
}
return result;
};
(8).iterate()
// [0, 1, 2, 3, 4, 5, 6, 7, 8]
注意,数值的自定义方法,只能定义在它的原型对象Number.prototype上面,数值本身是无法自定义属性的。
var n = 1;
n.x = 1;
n.x // undefined
一旦被调用属性,n就自动转为Number的实例对象,调用结束后,该对象自动销毁。所以,下一次调用n的属性时,实际取到的是另一个对象,属性x当然就读不出来。
String对象
String对象是 JavaScript 原生提供的三个包装对象之一,用来生成字符串对象
var s1 = 'abc';
var s2 = new String('abc');
typeof s1 // "string"
typeof s2 // "object"
s2.valueOf() // "abc"
字符串对象是一个类似数组的对象(很像数组,但不是数组)。
new String('abc')
// String {0: "a", 1: "b", 2: "c", length: 3}
(new String('abc'))[1] // "b"
除了用作构造函数,String对象还可以当作工具方法使用,将任意类型的值转为字符串。
String(true) // "true"
String(5) // "5"
1. 静态方法
String对象提供的静态方法(即定义在对象本身,而不是定义在对象实例的方法),主要是String.fromCharCode()。该方法的参数是一个或多个数值,代表 Unicode 码点,返回值是这些码点组成的字符串。
String.fromCharCode() // ""
String.fromCharCode(97) // "a"
String.fromCharCode(104, 101, 108, 108, 111)
// "hello"
注意,该方法不支持 Unicode 码点大于0xFFFF的字符,即传入的参数不能大于0xFFFF(即十进制的 65535)。
2. 实例属性
String.prototype.length
字符串实例的length属性返回字符串的长度。
'abc'.length // 3
3. 实例方法
3.1 String.prototype.charAt()
charAt方法返回指定位置的字符,参数是从0开始编号的位置。
var s = new String('abc');
s.charAt(1) // "b"
s.charAt(s.length - 1) // "c"
如果参数为负数,或大于等于字符串的长度,charAt返回空字符串
3.2 String.prototype.charCodeAt()
charCodeAt()方法返回字符串指定位置的 Unicode 码点(十进制表示),相当于String.fromCharCode()的逆操作。
'abc'.charCodeAt(1) // 98
如果没有任何参数,charCodeAt返回首字符的 Unicode 码点。
如果参数为负数,或大于等于字符串的长度,charCodeAt返回NaN。
3.3 String.prototype.concat()
concat方法用于连接两个字符串,返回一个新字符串,不改变原字符串
如果参数不是字符串,concat方法会将其先转为字符串,然后再连接
var one = 1;
var two = 2;
var three = '3';
''.concat(one, two, three) // "123"
one + two + three // "33"
3.4 String.prototype.slice()
slice()方法用于从原字符串取出子字符串并返回,不改变原字符串。它的第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置)。
3.5 String.prototype.substring()
substring方法用于从原字符串取出子字符串并返回,不改变原字符串,跟slice方法很相像。它的第一个参数表示子字符串的开始位置,第二个位置表示结束位置(返回结果不含该位置)。
'JavaScript'.substring(0, 4) // "Java"
如果第一个参数大于第二个参数,substring方法会自动更换两个参数的位置。
如果参数是负数,substring方法会自动将负数转为0。
由于这些规则违反直觉,因此不建议使用substring方法,应该优先使用slice。
3.6 String.prototype.substr()
substr方法用于从原字符串取出子字符串并返回,不改变原字符串,跟slice和substring方法的作用相同。
substr方法的第一个参数是子字符串的开始位置(从0开始计算),第二个参数是子字符串的长度。
'JavaScript'.substr(4, 6) // "Script"
如果第一个参数是负数,表示倒数计算的字符位置。如果第二个参数是负数,将被自动转为0,因此会返回空字符串。
3.7 String.prototype.indexOf(),String.prototype.lastIndexOf()
indexOf方法用于确定一个字符串在另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回-1,就表示不匹配。
indexOf方法还可以接受第二个参数,表示从该位置开始向后匹配。
lastIndexOf方法的用法跟indexOf方法一致,主要的区别是lastIndexOf从尾部开始匹配,indexOf则是从头部开始匹配。
'hello world'.indexOf('o') // 4
'JavaScript'.indexOf('script') // -1
3.8 String.prototype.trim()
trim方法用于去除字符串两端的空格(还包括制表符(\t、\v)、换行符(\n)和回车符(\r)。),返回一个新字符串,不改变原字符串。
'\r\nabc \t'.trim() // 'abc'
3.9 String.prototype.toLowerCase(),String.prototype.toUpperCase()
toLowerCase方法用于将一个字符串全部转为小写,toUpperCase则是全部转为大写。它们都返回一个新字符串,不改变原字符串。
3.10 String.prototype.match()
match方法用于确定原字符串是否匹配某个子字符串,返回一个数组,成员为匹配的第一个字符串。如果没有找到匹配,则返回null。还可以使用正则表达式作为参数。
'cat, bat, sat, fat'.match('at') // ["at"]
'cat, bat, sat, fat'.match('xt') // null
返回的数组还有index属性和input属性,分别表示匹配字符串开始的位置和原始字符串。
3.11 String.prototype.search(),String.prototype.replace()
search方法的用法基本等同于match,但是返回值为匹配的第一个位置。如果没有找到匹配,则返回-1。可以使用正则表达式作为参数
'cat, bat, sat, fat'.search('at') // 1
replace方法用于替换匹配的子字符串,一般情况下只替换第一个匹配(除非使用带有g修饰符的正则表达式)。
3.12 String.prototype.split()
split方法按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组。可以使用正则表达式作为参数
-
如果分割规则为空字符串,则返回数组的成员是原字符串的每一个字符。
-
如果省略参数,则返回数组的唯一成员就是原字符串。
-
如果满足分割规则的两个部分紧邻着(即两个分割符中间没有其他字符),则返回数组之中会有一个空字符串。
-
如果满足分割规则的部分处于字符串的开头或结尾(即它的前面或后面没有其他字符),则返回数组的第一个或最后一个成员是一个空字符串。
-
split方法还可以接受第二个参数,限定返回数组的最大成员数。
'a|b|c'.split('|', 0) // []
'a|b|c'.split('|', 1) // ["a"]
'a|b|c'.split('|', 2) // ["a", "b"]
'a|b|c'.split('|', 3) // ["a", "b", "c"]
'a|b|c'.split('|', 4) // ["a", "b", "c"]
3.13 String.prototype.localeCompare()
localeCompare方法用于比较两个字符串。它返回一个整数,如果小于0,表示第一个字符串小于第二个字符串;如果等于0,表示两者相等;如果大于0,表示第一个字符串大于第二个字符串。
localeCompare方法会考虑自然语言的排序情况,将B排在a的前面。
localeCompare还可以有第二个参数,指定所使用的语言(默认是英语),然后根据该语言的规则进行比较。
Math对象、Date对象、RegExp对象
待更新
JSON对象
JSON规定:
-
复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
-
原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)。
-
字符串必须使用双引号表示,不能使用单引号。
-
对象的键名必须放在双引号里面。
-
数组或对象最后一个成员的后面,不能加逗号。
1.JSON.stringify()
JSON.stringify方法用于将一个值转为 JSON 字符串。该字符串符合 JSON 格式,并且可以被JSON.parse方法还原。
对于原始类型的字符串,转换结果会带双引号。
JSON.stringify(false) // "false"
JSON.stringify('false') // "\"false\""
JSON.stringify方法会忽略对象的不可遍历的属性。
JSON.stringify方法还可以接受一个数组,作为第二个参数,指定需要转成字符串的属性。
var obj = {
'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3'
};
var selectedProperties = ['prop1', 'prop2'];
JSON.stringify(obj, selectedProperties)
// "{"prop1":"value1","prop2":"value2"}"
只对对象的属性有效,对数组无效
第二个参数还可以是一个函数,用来更改JSON.stringify的返回值。
function f(key, value) {
if (typeof value === "number") {
value = 2 * value;
}
return value;
}
JSON.stringify({ a: 1, b: 2 }, f)
// '{"a": 2,"b": 4}'
处理函数是递归处理所有的键。
JSON.stringify还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。
JSON.stringify({ p1: 1, p2: 2 }, null, 2);
/*
"{
"p1": 1,
"p2": 2
}"
*/
JSON.stringify({ p1:1, p2:2 }, null, '|-');
/*
"{
|-"p1": 1,
|-"p2": 2
}"
*/
参数对象的toJson方法
如果参数对象有自定义的toJSON方法,那么JSON.stringify会使用这个方法的返回值作为参数,而忽略原对象的其他属性。
var user = {
firstName: '三',
lastName: '张',
get fullName(){
return this.lastName + this.firstName;
},
toJSON: function () {
return {
name: this.lastName + this.firstName
};
}
};
JSON.stringify(user)
// "{"name":"张三"}"
2.JSON.parse()
JSON.parse方法用于将 JSON 字符串转换成对应的值。
JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('"foo"') // "foo"
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // null
var o = JSON.parse('{"name": "张三"}');
o.name // 张三
为了处理解析错误,可以将JSON.parse方法放在try...catch代码块中
JSON.parse方法可以接受一个处理函数,作为第二个参数,用法与JSON.stringify方法类似。
function f(key, value) {
if (key === 'a') {
return value + 10;
}
return value;
}
JSON.parse('{"a": 1, "b": 2}', f)
// {a: 11, b: 2}