Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
haizhilin2013 opened this issue May 12, 2019 · 22 comments
Open
Labels
js JavaScript

Comments

@haizhilin2013
Copy link
Collaborator

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

@haizhilin2013 haizhilin2013 added the js JavaScript label May 12, 2019
@grepug
Copy link

grepug commented May 13, 2019

object like array

@Amour1688
Copy link

arguments是一个对象。

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

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

arguments他的特性和使用方法

特性:

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

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

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

使用方法:

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

例如:

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

@buzhanhua
Copy link

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

@tiu5
Copy link

tiu5 commented May 15, 2019

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

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

@tzjoke
Copy link

tzjoke commented May 28, 2019

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

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

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

@myprelude
Copy link

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

@DarthVaderrr
Copy link

严格模式禁用了arguments.callee

@getanimation
Copy link

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

@wyx2014
Copy link

wyx2014 commented Jul 24, 2019

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

@Konata9
Copy link

Konata9 commented Aug 12, 2019

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

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

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

@seho-dev
Copy link

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

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

@seho-dev
Copy link

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

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

@zhangkuibao
Copy link

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

@blueRoach
Copy link

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

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

@MrZ2019
Copy link

MrZ2019 commented Sep 28, 2020

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

@bozaigao
Copy link

bozaigao commented Oct 5, 2020

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

@zxcdsaqwe123
Copy link

他是个类数组

@github-cxtan
Copy link

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

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

@yxllovewq
Copy link

yxllovewq commented Mar 9, 2022

简单来说:

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

@xiaoqiangz
Copy link

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

@wyy-g
Copy link

wyy-g commented Sep 15, 2022

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

@never123450
Copy link

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 是一个类似数组的对象,用于在函数内部访问传递给函数的参数。虽然它不是真正的数组,但可以通过转换为数组来使用数组的方法和属性。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js JavaScript
Projects
None yet
Development

No branches or pull requests