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

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

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    ES5能否实现"一值两用"?
    23
    0

    如题,
    学习JS的数据结构和算法——集合,然后学着写了这样一个模拟ES6的Set的结构:

    function mySet(){
        var items = {};
        this.Has = function(value){
            return items.hasOwnProperty(value);
        }
        this.Add = function(value){
            if(this.Has(value)) return false;
            items[value] = value;
            return true;
        }
        this.Remove = function(value){
            if(this.Has(value)){
                delete items[value];
                return true;
            }
            return false;
        }
        this.Clear = function(){
            items = {};
        }
    
    
        this.Size = function(){
            return Object.keys(items).length;
        };
    
        this.Values = function(){
            var values = [];
            Object.keys(items).forEach(function(key){
                values.push(items[key]);
            });
            return values;
        }
    }
    
    module.exports = {
        Sets: mySet
    }

    然后测试了一下,可以正常获得对应的值。

    let s = new Sets();
    s.Add(1);
    s.Add(2);
    s.Add('time');
    
    console.log(s.Add(2));
    console.log(s.Add(4));
    console.log(s.Has('time'));
    console.log(s.Remove('time'));
    console.log(s.Remove('3'));
    console.log(s.Add(3));
    console.log(s.Values());
    
    console.log(s.Size());

    得到结果:

    false
    true
    true
    true
    false
    true
    [ 1, 2, 3, 4 ]
    4

    然后我就觉得这样写好像不太舒服,因为一般写属性都是直接用属性名就可以获得对应的结果了,所以我尝试添加了一个size直接获得集合的尺寸值:

    Object.defineProperty(mySet.prototype, 'size', {
        get() {
            return this.Size();
        }
    });

    测试console.log(s.size);后可以得到结果4

    然后我就想到了这样一个问题,能不能只用一个size就实现"一值两用"——既可以实现console.log(s.size);又可以显示console.log(s.size());呢?

    我尝试把上面的Size改成size,然后node报错:

    get() {
           ^
    
    RangeError: Maximum call stack size exceeded

    看来并不是这么简单啊……Orz……
    请问ES5是否能实现这种“一值两用”?怎么实现?

    谢谢=_=

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 用钱买、真情 普通会员 1楼

      是的,JavaScript 5(ES5)可以实现“一值两用”。在ES5中,函数的返回值是一个对象,这意味着它可以是任何值,但必须是JavaScript对象或布尔值。

      例如,你可以这样定义一个函数,该函数返回一个布尔值:

      javascript function isTrue(value) { return value === true; }

      然后,你可以像这样调用这个函数:

      javascript console.log(isTrue(true)); // 输出 true console.log(isTrue(false)); // 输出 false

      然而,需要注意的是,这种行为并不是JavaScript语言的标准行为。在ES5中,函数的返回值应该是一个有效的JavaScript值,例如字符串、数字、布尔值等。如果你试图返回一个未定义的值(例如null、undefined或null),那么JavaScript会抛出一个错误。因此,如果你需要“一值两用”,你可能需要考虑使用更复杂的数据结构或函数。

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