es5--标准库 Ⅱ

2019-01-09  本文已影响0人  guyigg

Array对象

Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组。Array构造函数有一个很大的缺陷,就是不同的参数,会导致它的行为不一致。所以不推荐用构造函数来生成新数组,而是直接使用数组字面量来生成新数组。

var arr = new Array(2);
arr // [ empty x 2 ];

// 无参数时,返回一个空数组
new Array() // []

// 单个正整数参数,表示返回的新数组的长度
new Array(1) // [ empty ]
new Array(2) // [ empty x 2 ]

// 非正整数的数值作为参数,会报错
new Array(3.2) // RangeError: Invalid array length
new Array(-3) // RangeError: Invalid array length

// 单个非数值(比如字符串、布尔值、对象等)作为参数,
// 则该参数是返回的新数组的成员
new Array('abc') // ['abc']
new Array([1]) // [Array[1]]

// 多参数时,所有参数都是返回的新数组的成员
new Array(1, 2) // [1, 2]
new Array('a', 'b', 'c') // ['a', 'b', 'c']

//字面量方式
var arr = [1, 2];
Array的静态方法和实例方法
var arr = ['a', 'b', 'c'];

[1, 2].map(function (e) {
  return this[e];
}, arr)
// ['b', 'c']
[1, 2, 3, 4, 5].filter(function (elem) {
  return (elem > 3);
})
// [4, 5] 满足大于3的数组成员,作为一个新数组返回。

var arr = [0, 1, 'a', false];
arr.filter(Boolean)
// [1, "a"]  返回数组arr里面所有布尔值为true的成员

var obj = { MAX: 3 };
var myFilter = function (item) {
  if (item > this.MAX) return true;
};
var arr = [2, 8, 3, 4, 1, 3, 2, 9];
arr.filter(myFilter, obj) // [8, 4, 9] 
//过滤器myFilter内部有this变量,它可以被filter方法的第二个参数obj绑定,返回大于3的成员
[1, 2, 3, 4, 5].reduce(function (a, b) {
  console.log(a, b);
  return a + b;
})
// 1 2
// 3 3
// 6 4
// 10 5
//最后结果:15

如果要对累积变量指定初值,可以把它放在reduce方法和reduceRight方法的第二个参数。处理空数组很有用
[1, 2, 3, 4, 5].reduce(function (a, b) {
  return a + b;
}, 10);
// 25 指定参数a的初值为10,所以数组从10开始累加,最终结果为25。注意,这时b是从数组的第一个成员开始遍历。
处理空数组
function add(prev, cur) {
  return prev + cur;
}
[].reduce(add)
// TypeError: Reduce of empty array with no initial value
[].reduce(add, 1)
// 1 由于空数组取不到初始值,reduce方法会报错。这时,加上第二个参数,就能保证总是会返回一个值。

由于这两个方法会遍历数组,所以实际上还可以用来做一些遍历相关的操作。比如,找出字符长度最长的数组成员。

function findLongest(entries) {
  return entries.reduce(function (longest, entry) {
    return entry.length > longest.length ? entry : longest;
  }, '');
}
findLongest(['aaa', 'bb', 'c']) // "aaa"
//上面代码中,先产生一个所有 Email 地址组成的数组,然后再过滤出以t开头的 Email 地址,最后将它打印出来。
var users = [
  {name: 'tom', email: 'tom@example.com'},
  {name: 'peter', email: 'peter@example.com'}
];

users
.map(function (user) {
  return user.email;
})
.filter(function (email) {
  return /^t/.test(email);
})
.forEach(function (email) {
  console.log(email);
});
// "tom@example.com"

包装对象

对象是 JavaScript 语言最主要的数据类型,三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”。所谓“包装对象”,就是分别与数值、字符串、布尔值相对应的NumberStringBoolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。包装对象的最大目的,首先是使得 JavaScript 的对象涵盖所有的值,其次使得原始类型的值可以方便地调用某些方法。NumberStringBoolean如果不作为构造函数调用(即调用时不加new),常常用于将任意类型的值转为数值、字符串和布尔值。

//生成包装对象
var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);

三种包装对象各自提供了许多实例方法,它们共同具有、从Object对象继承的方法:valueOftoStringvalueOf方法返回包装对象实例对应的原始类型的值。toString方法返回对应的字符串形式。

原始类型的值,可以自动当作包装对象调用,即调用包装对象的属性和方法。这时,JavaScript 引擎会自动将原始类型的值转为包装对象实例,在使用后立刻销毁实例。假如abc是一个字符串,本身不是对象,不能调用length属性。JavaScript 引擎自动将其转为包装对象,在这个对象上调用length属性。调用结束后,这个临时对象就会被销毁。这就叫原始类型与实例对象的自动转换。自动转换生成的包装对象是只读的,无法修改。所以,字符串无法添加新属性。除了原生的实例方法,包装对象还可以自定义方法和属性,供原始类型的值直接调用。

注意:调用结束后,包装对象实例会自动销毁。这意味着,下一次调用字符串的属性时,实际是调用一个新生成的对象,而不是上一次调用时生成的那个对象,所以取不到赋值在上一个对象的属性。如果要为字符串添加属性,只有在它的原型对象String.prototype上定义。

Boolean对象

Boolean对象是 JavaScript 的三个包装对象之一。作为构造函数,它主要用于生成布尔值的包装对象实例。注意false对应的包装对象实例,布尔运算结果也是trueBoolean对象除了可以作为构造函数,还可以单独使用,将任意值转为布尔值。这时Boolean就是一个单纯的工具方法。使用双重的否运算符(!)也可以将任意值转为对应的布尔值。

Number对象

Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用。Number对象拥有以下一些静态属性(即直接定义在Number对象上的属性,而不是定义在实例上的属性)。

Number对象有4个实例方法,都跟将数值转换成指定格式有关。
//toString方法可以接受一个参数,表示输出的进制。
//如果省略这个参数,默认将数值先转为十进制,再输出字符串;否则,就根据参数指定的进制,将一个数字转化成某个进制的字符串。
(10).toString() // "10"

//10一定要放在括号里,这样表明后面的点表示调用对象属性。如果不加括号,这个点会被 JavaScript 引擎解释成小数点,从而报错。
10.toString(2) // SyntaxError: Unexpected token ILLEGAL

//通过方括号运算符也可以调用toString方法。
10['toString'](2) // "1010"

String对象

String对象是 JavaScript 原生提供的三个包装对象之一,用来生成字符串对象。字符串对象是一个类似数组的对象(很像数组,但不是数组)。除了用作构造函数,String对象还可以当作工具方法使用,将任意类型的值转为字符串。

String的静态方法和实例方法
如果分割规则为空字符串,则返回数组的成员是原字符串的每一个字符。
'a|b|c'.split('') // ["a", "|", "b", "|", "c"]

如果省略参数,则返回数组的唯一成员就是原字符串。
'a|b|c'.split() // ["a|b|c"]

如果满足分割规则的两个部分紧邻着(即两个分割符中间没有其他字符),则返回数组之中会有一个空字符串。
'a||c'.split('|') // ['a', '', 'c']

如果满足分割规则的部分处于字符串的开头或结尾(即它的前面或后面没有其他字符),则返回数组的第一个或最后一个成员是一个空字符串。
'|b|c'.split('|') // ["", "b", "c"]
'a|b|'.split('|') // ["a", "b", ""]

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"]

Math对象

Math是 JavaScript 的原生对象,提供各种数学功能。该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用。

Math的静态属性
Math的静态方法
Math对象的三角函数方法
上一篇 下一篇

猜你喜欢

热点阅读