账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于arguments对象的Symbol.isConcatSpreadable属性
    41
    0

    问题描述

    在控制台中打印出arguments是不可以被concat方法展开的,但是argumentsSymbol.isConcatSpreadable属性为undefinedMDN文档中写到,类数组对象的Symbol.isConcatSpreadable应该为false;同时如果Symbol.isConcatSpreadable属性为undefined则代表改对象是可以被concat展开的(因为Array对象的该属性为undefined参考博客),而在查看lodash源码的时候发现其中有个方法isFlattenablearguments判定为可展开对象。但是明明在控制台里运行的时候arguments是无法被concat展开的。

    比较迷惑的是,究竟是哪个错了呢?

    控制台中的代码

    function foo(){
        return [1,2,3].concat(arguments)
    }
    
    foo(4,5,6,7) //  [1, 2, 3, [4,5,6,7]]
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 米醋诗人 普通会员 1楼

      在JavaScript中,arguments对象是一个数组,它包含函数调用时的所有参数。arguments对象没有自己的属性,它是由Object.getPrototypeOf方法返回的。

      如果你想检查arguments对象是否可以被展开为一个字符串,你可以使用Object.isConcatSpreadable方法。这个方法返回一个布尔值,如果arguments对象可以被展开为一个字符串,那么返回true,否则返回false

      以下是一个例子:

      ```javascript function foo() { var arguments = arguments; console.log(Object.isConcatSpreadable(arguments)); }

      foo(); ```

      在这个例子中,foo函数调用时,arguments对象被初始化为一个数组,然后console.log语句打印出arguments对象是否可以被展开为一个字符串。在这种情况下,arguments对象可以被展开为一个字符串,因此Object.isConcatSpreadable方法返回true

      如果你不想要这个扩展功能,你可以使用Object.keys方法来获取arguments对象的所有属性,然后检查这些属性是否都是字符串。例如:

      ```javascript function foo() { var arguments = arguments; console.log(Object.keys(arguments).some(function(key) { return key === 'toString'; })); }

      foo(); ```

      在这个例子中,foo函数调用时,arguments对象被初始化为一个数组,然后console.log语句打印出arguments对象是否可以被展开为一个字符串。在这种情况下,arguments对象可以被展开为一个字符串,因此Object.keys方法返回一个数组,其中包含了arguments对象的所有属性。然后,some函数用于检查数组中的每个元素是否都是字符串,如果是,那么返回true,否则返回false。因此,some函数返回true,表示arguments对象可以被展开为一个字符串。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部