一. 字符串的扩展
为字符串添加了iterator,可以被for...of遍历
includes、startswith、endswith都会返回布尔值,且支持第二个参数(开始搜索的位置),endswith针对前n个字符,其他两个都是从第n个到结束
repeat返回一个新字符串,参数为重复的次数(小数会向下取整,负数或infnity会报错,0到-1等同于0,字符串会转为数字)
padstart、padend在头部或尾部补全,第一个参数是字符串最小长度,第二个参数是用来补齐的字符串
模板字符串`${...}`
二. 数值的扩展
number.isfinite检查一个值是否是有限的,对非数值一律返回false
number.isnan检查一个值是否是nan,只有nan才返回true;
传统方法isfinite isnan都会先调用number()将非数值转为数值
number.parseint(),number.parsefloat()与传统方法一样,目的是减少全局方法是语言模块化
number.isinteger()判断是否为整数
number.epsilon是一个极小的常量,浮点数计算的误差小于这个值就ok
js的准确整数范围:-2^53~2^53(不含两端),
number.max_safe_integer = math.pow(2, 53) - 1;
number.min_safe_integer = -number.max_safe_integer;
number.issafeinteger()是用来判断一个整数是否落在这个范围之内;
math.trunc() 去除小数部分返回整数部分;
math.sign() 判断是整数负数还是0;
math.cbrt() 计算一个数的立方根;还有一些对数方法、三角函数方法;
指数运算符2 ** 3 === 8,与math.pow实现不同,对于特别大的运算,运算结果最后一位有不同;
三. 数组的扩展
array.from可以将类数组对象和可遍历的对象转为数组,扩展运算符也可以将某些对象转数组;
可以接受第二个参数,类似于map方法,将处理的值返回数组;
array.of将一组值转为数组;
copywithin将指定位置的成员复制到其他位置;
array.prototype.copywithin(target, start = 0, end = this.length)
find找到第一个符合条件的成员,参数是一个回调函数;
findindex返回第一个符合条件的数组成员的位置
fill使用给定值填充数组,二三参数可以指定开始结束位置;
keys、values、entries
includes,indexof一是不够语义化,二是内部使用===判断,
[nan].indexof(nan) // -1 , [nan].includes(nan) // true
map的has是用来查找键名的,set的has是用来查找值的
数组的空位是没有任何值,0 in [,,] // false,es6中会将空位转为undefined,应当避免出现空位
四. 函数的扩展
允许为函数设置默认值,如果非尾部的参数设置默认值,实际上这个参数是没法省略的;
定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数;
如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了;
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。
rest参数(...变量名)
扩展运算符(...),将一个数组转为用逗号分隔的参数序列。
/* 替代数组的apply方法 */// es5的写法function f(x, y, z) { // ...}var args = [0, 1, 2];
f.apply(null, args);// es6的写法function f(x, y, z) { // ...}var args = [0, 1, 2];
f(...args);/* --------------------------------- */// es5的写法math.max.apply(null, [14, 3, 77])// es6的写法math.max(...[14, 3, 77])// 等同于math.max(14, 3, 77);/* --------------------------------- */// es5的写法var arr1 = [0, 1, 2];var arr2 = [3, 4, 5];
array.prototype.push.apply(arr1, arr2);// es6的写法var arr1 = [0, 1, 2];var arr2 = [3, 4, 5];
arr1.push(...arr2);
箭头函数使用注意:
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作 generator 函数。
五. 对象的扩展
属性简写表示法
属性名表达式,[变量名]
方法的name属性返回函数名(即方法名)
object.is,与===基本一致,不同在于一是+0不等于-0,二是nan等于自身
// es5实现object.isobject.defineproperty(object, 'is', {
value: function(x, y) {if (x === y) { // 针对+0 不等于 -0的情况 return x !== 0 || 1 / x === 1 / y;
}// 针对nan的情况return x !== x && y !== y;
},
configurable: true,
enumerable: false,
writable: true});
object.assign(target, o1, o2)用于对象的合并,若果有同名属性,后面会覆盖前面的;实行的浅拷贝
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错;
object.getownpropertydescriptor方法可以获取该属性的描述对象。
属性的遍历:
for...in、object.keys、object.getownpropertynames(obj)、object.getownpropertysymbols(obj)、reflect.ownkeys(obj)
__proto__与object.setprototypeof()作用相同,用来设置一个对象的prototype对象,object.getprototypeof()
object.keys(),object.values(),object.entries()
object.getownpropertydescriptors返回指定对象所有自身属性(非继承属性)的描述对象;
以上就是es6之各种数据类型的扩展实例详解的详细内容。