fe-interview icon indicating copy to clipboard operation
fe-interview copied to clipboard

[js] 第27天 说说你对arguments的理解,它是数组吗?

Open haizhilin2013 opened this issue 5 years ago • 21 comments

第27天 说说你对arguments的理解,它是数组吗?

haizhilin2013 avatar May 12 '19 20:05 haizhilin2013

object like array

grepug avatar May 13 '19 00:05 grepug

arguments是一个对象。

js不能像java一样实现重载,arguments对象可以模拟重载。

js中每个函数都会有arguments这个实例,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身。

arguments他的特性和使用方法

特性:

1.arguments对象和Function是分不开的。

2.因为arguments这个对象不能显式创建。

3.arguments对象只有函数开始时才可用。

使用方法:

虽然arguments对象并不是一个数组,但是访问单个参数的方式与访问数组元素的方式相同

例如:

arguments[0],arguments[1]...

Amour1688 avatar May 13 '19 02:05 Amour1688

arguments并不是一个数组, 但是它有length属性以及可以以下标的形式取值

buzhanhua avatar May 13 '19 03:05 buzhanhua

arguments 不是数组,是类数组。 类数组 转 数组的方法有

  • [...arguments]
  • Array.from(arguments)
  • Array.prototype.slice.call(arguments)

tiu5 avatar May 15 '19 07:05 tiu5

用来获取函数参数 [].slice.call(arguments)

es6 显式提供 function foo(...args){}

arguments.callee 在匿名函数中指向这个函数

tzjoke avatar May 28 '19 14:05 tzjoke

  • arguments 不是数组,但是它有数组类似的length属性 可以通过 Arrary.from(arguments) 转化为数组。也可以通过Arrary.prototype.foEach.call(argunment),
  • Arrary.from 能够转化类数组对象成为数组

myprelude avatar Jun 13 '19 07:06 myprelude

严格模式禁用了arguments.callee

DarthVaderrr avatar Jul 04 '19 02:07 DarthVaderrr

arguments是个伪数组,它有数组的length以及下标取值;但是它不能用数组的一些方法,例如:Array.push()之类的

getanimation avatar Jul 17 '19 06:07 getanimation

var list = document.getElementById('test-list'); var listchild = list.children; 那这种ul标签下li获取出来的listchild也是类数组了呗,难怪无法直接foreach

wyx2014 avatar Jul 24 '19 06:07 wyx2014

arguments 并不是数组,是一个 array like 对象,它有 length 这个属性。通常情况下,为了使用方便我们会把 arguments 转成数组,方法有下面几种。即使不转为数组,可以使用下标访问。如 arguments[0]

  • [...arguments]
  • Array.from(arguments)
  • [].slice.call(arguments)

一般情况下不会对 arguments 进行操作。但在实现一些低级或者通用功能时候会使用到,如实现一个泛柯理化的函数,或者根据参数的数量执行不同的方法(类似函数的重载)。

Konata9 avatar Aug 12 '19 15:08 Konata9

类数组对象(js权威指南)记得第一次啃书就看的这一节,所以这个名词记得非常清楚

他是一个对象,是类数组对象(js权威指南),他有着和数组几乎一样的api,比如length,自增key,增加一个key自动增加length,使之可以用arg[0]来访问数据 可以通过arguments来访问,传入的参数,arg[0] 如果更改了arguments的值的话,那么传入的参数也会被改变,因为前者是后者的一个引用;

seho-dev avatar Aug 14 '19 14:08 seho-dev

var list = document.getElementById('test-list'); var listchild = list.children; 那这种ul标签下li获取出来的listchild也是类数组了呗,难怪无法直接foreach

是的,目前好像只有这2个情况会产生类数组对象

seho-dev avatar Aug 14 '19 14:08 seho-dev

        1.实参列表,是类数组,不是数组
        2.是传入参数的一个镜像(浅拷贝)
        3.arguments.callee是函数本身, 严格模式禁用arguments.callee

zhangkuibao avatar Sep 09 '19 02:09 zhangkuibao

  • 是一个类数组,有下标有length
  • arguments.callee指向函数本身,但是严格模式下禁用此属性
  • 转换为数组的方法

[...arguments] Array.from(arguments) [].slice.call(arguments)

blueRoach avatar Jun 23 '20 09:06 blueRoach

arguments并不是一个数组, 但是它有length属性以及可以以下标的形式取值

MrZ2019 avatar Sep 28 '20 06:09 MrZ2019

arguments是一个类数组对象,只能在非箭头函数内部访问,可以通过Array.from(arguments)将arguments转化为数组,它和数组的区别是除了length和索引访问跟数组一样之外没有push和pop等方法。

bozaigao avatar Oct 05 '20 13:10 bozaigao

他是个类数组

zxcdsaqwe123 avatar Oct 16 '21 16:10 zxcdsaqwe123

arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性 特性:

1.arguments对象和Function是分不开的。 2.因为arguments这个对象不能显式创建。 3.arguments对象只有函数开始时才可用。

github-cxtan avatar Feb 19 '22 09:02 github-cxtan

简单来说:

  1. arguments在函数执行过程中,在函数体内部才能访问。
  2. arugments是一个类数组对象,也即有length属性,属性值为number的对象,因此不可以使用Array.prototype上的方法。
  3. arugments的作用:可以获取到实参、可以通过callee属性访问函数自身。

yxllovewq avatar Mar 09 '22 06:03 yxllovewq

arguments是类数组,可以以下标去获取arguments[0],也可以通过Array.from(arguments)或者 Array.prototype.slice.call(arguments)转成真正的数组

xiaoqiangz avatar May 29 '22 04:05 xiaoqiangz

arguments 是实参列表,它是一个类数组,并不是真正意义上的数组,它拥有length属性,但不能使用数组上的方法,如push,pop,unshift,shift,slice等,arguments.callee 是用来得到函数本身的一种方法,在严格模式下被禁用,通常情况下我们会将arguments转为数组使用,方法如下: [...arguments] ,Array.from(arguments) 这两种是ES6新增的方法,在ES5中我们使用 : Array.prototype.slice.call(arguments); slice(start,end),截取数组,不改变原数组,返回一个新数组

wyy-g avatar Sep 15 '22 14:09 wyy-g

arguments 是JavaScript中的一个特殊对象,它类似于数组,但并不是一个真正的数组。

当我们在函数内部调用时, arguments 对象包含了所有传递给函数的参数。它允许我们在函数中访问这些参数,即使我们没有明确地在函数定义中声明参数。

尽管 arguments 对象类似于数组,但它并不具备数组的所有方法和属性。它没有 Array.prototype 上的方法,如 forEach()map()filter() 等。此外, arguments 对象也没有 length 属性的动态更新,它只在函数调用时包含传递的参数数量。

虽然 arguments 不是一个真正的数组,但我们可以将其转换为一个数组,以便使用数组的方法和属性。例如,我们可以使用扩展运算符或 Array.from() 方法将 arguments 转换为真正的数组。

示例:

function sum() {
  console.log(arguments); // 输出:[1, 2, 3]
  
  const argsArray = Array.from(arguments);
  console.log(argsArray); // 输出:[1, 2, 3]
  
  argsArray.forEach(num => {
    console.log(num);
  });
}

sum(1, 2, 3);

总结起来, arguments 是一个类似数组的对象,用于在函数内部访问传递给函数的参数。虽然它不是真正的数组,但可以通过转换为数组来使用数组的方法和属性。

never123450 avatar Sep 04 '23 12:09 never123450