我是靠谱客的博主 诚心帽子,最近开发中收集的这篇文章主要介绍js arguments对象的length属性,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. arguments.length 和 函数本身的length

① arguements.length 是 指 实参个数
② 函数本身的length属性 是 指

函数希望接收的命名参数(形参)的个数

在这里插入图片描述
如果仅仅称为形参个数,多少有点不准确

2. 如何判断一个空对象

之前打酱油充当面试官的时候,一般会问一下js怎么判断空对象,总会有面试者一脸看傻子的表情看着我,不屑的说一句:“用length啊”。。。。
① json序列化:JSON.stringify({}) === "{}"
② for-in 循环
Object.keys({}).length

3. arguments 对象为什么有length

① 按理说argumets 是对象,对象没有length属性
在这里插入图片描述

        function likeTodo() {
            console.log(typeof arguments);  // object
            console.log(arguments.length);  // 2
        }

        likeTodo(1, 2);

② 不过arguments是类数组对象

JavaScript深入之类数组对象与arguments

类数组对象:拥有 一个length 属性 若干索引属性的对象

在这里插入图片描述

4. arguments 的length 属性名称为什么无法输出

① arguments是类数组对象,那为什么别的类数组对象可以输出length属性名,而arguments对象不行

        const obj2 = { 0: 12, length: 2 };
        console.log(typeof obj2);  // object
        console.log(JSON.stringify(obj2)); // {"0":12,"length":2}
        console.log(Object.keys(obj2));   //  ["0", "length"]

        function likeTodo() {
            console.log(typeof arguments);  // object
            // 下面没有和普通类数组对象一样,输出length属性名
            console.log(JSON.stringify(arguments)); // {"0":1,"1":2}
            console.log(Object.keys(arguments));   //  ["0", "1"]
        }

        likeTodo(1, 2);

② 输出arguments对象的所有属性看一下:
Object.keys 只返回自身可枚举属性
Object.getOwnPropertyNames 返回自身对象的所有属性
在这里插入图片描述
可以看出arguments对象 的确是有 length属性的,那为什么JSON.stringifyObject.keys 输不出length属性名呢?

③ 查看arguments对象的length属性( – 数据属性(property)) 的特性,
使用 Object.getOwnPropertyDescriptot 获取length属性的特性值:
在这里插入图片描述
可以看到 arguments的length属性的 enumberable 特性(可枚举特性) 为 false

js对象中什么是可枚举性(enumerable)?

可枚举性(enumerable)用来控制所描述的属性,是否将被包括在for…in循环之中。具体来说,如果一个属性的enumerable为false,下面三个操作不会取到该属性。

  • for…in循环
  • Object.keys方法
  • JSON.stringify方法

所以 arguments的 length属性名,无法通过 JSON.stringifyObject.keys 输出,使用 Object.getOwnPropertyDescriptor 则可以

④ 使自定义的 类数组对象,如何设置 JSON.stringifyObject.keys 输不出length属性名呢?

       Object.defineProperty(obj2, 'length', {
            enumerable: false,
            value: 2
        });

在这里插入图片描述
在这里插入图片描述

5. 箭头函数没有arguments对象

       const likeTodo = (fupoType) => {
            console.log(arguments);  // Uncaught ReferenceError: arguments is not defined  未捕获的异常,表示变量--未声明
            // undefined 是js 的一种数据类型,表示变量--未定义/赋值
            let like = '';
            if (fupoType === 1) {
                like = '小皮鞭';
            } else if (fupoType === 2) {
                like = '钢丝球';
            }
            return like;
        }
        console.log(likeTodo(1));
        console.log(likeTodo(2));

6. arguments.length 在入参的时候已经确定, 无法更改

① arguments对象 的内存空间,会和 形参的内存空间同步
② arguments.length = 传参个数,且无法修改

        function likeTodo(type, age) {
            console.log(arguments);

            // arguments的内存空间,会和 形参的内存空间同步。即会联动  (下面修改了形参,但是arguments 对应值也变成了 2)
            type = 2;
            console.log(arguments[0]);   // 2
            console.log(type);   // 2

            // 下面没有同步成功,因为arguments的长度由 实参决定 (即开篇说的 arguments.length = 实参个数)
            age = 200;
            console.log(arguments[1]);   // undefined ,这里会变成arguments是因为
            console.log(arguments.length);   // 1  ,上面一直是undefined,是因为arguments 在入参的时候已经确定好了,所以arguemensts 没有 [1]
            console.log(age);  //  200
        }

        likeTodo(1);

7. ECMAScript中所有的参数传递的都是值,不可能通过引用传递参数

① 这里不是说,复制对象传递的是内存空间非引用,而是说

理解ECMAScript中所有的参数传递的都是值,不可能通过引用传递参数

地址引用值的一个传递

即 地址引用值,不是直接传递到函数内部,被函数直接使用的。而且按照值传递的方式复制了一份引用地址修改这个被复制的地址,也会影响指向的内存空间,但是不会影响原来的地址
在这里插入图片描述

        let obj1 = { age: 123 };
        function likeTodo(obj2) {

            console.log(obj2);  //  {age: 123}

            obj2.age = 456;
            console.log(obj2); //  {age: 456}
            console.log(obj1);//  {age: 456}

            obj2 = new Object();  // 修改引用,没有改变值,所以这里操作的obj2 不是原来的引用
            console.log(obj1);//  {age: 456}
        }

        likeTodo(obj1);

        obj1 = new Object();  // 修改引用,改变值,所以这里操作的obj1 是原来的引用
        console.log(obj1);  //  {}

引用地址,可以理解一种基础类型的值,修改形参的引用地址值(即把形参的引用地址指向别处),不影响实参的引用地址的值,这和基础类型数据按值传递的一样的。

但是如果通过这个引用地址,去修改内存中的数据,就不一样了

最后

以上就是诚心帽子为你收集整理的js arguments对象的length属性的全部内容,希望文章能够帮你解决js arguments对象的length属性所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部