当前位置: 首页 > 工具软件 > Args.js > 使用案例 >

【JS基础】类数组、arguments

公冶威
2023-12-01

类数组

  • 类数组必须有length属性
  • 类数组继承于Object.prototype。而数组继承于Array.prototype
//《javascript权威指南》上判断是否是类数组的方法
function isArrayLike(o) {
    if (o &&                                // o 不能为null、undefined、 etc.
        typeof o === 'object' &&            // o 是 object
        isFinite(o.length) &&               // o.length 是一个有限数
        o.length >= 0 &&                    // o.length 是一个正数
        o.length===Math.floor(o.length) &&  // o.length 是一个整数
        o.length < 4294967296)              // o.length < 2^32
        return true;                        // 满足条件就是类数组
    else
        return false;                       // 否则就不是类数组
}

示例

var arrLike = {
	'0' : 'a',
	'1' : 'b',
	'2' : 'c',
	'3' : 'd',
	'4' : 'e',
	length : 5
}
console.log(arrLike);

arguments

  • 是function的一个属性
  • 是函数内部的参数值的实参列表,是一个类数组对象,内置的局部变量
  • 非箭头函数有arguments属性
  • 形参和实参有对应关系
function test (a){
	console.log(a);
	//当arguments改变时,a值也跟着改变。两者时对应关系
	arguments[0] = 100;
	console.log(a,arguments[0])
	console.log(Object.prototype.toString.call(arguments))
}
test(10);
//10
//100 100
//[object Arguments]

arguments共享关系的解除

//在严格模式下,形参和arguments之间的共享解除了
function test(a){
	'use strict';
	console.log(a,arguments[0]);
	a = 100;
	console.log(a,arguments[0]);
}
test(10);
//打印值:
//10 10
//100 10

//当参数有默认值的时候,形参和arguments之间的对应关系解除了
function test(a = 1){
	console.log(a);
	arguments[0] = 100;
	console.log(a,arguments[0]);
}
test(10);
//打印值
// 10
// 10 100

//使用扩展运算符传入参数的时候,形参和arguments之间的对应关系解除
function test(...args){
	console.log(args,arguments);
	arguments[0] = 100;
	arguments[1] = 200;
	console.log(args,arguments);
}
test(1, 2);
//打印值
// [1, 2] Arguments(2) [1, 2, callee: (...), Symbol(Symbol.iterator): ƒ]
// [1, 2] Arguments(2) [100, 200, callee: (...), Symbol(Symbol.iterator): ƒ]

//使用结构赋值的时候,形参和arguments之间的对应关系也会被解除
function test({a,b}){
	console.log(a);
	console.log(b);
	console.log(arguments)
	arguments[0] = 100;
	arguments[1] = 200;
	console.log(a);
	console.log(b);
	console.log(arguments);
}
test({a:1,b:2});
//打印值
// 1
// 2
// Arguments [{…}, callee: (...), Symbol(Symbol.iterator): ƒ]
// 1
// 2
// Arguments [100, 1: 200, callee: (...), Symbol(Symbol.iterator): ƒ]
 类似资料: