fe-interview
fe-interview copied to clipboard
[js] 第27天 说说你对arguments的理解,它是数组吗?
第27天 说说你对arguments的理解,它是数组吗?
object like array
arguments
是一个对象。
js不能像java一样实现重载,arguments
对象可以模拟重载。
js中每个函数都会有arguments
这个实例,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments
的元素。arguments.length
为函数实参个数,arguments.callee
引用函数自身。
arguments他的特性和使用方法
特性:
1.arguments对象和Function是分不开的。
2.因为arguments这个对象不能显式创建。
3.arguments对象只有函数开始时才可用。
使用方法:
虽然arguments对象并不是一个数组,但是访问单个参数的方式与访问数组元素的方式相同
例如:
arguments[0],arguments[1]...
arguments并不是一个数组, 但是它有length属性以及可以以下标的形式取值
arguments 不是数组,是类数组。 类数组 转 数组的方法有
- [...arguments]
- Array.from(arguments)
- Array.prototype.slice.call(arguments)
用来获取函数参数 [].slice.call(arguments)
es6 显式提供 function foo(...args){}
arguments.callee 在匿名函数中指向这个函数
- arguments 不是数组,但是它有数组类似的length属性 可以通过 Arrary.from(arguments) 转化为数组。也可以通过Arrary.prototype.foEach.call(argunment),
- Arrary.from 能够转化类数组对象成为数组
严格模式禁用了arguments.callee
arguments是个伪数组,它有数组的length以及下标取值;但是它不能用数组的一些方法,例如:Array.push()之类的
var list = document.getElementById('test-list'); var listchild = list.children;
那这种ul标签下li获取出来的listchild也是类数组了呗,难怪无法直接foreach
arguments
并不是数组,是一个 array like 对象,它有 length
这个属性。通常情况下,为了使用方便我们会把 arguments
转成数组,方法有下面几种。即使不转为数组,可以使用下标访问。如 arguments[0]
。
-
[...arguments]
-
Array.from(arguments)
-
[].slice.call(arguments)
一般情况下不会对 arguments
进行操作。但在实现一些低级或者通用功能时候会使用到,如实现一个泛柯理化的函数,或者根据参数的数量执行不同的方法(类似函数的重载)。
类数组对象(js权威指南)记得第一次啃书就看的这一节,所以这个名词记得非常清楚
他是一个对象,是类数组对象(js权威指南),他有着和数组几乎一样的api,比如length,自增key,增加一个key自动增加length,使之可以用arg[0]来访问数据 可以通过arguments来访问,传入的参数,arg[0] 如果更改了arguments的值的话,那么传入的参数也会被改变,因为前者是后者的一个引用;
var list = document.getElementById('test-list'); var listchild = list.children;
那这种ul标签下li获取出来的listchild也是类数组了呗,难怪无法直接foreach
是的,目前好像只有这2个情况会产生类数组对象
1.实参列表,是类数组,不是数组
2.是传入参数的一个镜像(浅拷贝)
3.arguments.callee是函数本身, 严格模式禁用arguments.callee
- 是一个类数组,有下标有length
- arguments.callee指向函数本身,但是严格模式下禁用此属性
- 转换为数组的方法
[...arguments] Array.from(arguments) [].slice.call(arguments)
arguments并不是一个数组, 但是它有length属性以及可以以下标的形式取值
arguments是一个类数组对象,只能在非箭头函数内部访问,可以通过Array.from(arguments)将arguments转化为数组,它和数组的区别是除了length和索引访问跟数组一样之外没有push和pop等方法。
他是个类数组
arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性 特性:
1.arguments对象和Function是分不开的。 2.因为arguments这个对象不能显式创建。 3.arguments对象只有函数开始时才可用。
简单来说:
- arguments在函数执行过程中,在函数体内部才能访问。
- arugments是一个类数组对象,也即有length属性,属性值为number的对象,因此不可以使用Array.prototype上的方法。
- arugments的作用:可以获取到实参、可以通过callee属性访问函数自身。
arguments是类数组,可以以下标去获取arguments[0],也可以通过Array.from(arguments)或者 Array.prototype.slice.call(arguments)转成真正的数组
arguments 是实参列表,它是一个类数组,并不是真正意义上的数组,它拥有length属性,但不能使用数组上的方法,如push,pop,unshift,shift,slice等,arguments.callee 是用来得到函数本身的一种方法,在严格模式下被禁用,通常情况下我们会将arguments转为数组使用,方法如下: [...arguments] ,Array.from(arguments) 这两种是ES6新增的方法,在ES5中我们使用 : Array.prototype.slice.call(arguments); slice(start,end),截取数组,不改变原数组,返回一个新数组
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
是一个类似数组的对象,用于在函数内部访问传递给函数的参数。虽然它不是真正的数组,但可以通过转换为数组来使用数组的方法和属性。