这几天抽空学习了es6语法,关于字符串,数值,数组,函数以及对象的扩展,看到es6标准入门这本书,里面讲的扩展特别多,我认为有几部分在项目上用不到,就挑有用的当笔记学习了。

字符串的扩展

str.includes(str1, n) 返回布尔值,表示是否找到了参数字符串
 params: 第一个参数str1 必选, 要匹配的字符
       第二个参数n 可选 表示开始搜索的索引位置 第n个开始搜索到结束

  1. let str = 'hello world'
  2. let str1 = 'hello'
  3. console.log(str.includes(str1)); // true
  4. console.log(str.includes(str1, 4)) // false
 
str.startsWith(str1, n) 返回布尔值,表示参数字符串是否在原字符串的头部
 params: 和includes一样
  1. let str = 'hello world'
  2. let str1 = 'hello'
  3. console.log(str.startsWith(str1)); // true
  4. console.log(str.startsWith(str1, 0)) // true
 
str.endsWidth(str1, n) 返回布尔值,表示参数字符串是否在原字符串的尾部。
 params: 第一个参数str1 必选, 要匹配的字符
       第二个参数n 可选 表示开始搜索的索引位置 从第一个搜索到第n个结束

  1. let str = 'hello world'
  2. let str1 = 'hello'
  3. console.log(str.endsWith(str1)); // false
  4. console.log(str.endsWith(str1, 6)) // false
 
str.repeat(n) 返回一个新字符串,表示将原字符串重复n次

  1. let str = 'peter';
  2. str1 = str.repeat(2);
  3. console.log(str1) // peterpeter
ps:  1 n如果是小数,则会取整,不是四舍五入
  2 如果参数是 0 到-1 之间的小数,则等同于 0,这是因为会先进行取整运算。
          0 到-1 之间的小数,取整以后等于-0,repeat视同为 0
  3 n如果是负数,或Infinity,会报错,
  4 n如果是NaN ,则返回 空
  5 n如果是字符串类型的,解析器会强制转换成number类型,若是非数字的字符串,则返回 空。

  1. let str = 'peter';
  2. str1 = str.repeat(1.1);
  3. console.log(str1) // peter
  4.  
  5. console.log('peter'.repeat(-2)); // Uncaught RangeError: Invalid count value
  6. console.log('peter'.repeat(Infinity)); // Uncaught RangeError: Invalid count value
  7. console.log('peter'.repeat('abc')); // (为空,string类型)
  8. console.log('peter'.repeat('3')); // peterpeterpeter
  9. console.log('peter'.repeat(NaN)) // (为空,string类型)
 
str.padStart(len, str1) 若某个字符串不够指定长度,用str1补全头部
str.padEnd(len, str1) 若某个字符串不够指定长度,用str1补全尾部
 params: len: 可选 最小长度
       str1: 必选 补全的字符串
1 省略第二个参数,默认使用空格补全长度

  1. let str = 'hello'
  2. console.log(str.padStart('peter ')) // hello
  3. console.log(str.padEnd(' peter')) // hello
2 若原字符串的长度,>=指定的最小长度,则返回原字符串
   若两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串

  1. let str = 'hello'
  2. console.log(str.padStart(5, 'peter ')) // hello
  3. console.log(str.padEnd(8,' peter')) // hello pe
  4. console.log( '1'.padStart(10, '0') ) // "0000000001"
  5. console.log( '12'.padStart(10, '0') ) // "0000000012"
  6. console.log( '123456'.padStart(10, '0') ) // "0000123456"
  7. console.log( '13'.padStart(10, '2018-01-00') ) // "2018-01-12"
  8. console.log( '18-03-13'.padStart(10, '2018-00-00') ) // 2018-03-13

另外这本书也讲了模板字符串,这个我在一开始学的时候已经整理好了笔记,传送门

 
数值的扩展
 
前缀 0b 或者 0B 代表二进制

  1. console.log( 0b1011 === 11 ) // true
前缀 0o 或者 0O 代表八进制

  1. console.log( 0o555 === 365 ) // true
八进制,二进制,十二进制,六进制转成十进制   用Number()
  1. console.log( Number(0b1011) ) //
  2. console.log( Number(0o555) ) //
 
Number.isFinite() 判断数值是否是有限的,返回是布尔值
ps: 只要判断的数值不是number类型的,一律为false

  1. console.log( Number.isFinite(22222) ) //true
  2. console.log( Number.isFinite(NaN) ) // false
  3. console.log( Number.isFinite('abc') ) // false
 
Number.isNaN() 判断数值是否为NaN ,返回值是布尔值
ps: 只要值不是NaN,一律为false

  1. console.log( Number.isNaN(NaN) ) // true
  2. console.log( Number.isNaN(123) ) // false
  3. console.log( Number.isNaN('abc') ) // false
 
Number.parseInt()        将数值转化为整型,只去开头数字的整数部分,若开头是非数字的会返回NaN
Number.parseFloat()     将数值转化为浮点型,在上一个方法中小数点以前方法一样,小数点之后遇到非数字截止则返回
功能和parseInt(),parseFloat()一样,优点是减少了全局方法。

  1. console.log(Number.parseInt(12.34)) //
  2. console.log(Number.parseFloat('12.345af')) // 12.345
 
Number.isInteger() 判断数值是不是整数 返回值是布尔值

  1. console.log(Number.isInteger(20.2)) // false
  2. console.log(Number.isInteger(23)) //true
 
Number.EPSILON 常量 代表 1 与大于 1 的最小浮点数之间的差
Number.EPSILON === Math.pow(2, -52)    // true
 
Math对象
 
Math.trunc() 去除一个数的小数部分,返回整数部分 不四舍五入
ps:对于一个不是数字的值,返回结果为NaN

  1. console.log(Math.trunc(12.34)) //
 
Math.sign() 用来判断一个数到底是正数、负数、还是零 ,有5种参数
 参数为正数,返回+1;
 参数为负数,返回-1;
 参数为 0,返回0;
 参数为-0,返回-0;
 其他值,返回NaN
ps: 常见的false,null,会返回 0
     NaN ,undefined,非数字的字符串类型(包括空),返回是NaN
     true 返回为 +1
  1. console.log(Math.sign(-5)) // -1
  2. console.log(Math.sign(5)) // +1
  3. console.log(Math.sign(0)) //
  4. console.log(Math.sign(NaN)) // NaN
  5. console.log(Math.sign(false)) //
  6. console.log(Math.sign(null)) //
  7. console.log(Math.sign()) // NaN
  8. console.log(Math.sign('abc')) // NaN
  9. console.log(Math.sign('123')) //
  10. console.log(Math.sign(true)) //
 
Math.cbrt() 计算一个数的立方根,返回一个计算后的值
ps: 非数值类型的返回NaN

  1. console.log(Math.cbrt(8)) //
  2. console.log(Math.cbrt(true)) //
  3. console.log(Math.cbrt('abc')) // NaN
  4. console.log(Math.cbrt(false)) //
  5. console.log(Math.cbrt(NaN)) // NaN
  6. console.log(Math.cbrt(undefined)) //NaN
  7. console.log(Math.cbrt('8')); //
 
Math.log10(x) 返回以 10 为底的x的对数

  1. console.log(Math.log10(10)) //
  2. console.log(Math.log10(2)) // 0.3010299956639812
 
Math.log2(x) 返回以 2 为底的x的对数

  1. console.log(Math.log2(2)) //
  2. console.log(Math.log2(10)) // 3.321928094887362
 
指数运算 **

  1. console.log(2 ** 3) //
  2. console.log(2 ** 4) //
 
函数的扩展
 
rest参数 ...变量名
在函数的参数中,最后一个参数用...变量名,代表把这之后的所有参数放到数组中。简化操作。

  1. function fn(a,...arg){
  2. console.log(arg)
  3. }
  4. fn(1,2,3,4) // 这样代表 a传的参数是1, ...arg传的参数是[2,3,4]
rest参数和argument的区别:
 1 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。
 2 arguments对象不是一个真正的数组,是个伪数组。而剩余参数是真正的Array实例,可以调用数组的方法。
 3 arguments对象还有一些附加的属性
ps: 将伪数组转化成数组:Array.prototype.slice.call(arguments)
   rest参数只能作为函数的最后一个参数,否则会报错。

  1. function fn(a, ...arg, b){
  2. console.log(arg)
  3. }
  4. fn(1,2,3,4) // Uncaught SyntaxError: Rest parameter must be last formal parameter
   函数的参数的自身length不包含rest参数,即rest本身的自带length为 0  

  1. console.log((function(a) {}).length); //
  2. console.log((function(...arg) {}).length); //
  3. console.log((function(a,b,...arg){}).length) //
 
箭头函数 =>
省略了function,简化了操作。

  1. let fn = (a, b) => a + b
  2. console.log(fn(1,2)) //

等价与

  1. let fn = function(a, b){
  2. return a + b
  3. }
  4. console.log(fn(1,2)) //
圆括号 () 代表参数(没有参数或者多个参数),
大括号 {} 代表执行代码块(多于两条语句时,并return。如果只有一条语句,则不加{})
ps:箭头函数返回一个对象,必须在对象外面加上括号,否则会报错,因为大括号{}被解析成代码执行块

  1. let obj = (id)=>{
  2. id:1,
  3. name: 'peter'
  4. }
  5. console.log(obj()) // Uncaught SyntaxError:
  1. let obj = (id)=>({
  2. id:1,
  3. name: 'peter'
  4. })
  5. console.log(obj()) // {id: 1, name: "peter"}
  1. let a= [1,2,3,4].map(v=>v * v)
  2. console.log(a) // [1, 4, 9, 16]
箭头函数的注意点:
 1 箭头函数没有this值,箭头函数内的this值继承自外围作用域

  1. let fn = (a, b) => {
  2. console.log(this)
  3. }
  4. console.log(fn(1,2)) // window
 2 箭头函数不能适用与对象中方法声明,因为this也是指向window
  1. let obj = {
  2. name:'peter',
  3. say: ()=> {
  4. setTimeout(() => {
  5. console.log(this)
  6. });
  7. }
  8. }
  9. obj.say(); // window
修改后

  1. let obj = {
  2. name:'peter',
  3. say: function () {
  4. setTimeout(() => {
  5. console.log(this)
  6. });
  7. }
  8. }
  9. obj.say(); // obj
 3 箭头函数不能用于构造器,即不能new

  1. let Foo = () => {};
  2. let foo = new Foo(); // TypeError: Foo is not a constructor
 4 不可以使用arguments对象,该对象在函数体内不存在 ,若使用会报错

  1. let fn = (a,b)=>{
  2. console.log(arguments)
  3. }
  4. fn(1,2) // Uncaught ReferenceError: arguments is not defined
  5. let fn1 = function(a, b){
  6. console.log(arguments)
  7. }
  8. fn1(1,2) // Arguments(2) [1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ]
 5 箭头函数没有prototype属性

  1. let Foo = () => {};
  2. console.log(Foo.prototype); // undefined
 6 不可以使用yield命令,因此箭头函数不能用作 Generator 函数 
  yield 关键字通常不能在箭头函数中使用(除非是嵌套在允许使用的函数内)。因此,箭头函数不能用作生成器。
 7 =>不能换行

  1. var func = ()
  2. => 1; // SyntaxError: expected expression, got '=>'

什么情况下不能使用箭头函数,这位博主讲的很清楚,可以去看看 传送门

 
数组的扩展
 
扩展运算符 ...[]
用三个点将数组分成用逗号分隔的参数序列 相当与rest的逆运算

  1. function push(array, ...items) {
  2. array.push(...items);
  3. console.log(array) // [1, 2, 3, 4, 1, 2, 3, 4, 5, 5]
  4. }
  5. let item = [1,2,3,4,5,5]
  6. push([1,2,3,4],...item)
  7. function add(x, y) {
  8. return x + y;
  9. }
  10. console.log(add(...[1,2])) //
使用扩展运算符的好处
 1 可以不使用apply方法将数组转成参数

  1. // ES5 的写法
  2. let arr = Math.max.apply(null, [14, 3, 77])
  3. console.log(arr) //
  4. // ES6 的写法
  5. let arr1 = Math.max(...[14, 3, 77])
  6. console.log(arr1) //
  1. // ES5的 写法
  2. var arr1 = [0, 1, 2];
  3. var arr2 = [3, 4, 5];
  4. Array.prototype.push.apply(arr1, arr2);
  5.  
  6. // ES6 的写法
  7. let arr1 = [0, 1, 2];
  8. let arr2 = [3, 4, 5];
  9. arr1.push(...arr2);
 2 可以不使用concat合并数组

  1. let arr = [1,2,3,4].concat([5,6,7,8])
  2. console.log(arr) // [1, 2, 3, 4, 5, 6, 7, 8]
  3. let arr1 = [1,2,3,4,...[5,6,7,8]]
  4. console.log(arr1) // [1, 2, 3, 4, 5, 6, 7, 8]
 3 可以将字符串转化成数组

  1. let arr = [...'abc']
  2. console.log(arr) // ["a", "b", "c"]
 4 可以将伪数组转化成数组

  1. let nodeList = document.querySelectorAll('div');
  2. console.log(nodeList) // NodeList(4) [div, div, div, div]
  3. console.log(Array .isArray( nodeList )) // false
  4. let array = [...nodeList];
  5. console.log(array) // [div, div, div, div]
  6. console.log(Array .isArray( array )) // true
ps:不能将类似于对象形式的伪数组转化成数组

  1. let array = {
  2. '0': 'a',
  3. '1': 'b',
  4. '2': 'c',
  5. length: 3
  6. };
  7. console.log([...array]); // Uncaught TypeError: array is not iterable
 5 方便使用Generator 函数
 
es6 的方法已经总结道数组方法里了. 传送门
 
对象的扩展
 
扩展运算符 ...{}
对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中

  1. let z = { a: 3, b: 4 };
  2. let n = { ...z };
  3. console.log(n) // { a: 3, b: 4 }
 
对象属性简写表示法
对象可以用变量和函数作为对象的属性和方法,当属性名和属性值相同时,可以省略一个。方法也可以简写,看例子:

  1. let birth = '2018/03/14';
  2. const Person = {
  3. name: 'peter',
  4. birth, // 等同于birth: birth
  5. hello() { console.log('我的名字是', this.name); } // 等同于hello: function ()...
  6. };
 
属性名表达式
在声明对象的属性时,可以用标识符声明,es6可以用表达式来声明。
在使用对象字面量声明对象时,可以用中括号[]里写表达式
  1. let name = 'foo';
  2. let obj = {
  3. [name](){console.log(0)},
  4. ['a' + 'bc']: 123
  5. };
  6. console.log(obj) // {foo: ƒ, abc: 123}
ps,属性名表达式与简洁表示法,不能同时使用,会报错
 
super关键字
super 指向当前对象的原型对象,只用在对象的方法中

  1. const proto = {
  2. foo: 'hello'
  3. };
  4. const obj = {
  5. foo: 'world',
  6. find() {
  7. return super.foo;
  8. }
  9. };
  10. Object.setPrototypeOf(obj, proto);
  11. console.log(obj.find())// "hello"
 
对象方法:
 
Object.is(a, b) 在严格模式下用来比较两个值是否相等,返回值是布尔值
ps: +0 和 -0 在严格模式下相等, 但用Object.is() 不相等
   NaN 在严格模式不相等, 但用Object.is() 相等

  1. console.log(+0 === -0) //true
  2. console.log(Object.is(+0, -0)) // false
  3. console.log(NaN === NaN) // false
  4. console.log(Object.is(NaN, NaN)) // true
 
Object.assign(target,source1,source2...) 对象合并,浅拷贝,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
params: target 目标对象,要合并的所存在的容器,只有一个
      source 源对象,被合并的对象,可以多个
  1. const target = { a: 1 };
  2. const source1 = { b: 2 };
  3. const source2 = { c: 3 };
  4. Object.assign(target, source1, source2);
  5. console.log(target) // {a:1, b:2, c:3}
ps: 1 目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性,在嵌套中,该方法也是替换而不是添加
   2 如果只有一个参数,Object.assign会直接返回该参数。
     3 只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)
     4 属性名为 Symbol 值的属性,也会被Object.assign拷贝。
     5 浅拷贝,源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。

  1. const target = { a: 1, b: 1,c:{d:1,e:1} };
  2. const source1 = { b: 2, c: 2 };
  3. const source2 = { c: 3 };
  4. Object.assign(target, source1, source2);
  5. console.log(target) // {a:1, b:2, c:3}
  1. console.log(Object.assign({a:{b:1,c:1}})) // {a: {…}}
  1. const obj1 = {a: {b: 1}};
  2. const obj2 = Object.assign({}, obj1);
  3. obj1.a.b = 2;
  4. console.log(obj2.a.b) //
 
Object.setPrototypeOf(obj, proto) 用来设置一个对象的prototype对象,返回参数对象本身
params: obj: 代表当前的对象
    proto: 要设置的原型对象名

  1. let proto = {};
  2. let obj = { x: 10 };
  3. Object.setPrototypeOf(obj, proto);
  4. proto.y = 20;
  5. proto.z = 40;
  6. console.log(obj.x) //
  7. console.log(obj.y) //
  8. console.log(obj.z) //
上段代码将proto对象设为obj对象的原型,所以从obj对象可以读取proto对象的属性。
 
Object.getPrototypeOf(obj)     // 用来获取一个对象的prototype对象,返回参数对象本身
  1. let proto = {};
  2. let obj = { x: 10 };
  3. Object.setPrototypeOf(obj, proto);
  4. proto.y = 20;
  5. proto.z = 40;
  6. console.log(Object.getPrototypeOf(obj)) // {y: 20, z: 40}
 
Object.keys() 返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名

  1. let obj = {
  2. name: 'peter',
  3. age: 25,
  4. sex: '男'
  5. }
  6. console.log(Object.keys(obj)) // ["name", "age", "sex"]
 
Object.values() 返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值

  1. let obj = {
  2. name: 'peter',
  3. age: 25,
  4. sex: '男'
  5. }
  6. console.log(Object.values(obj)) // ["peter", 25, "男"]
 
Object.entries() 返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。

  1. let obj = {
  2. name: 'peter',
  3. age: 25,
  4. sex: '男'
  5. }
  6. console.log(Object.entries(obj)) // [Array(2), Array(2), Array(2)]

ps:当对象里套着一个对象时,以上方法是返回遍历第一次的值

对应的笔记和实例,我放到了GitHub,https://github.com/sqh17/notes

有什么问题请私信或留下评论,一起加油。

参考资料

阮一峰大大的es6标准入门:http://es6.ruanyifeng.com/

es6学习笔记--字符串&数值&数组&函数&对象的扩展的更多相关文章

  1. ES6学习笔记(字符串和数值)

    (一)字符串的扩展 1.字符串的遍历 for (let codePoint of 'foo') { console.log(codePoint) } // "f" // " ...

  2. ES6学习笔记(三)——数值的扩展

    看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...

  3. ES6学习笔记(五)函数的扩展

    1.函数参数的默认值 1.1基本用法 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console. ...

  4. ES6学习笔记(5)----数值的扩展

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 数值的扩展 1.Number对象的扩展(1)javascript的全局函数isNaN,isFin ...

  5. 学习笔记---C++伪函数(函数对象)

    C++里面的伪函数(函数对象)其实就是一个类重载了()运算符,这样类的对象在使用()操作符时,看起来就像一个函数调用一样,这就叫做伪函数. class Hello{ public: void oper ...

  6. ES6__字符串、数组、对象的扩展

    /** * 字符串的扩展 */ // 模板字符串 tab上面的反向符号 // 添加${} // let flag = true; // // let html = `<ul> // < ...

  7. es6重点笔记:数值,函数和数组

    本篇全是重点,捡常用的怼,数值的扩展比较少,所以和函数放一起: 一,数值 1,Number.EPSILON:用来检测浮点数的计算,如果误差小于这个,就无误 2,Math.trunc():取整,去除小数 ...

  8. Java 学习笔记 二维数组和对象数组

    定义二维数组 int[][] a = new int[4][5]; 可以不指定列数 int[][] a = new int[4][]; 获取行 int i = a.length(); 如果使用第一个例 ...

  9. ES6学习笔记四(类和对象)

    { // 构造函数和实例 class Parent{ constructor(name='mukewan'){ this.name=name; } } let v_parent=new Parent( ...

随机推荐

  1. 教我徒弟Android开发入门(二)

    前言: 上一期实现了简单的QQ登录效果,这一期继续对上一期进行扩展 本期的知识点: Toast弹窗,三种方法实现按钮的点击事件监听 正文:   Toast弹窗其实很简单,在Android Studio ...

  2. python requests库学习笔记(下)

    1.请求异常处理 请求异常类型: 请求超时处理(timeout): 实现代码: import requestsfrom requests import exceptions        #引入exc ...

  3. 权限认证 cookie VS token

    权限认证 cookie VS token 我前公司的应用都是 token 授权的,现公司都是维护一个 session 确认登录状态的.那么我在这掰扯掰扯这两种权限认证的方方面面. 工作流程 先说 co ...

  4. ActiveMQ、Stomp、SockJS入门级应用

    使用ActiveMQ.Stomp.SockJS实现实时在线聊天 ActiveMQ : 强大的开源即时通讯和集成模式的服务器.在本项目中充当消息代理服务器,stomp协议服务端. 安装:在官网下载,直接 ...

  5. 机器学习之Adaboost (自适应增强)算法

    注:本篇博文是根据其他优秀博文编写的,我只是对其改变了知识的排序,另外代码是<机器学习实战>中的.转载请标明出处及参考资料. 1 Adaboost 算法实现过程 1.1 什么是 Adabo ...

  6. Egret学习笔记.1 (写在前面的废话)

    我记得之前谁说过,大部分程序员入行,都是因为小的时候的游戏机啊,各种电子设备啊....觉得有意思,才入的行 . 至少我本人是因为之前上高中那会儿,喜欢玩手机.那会儿还是MTK,塞班的时代,喜欢拿着手机 ...

  7. vue项目中遇到的问题

    在 export defaul new Router({ )} 这个路由配置中一定要加mode : 'history' 否者就会在路由前面默认添加# 路由跳转的几种方式: 在VUE中使用less来编译 ...

  8. Console 口配置 Telnet 登录方式典型配置指导

    1.进入系统视图,启动 Telnet 服务 system-view [Sysname] telnet server enable 2.配置从 VTY 用户界面登录后可以访问的命令级别为 2 级 [Sy ...

  9. android WebP解析开源库-支持高清无损

    在我们的项目中需要支持WebP高清无损图片,推荐一个我们已经使用的解析开源库给大家:https://github.com/keshuangjie/WebpExample/tree/master/lib ...

  10. VC下ffmpeg例程调试报错处理

    tools/options/directories/include files  添加ffmpeg头文件所在路径 tools/options/directories/library files  添加 ...