广告
返回顶部
首页 > 资讯 > 精选 >es6有arguments吗
  • 171
分享到

es6有arguments吗

2023-07-04 10:07:13 171人浏览 安东尼
摘要

这篇文章主要介绍了es6有arguments吗的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇es6有arguments吗文章都会有所收获,下面我们一起来看看吧。es6有arguments,但箭头函数是不识别ar

这篇文章主要介绍了es6有arguments吗的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇es6有arguments吗文章都会有所收获,下面我们一起来看看吧。

es6有arguments,但箭头函数是不识别arguments的,所以用rest(剩余参数)来取代arguments;剩余参数直接就固定到数组里了,而arguments是类数组(本质是个对象),还需要转换。剩余参数语法允许将一个不定数量的参数表示为一个数组,不定参数定义方式,这种方式很方便的去声明不知道参数情况下的一个函数。

一、arguments用法

1. 说明

es6中箭头函数是不识别arguments的。所以用rest来取代arguments。

ES6之后,都用剩余参数代替arguments了,剩余参数直接就固定到数组里了,而arguments是类数组(本质是个对象),还需要转换。

2. arguments的常用操作

(1). 获取参数长度

(2). 根据索引获取参数

(3). 获取当前arguments所在的函数

代码分享:

{  console.log("----------------1. arguments常用操作-------------------");  function Test1() {    // arguments长什么样?---本质是一个对象    // {    //     '0': 1,    //     '1': 2,    //     '2': 3,    //     '3': 4,    //     '4': 5,    //     '5': 6,    //     '6': 7,    //     '7': 8    //   }    console.log(arguments);    // 常见的对arguments的操作是三个    // 1.获取参数的长度    console.log(arguments.length);    // 2.根据索引值获取某一个参数    console.log(arguments[0]);    console.log(arguments[1]);    console.log(arguments[2]);    // 3.callee获取当前arguments所在的函数    console.log(arguments.callee);  }  //调用  Test1(1, 2, 3, 4, 5, 6, 7, 8);}

3. 将arguments转换成数组

{  console.log("----------------2. 将arguments转换成数组-------------------");  function Test2() {    // 方案1-自己遍历    {      let newArray = [];      for (let i = 0; i < arguments.length; i++) {        newArray.push(arguments[i]);      }      console.log(newArray);    }    // 方案2-Array.prototype.slice将arguments转成array    {      let newArray2 = Array.prototype.slice.call(arguments);      console.log(newArray2);    }    // 方案3-ES6语法 Array.From    {      console.log(Array.from(arguments));    }    // 方案4-ES6语法 剩余参数    {      console.log([...arguments]);    }  }  //调用  Test2(1, 2, 3, 4, 5, 6, 7, 8);}

4.  箭头函数中没有arguments

{  console.log("----------------3. 箭头函数中没有arguments-------------------");  let Test3 = () => {    console.log(arguments);  };  Test3(1, 2, 3, 4);}

二. ES6剩余参数和展开运算符

1. 剩余参数(Rest Parameter)

 剩余参数语法允许我们将一个不定数量的参数表示为一个数组,不定参数定义方式,这种方式很方便的去声明不知道参数情况下的一个函数。

代码分享

{  console.log("-----------------1. 剩余参数---------------------");  function sum1(...nums) {    console.log(nums);    console.log(      nums.reduce((preValue, currentValue) => preValue + currentValue, 0)    ); //求和  }  //调用  sum1(1, 2); //[1,2]  sum1(1, 2, 3); //[1,2,3]  sum1(1, 2, 3, 4); //[1,2,3,4]  function sum2(num1, num2, ...nums) {    console.log(nums);    console.log(      nums.reduce(        (preValue, currentValue) => preValue + currentValue,        num1 + num2      )    ); //求和  }  //调用  sum2(1, 2); //[]  sum2(1, 2, 3); //[3]  sum2(1, 2, 3, 4); //[3,4]}

2.  展开运算符(Spread Operator)

 把固定的数组内容“打散”到对应的参数。

代码分享:

{  console.log("-----------------2. 展开运算符---------------------");  function sum1(num1, num2) {    console.log(num1 + num2);  }  // 调用  let arry1 = [10, 20];  sum1(...arry1);  function sum2(num1, num2, num3) {    console.log(num1 + num2 + num3);  }  //调用  let arry2 = [10, 20, 30];  sum2(...arry2);}

总结:

   1. Spread Operator 和 Rest Parameter 是形似但相反意义的操作符,简单的来说 Rest Parameter 是把不定的参数“收敛”到数组,而 Spread Operator 是把固定的数组内容“打散”到对应的参数。

   2. Rest Parameter 用来解决函数参数不确定的场景,Spread Operator 用来解决已知参数集合应用到固定参数的函数上

三. apply/call/bind用法总结

 1. apply 和 call都是为了改变被调用函数中this的指向, 同时立即执行该函数

 2. bind也是为了改变函数中this的指向,但它返回的是一个函数,需要被调用才能执行

 3. apply 和 call的第一个参数都是传入绑定到对象,用于改变this指向,但是

     (1). apply是将需要传入函数的参数放到一个数组里,传入到第二个参数的位置

     (2). call是从第2,3,4.....位置依次传入需要的参数

 4. bind 后续传入参数的形式和call相同,从第2,3,4.....位置依次传入需要的参数,bind返回的是一个函数,需要再次调用

代码分享:

// 案例1--隐式绑定{  console.log("----------------案例1--------------------");  let name = "ypf1";  let age = 18;  let obj = {    name: "ypf2",    myAge: this.age,    getMsg: function () {      console.log(this.name, this.age);    },  };  // 调用  console.log(obj.myAge); //undefined (隐式绑定,this指向obj)  obj.getMsg(); //ypf2,undefined  (隐式绑定,this指向obj)}//案例2--只绑定,不传参{  console.log("----------------案例2--------------------");  let name = "ypf1";  let age = 18;  let obj = {    name: "ypf2",    myAge: this.age,    getMsg: function () {      console.log(this.name, this.age);    },  };  let obj2 = { name: "ypf3", age: 35 };  // 调用  obj.getMsg.apply(obj2); //ypf 35 (apply显式绑定优先级高于隐式绑定,this指向obj2)  obj.getMsg.call(obj2); //ypf 35 (call显式绑定优先级高于隐式绑定,this指向obj2)  obj.getMsg.bind(obj2)(); //ypf 35 (bind显式绑定优先级高于隐式绑定,this指向obj2)}// 案例3--传递参数{  console.log("----------------案例3--------------------");  let name = "ypf1";  let age = 18;  let obj = {    name: "ypf2",    myAge: this.age,    getMsg: function (msg1, msg2) {      console.log(this.name, this.age, msg1, msg2);    },  };  let obj2 = { name: "ypf3", age: 35 };  //调用  obj.getMsg.apply(obj2, ["消息1", "消息2"]);  obj.getMsg.call(obj2, "消息1", "消息2");  //bind用法1  obj.getMsg.bind(obj2, "消息1", "消息2")();  //bind用法2--多次传参  let fn1 = obj.getMsg.bind(obj2, "消息1");  fn1("消息2");}

四. apply/call/bind用js实现

1. apply

   (1). xxFn.ypfapply(), 在ypfapply中,this指向xxFn函数

   (2). 需要实现出入 null 或 undefined的时候,this指向window

   (3). 使用 delete 可以删除对象的某个属性

   (4). 通过Function.prototype原型添加

   (5). || 用法

     argArray = argArray?argArray:[]  等价于

     argArray = argArray || []

代码分享:

Function.prototype.ypfapply = function (thisArg, argArray) {  // 1. this指向调用函数  let fn = this;  // 2. 获取传递参数  thisArg = thisArg != null && thisArg != undefined ? Object(thisArg) : window;  //3. 赋值函数并调用  thisArg.fn1 = fn;  argArray = argArray || [];  let result = thisArg.fn1(...argArray);  //4. 删除thisArg绑定的属性  delete thisArg.fn1;  //5.返回结果  return result;};// 测试function test1() {  console.log(this);}function sum(num1, num2) {  console.log(this, num1, num2);  return num1 + num2;}// 1. 利用系统自带的apply测试console.log("----------1.利用系统自带的call测试---------------");test1.apply(null);let result1 = sum.apply("ypf1", [10, 20]);console.log(result1);// 2. 利用自己写的测试console.log("----------2.利用自己写的测试---------------");test1.ypfapply(null);let result2 = sum.ypfapply("ypf1", [10, 20]);console.log(result2);

2. call

(1). xxFn.ypfcall(), 在ypfcall中,this指向xxFn函数

(2). 需要实现出入 null 或 undefined的时候,this指向window

(3). 使用 delete 可以删除对象的某个属性

(4). 通过Function.prototype原型添加

代码分享:

Function.prototype.ypfcall = function (thisArg, ...args) {  // 1. 指向待调用的函数  let fn = this;  //2. 获取绑定对象  thisArg = thisArg != null && thisArg != undefined ? Object(thisArg) : window;  //3.调用函数  thisArg.fn1 = fn;  let result = thisArg.fn1(...args);  //4. 删除多余的属性  delete thisArg.fn1;  //5. 最终返回  return result;};// 测试function test1() {  console.log(this);}function sum(num1, num2) {  console.log(this, num1, num2);  return num1 + num2;}// 1. 利用系统自带的call测试console.log("----------1.利用系统自带的call测试---------------");test1.call(undefined);let result1 = sum.call("ypf1", 10, 20);console.log(result1);// 2. 利用自己写的测试console.log("----------2.利用自己写的测试---------------");test1.ypfcall(undefined);let result2 = sum.ypfcall("ypf1", 10, 20);console.log(result2);

3. bind

 (1). bind和call相同,接收到参数是依次传递,另外bind返回的是函数!!

 (2). xxFn.ypfbind(), 在ypfbind中,this指向xxFn函数

 (3). 需要实现出入 null 或 undefined的时候,this指向window

 (4). 使用 delete 可以删除对象的某个属性

 (5). 由于bind返回的是函数,所以需要声明1个函数, 并返回这个函数

      函数内部核心点:由于bind可以一次性传递参数,也可以多次传递参数,所以需要对两个参数进行一下合并    

代码分享:

Function.prototype.ypfbind = function (thisArg, ...argArray) {  // 1. this指向调用的函数  let fn = this;  // 2. 处理绑定参数  thisArg = thisArg != null && thisArg != undefined ? Object(thisArg) : window;  // 3. 声明一个函数  function DyFun(...argArray2) {    // 绑定函数    thisArg.fn1 = fn;    // 合并参数    let finalArgArray = [...argArray, ...argArray2];    // 调用函数    let result = thisArg.fn1(...finalArgArray);    // 删除用完的属性    delete thisArg.fn1;    // 返回结果    return result;  }  //4. 返回一个函数  return DyFun;};// 测试function test1() {  console.log(this);}function sum(num1, num2) {  console.log(this, num1, num2);  return num1 + num2;}// 1. 利用系统自带的bind测试console.log("----------1. 利用系统自带的bind测试---------------");test1.bind(undefined)();let result1 = sum.bind("ypf1", 10, 20);console.log(result1());let result2 = sum.bind("ypf2", 10);console.log(result2(30));// 2. 利用自己写的测试console.log("----------2.利用自己写的测试---------------");test1.bind(undefined)();let result3 = sum.bind("ypf1", 10, 20);console.log(result3());let result4 = sum.bind("ypf2", 10);console.log(result4(30));

关于“es6有arguments吗”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“es6有arguments吗”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: es6有arguments吗

本文链接: https://www.lsjlt.com/news/344419.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • es6有arguments吗
    这篇文章主要介绍了es6有arguments吗的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇es6有arguments吗文章都会有所收获,下面我们一起来看看吧。es6有arguments,但箭头函数是不识别ar...
    99+
    2023-07-04
  • 从ES6开始弱化arguments的作用
    ES6弱化arguments的作用 通过一下手段: 箭头函数没有arguments这个2.2 隐式参数形参可以有默认值数组结构方式 function test(...arr) { ...
    99+
    2023-02-12
    ES6弱化arguments arguments 弱化
  • es6有闭包吗
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。一、变量作用域变量根据作用域的不同分为两种:全局变量和局部变量。函数内部可以使用全局变量。函数外部不可以使用局部变量。当函数执行完毕,本作用域内的局部变量...
    99+
    2022-11-22
    javascript ES6 闭包
  • es6 map有序吗
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。一、map集合JavaScript的对象(object),本质是上键值对的集合,但是传统上只能用字符串当做键值对。为了解决这个问题,ES6提供了map数据...
    99+
    2022-11-22
    javascript ES6
  • es6中有&符号吗
    本篇内容介绍了“es6中有&符号吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!有&符号。在es6中,“&&...
    99+
    2023-07-04
  • es6的map是有序吗
    本篇内容主要讲解“es6的map是有序吗”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6的map是有序吗”吧!map是有序的。ES6中的map类型是一种储存着许多键值对的有序列表,其中的键名...
    99+
    2023-07-04
  • 你真的知道什么是arguments吗
    是的,arguments 是一个特殊的 JavaScript 对象,它包含了函数被调用时传递给函数的所有参数。它类似于一个数组,可以...
    99+
    2023-09-21
    arguments
  • es6的class有变量提升吗
    本文小编为大家详细介绍“es6的class有变量提升吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“es6的class有变量提升吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。es6的class没有变量提升。在...
    99+
    2023-06-29
  • ecmascript5是es6吗
    这篇文章主要为大家展示了“ecmascript5是es6吗”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ecmascript5是es6吗”这篇文章吧。 ...
    99+
    2022-10-19
  • es6中set类型是有序的吗
    这篇文章主要介绍了es6中set类型是有序的吗的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇es6中set类型是有序的吗文章都会有所收获,下面我们一起来看看吧。es6中set类型是有序的。set类型是es6中新...
    99+
    2023-06-29
  • es6有遍历对象的方法吗
    今天小编给大家分享一下es6有遍历对象的方法吗的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。有,遍历方法:1、“for......
    99+
    2023-07-04
  • es6中的class有静态属性吗
    这篇文章主要介绍“es6中的class有静态属性吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“es6中的class有静态属性吗”文章能帮助大家解决问题。es6中的class没有静态属性。静态属性是...
    99+
    2023-07-05
  • es6支持import吗
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。当模块化的概念越来越重要的时候,在es6中,引入了模块的语法:import ,下面我们简单了解一下,import是怎么使用的。1、export一个js文件...
    99+
    2023-05-14
    ES6 import
  • es6是框架吗
    本文小编为大家详细介绍“es6是框架吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“es6是框架吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。es6不是框架,而是一种JavaScript语言的标准。es6是E...
    99+
    2023-07-04
  • ie8支持es6吗
    这篇“ie8支持es6吗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ie8支持es6吗”...
    99+
    2022-10-19
  • es2015就是es6吗
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。“es”简介es全称“ECMAScript”,是根据 ECMA-262 标准实现的通用脚本语言,ECMA-262 标准主要规定了这门语言的语法、类型、语句...
    99+
    2022-11-22
    javascript ES6
  • promise是es6的吗
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。ECMAScript 6 增加了对 Promises/A+ 规范的完善支持,即 Promise 类型。一经推出,Promise 就大受欢迎,成为了主导性的...
    99+
    2022-11-22
    ES6 promise
  • hbuilder支持es6吗
    这篇文章主要介绍“hbuilder支持es6吗”,在日常操作中,相信很多人在hbuilder支持es6吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”hbuilder支持es6吗”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-04
  • nodejs支持es6吗
    本文小编为大家详细介绍“nodejs支持es6吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs支持es6吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。nodejs支持es6。Node.js是针对现...
    99+
    2023-07-04
  • ie6能兼容es6吗
    这篇文章主要讲解了“ie6能兼容es6吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ie6能兼容es6吗”吧!ie6不能兼容es6。IE6不支持识别ES6语法,会报错。解决方法:1、引入b...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作