• es6 函数的使用


    参数的默认值

    先来看一下原先的写法:

    1. function demo(n){
    2. var name=n||'aa'//默认
    3. console.log(name);
    4. }
    5. demo('bb') // bb
    6. demo() // aa
    7. demo(null) // aa
    8. demo('') // aa

    可以看到以上方法不能0之类的话,隐式转化后布尔类型是FALSE的,会还用默认值

    es6:

    1. function demo(n='aa'){//es6的默认值
    2. console.log(n);
    3. }
    4. demo('bb') // bb
    5. demo(0) // 0
    6. demo(null) // null
    7. demo(nudefined) // 报错

    改成es6后默认值,只有在传入undefined时,才会触发默认值赋值,传入其他值,也可以正常的解析出来,供我们使用了,在我们指定默认值了之后,不能再函数再定义同名的值,并且我们书写默认值时,指定默认值的变量必须放到最后一项否则默认值不会生效,少传参的一项也会undefined,或者直接指定第二个参数是undefined,但是不够简洁,一般情况不会这样写

    1. function demo(a,b='b',c){//es6的默认值需要写到参数的最后
    2. console.log(a);
    3. console.log(b);
    4. console.log(c);
    5. }
    6. demo(0,null) // 0 null undefined
    7. demo(0,undefined,null) // 0 b null
    8. demo(undefined) // undefined b undefined

    不定参数

    不定参数用来表示不确定参数个数,形如,...变量名,由...加上一个具名参数标识符组成。具名参数只能放在参数组的最后,并且有且只有一个不定参数。

    1. function sum(num,...arr){ //...必须是最后一个参数
    2. console.log(num) // 1
    3. arr.forEach(function(item){
    4. num+=item
    5. })
    6. console.log(num); // 10
    7. }
    8. sum(1,2,3,4)

    通过例子,很清晰能看到,在 扩展运算符(...)之前的变量是正常的赋值,当定义的变量用完后,剩下的参数存在 ...arr 中

    注:不定参数并不是适合所有的函数使用,只在特定的情境下会比较适用,比方说刚刚案例中的求和函数,就十分适合把参数收集起来放在数组中进行求和,在适当的情况下使用它可以事半功倍,减少代码量,提高开发效率。不定参数必须在最后一项,否则报错

    箭头函数

    箭头函数是ES6给我们介绍一种全新的定义函数的方式,就是用箭头符号(=>),故得名为箭头函数。具体语法直接来看案例:

    1. // 基本语法
    2. var fn = (a,b=10) => {
    3. return a + b
    4. }
    5. console.log(fn(1)) // 11
    6. // 只有一个参数时可以省略(),函数体只有一行解析为 return+语句,并且可以省略{}
    7. var fn1 = a => a
    8. console.log(fn1(1)); // 1
    9. // fn1 等同于 f
    10. // var f = function(a){
    11. // return a;
    12. // }
    13. // 没有参数只写一个(),函数体不想return的话,加上{}
    14. var fn2 = () => {console.log('fn2执行了,但是没有返回值')};
    15. console.log(fn2()); // undefined
    16. var fn3 = (a,b) => a+b
    17. console.log(fn3(1,1)); // 2
    18. // 想要返回对象,因为{}和箭头函数语法冲突,需要再包一层()
    19. var fn4 = (a,b) => ({name:a,age:b})
    20. console.log(fn4('zs',18)); // {name: 'zs', age: 18}

    箭头函数的特点

    1、箭头函数体中的 this 对象,是定义函数时的对象,而不是使用函数时的对象。直接看例子

    1. // 在全局挂载一个 age 100
    2. var age = 100
    3. let sayFn = function() {
    4. console.log(this.age)
    5. }
    6. let obj = {
    7. age: 18,
    8. that:this,
    9. say: sayFn
    10. };
    11. let obj1 = {
    12. age: 18,
    13. that:this,
    14. say: () => {
    15. console.log(this.age);
    16. }
    17. };
    18. let obj2 = {
    19. age:20,
    20. say: function() {
    21. (()=>console.log(this.age))()
    22. }
    23. };
    24. sayFn() // 100
    25. console.log(obj.that); // window
    26. obj.say() // 18
    27. console.log(obj1.that); // window
    28. obj1.say(); // 100
    29. obj2.say(); // 20

    这样就可以直观的看到,普通函数和箭头函数this指向的不同

    obj2和obj1的this一样,但是里面的箭头函数的this指向的是 obj2.say的this也就是obj2

    并且但是在箭头函数中,this是固定的。

    1. // 回调函数
    2. var obj = {
    3. age: 18,
    4. sayHello: function () {
    5. setTimeout(function () {
    6. console.log(this.age);
    7. });
    8. }
    9. };
    10. var age = 20;
    11. obj.sayHello(); // 20
    12. var obj1 = {
    13. age: 18,
    14. sayHello: function () {
    15. setTimeout(()=>{
    16. console.log(this.age);
    17. });
    18. }
    19. };
    20. var age = 20;
    21. obj1.sayHello(); // 18

    2、箭头函数不能作为构造函数,不能使用new ,会抛出一个错误

    3、箭头函数没有arguments,如果要用,可以用 rest (...) 参数代替

    4、不可以使用yield命令,因此箭头函数不能用作 Generator 函数

    5、因为this指向不变,箭头函数通过call和apply调用,只会传入参数

    6、箭头函数没有原型对象

  • 相关阅读:
    全面解读视频生成模型Sora
    ARM的七种工作模式
    京东大数据:2023年Q3美妆行业数据分析报告
    redis持久化
    云原生入门实战
    一起Talk Android吧(第三百六十六回:多线程之LOCK锁)
    DML——数据库查询语言
    SmartInitializingSingleton接口
    MySQL实用安装教程
    day36 | 435. 无重叠区间、763.划分字母区间、56. 合并区间
  • 原文地址:https://blog.csdn.net/paidaboluo/article/details/126092407