Javascript 值赋值和返回变量在同一行中

Javascript 值赋值和返回变量在同一行中,javascript,Javascript,我有以下代码 var s = storage('foo'); s.bar = 100; storage('foo', s); 存储从某些存储媒体返回对象。然后,我更改对象的一个属性的值,并再次将其发送到存储器。我的问题是,有没有办法把它变成一行呢?差不多 storage('foo', storage('foo').bar = 100); 但是上面的代码只保存100,而不是整个foo对象 以下是存储函数,它存储在本地存储上,但使其成为对象存储而不是字符串存储: function storage

我有以下代码

var s = storage('foo');
s.bar = 100;
storage('foo', s);
存储
从某些存储媒体返回对象。然后,我更改对象的一个属性的值,并再次将其发送到
存储器
。我的问题是,有没有办法把它变成一行呢?差不多

storage('foo', storage('foo').bar = 100);
但是上面的代码只保存
100
,而不是整个
foo
对象

以下是
存储
函数,它存储在本地存储上,但使其成为对象存储而不是字符串存储:

function storage(item, value) {
    if(value!=null) {
        var result = (storage()) ? storage() : {};
        if(item) result[item] = value;
        return localStorage.setItem('storage', JSON.stringify(result))
    } else return (item) ? storage()[item] : JSON.parse(localStorage.getItem('storage'));
}
编辑: 因此,我最终对存储函数进行了一行更改。但这并不能解释多维使用。因此,我欢迎任何建议

function storage(item, value, property) {
    ...
        if(item) (property) ? result[item][property] = value : result[item] = value;
    ...
}

由于
存储
返回一个
对象
,因此有一个(非常)好的机会可以这样做*

storage('foo').bar = 100;

console.log(storage('foo').bar); // should give 100.
。。。直接,因为对象是“按引用传递”式的



*情况并非如此,
storage
返回存储对象的副本,而不是对象本身;因此,您对返回对象所做的任何更新都不会对存储中的对象产生影响。

如果无法更改
存储功能,合理的做法是创建另一个功能:

function set_storage(obj, prop, val) {
    var s = storage(obj);
    obj[prop] = val;
    storage(obj, s);
}

// usage
set_storage('foo', 'bar', 100);
如果您可以更改存储,这将是一种更好的方法。类似的工作原理

在的帮助下,有(几乎)一种方法可以做到这一点,但它并不漂亮:

var s = storage('foo');
storage('foo', (s.bar = 100, s));

既然你说存储是你的功能,重载它似乎是一个好方法。它是这样的:

function storage(key, prop, val) {
    var storage = JSON.parse(localStorage.getItem('storage'));

    if(arguments.length === 0) {
        return storage;
    }
    else if (arguments.length === 1) {
        // only one argument passed, return the value with key `key`
        return storage[key];
    }
    else if (arguments.length === 2) {
        // set `key` to `prop` (`prop` contains the actual value)
        storage[key] = prop;
    }
    else {
        // set property `prop` of object in `key` to value `val`
        storage[key][prop] = val;
    }
    localStorage.setItem('storage', JSON.stringify(storage));
}

// Usage

// get `foo`:
var foo = storage('foo');

// set `foo`:
storage('foo', {bar: 42});

// set foo.bar
storage('foo', 'bar', 100);

我希望它能给您一些想法。

您可以创建一个函数,该函数接受一个改变对象的函数:

function changeObject(key, func) {
    var obj = storage(key);
    func(obj);
    storage(key, obj);
}

changeObject('foo', function (s) { s.bar = 100; });

存储是我自己的功能,它存储在本地存储上,但使其成为对象存储而不是字符串存储。因此,我不确定这是否可以做到。我将用
storage
的source更新这个问题。如果您是从
localStorage
进行字符串化和解析,这种方法将不起作用。最后一个示例看起来很有趣,它是如何工作的?我有一种感觉,这不会以同样的方式工作,对吗<代码>存储('foo'),(存储('foo').bar=100,存储('foo'))@Achshar:你是对的,不会的。逗号运算符从左到右计算其操作数,并返回右操作数的结果。在您的示例中,您从未将更改的对象写回存储,因为
storage('foo')
从存储读取未修改的对象。@FelixKling-Hmm在这种情况下,我将按照您的建议对存储函数本身进行更改。将在此处更新代码。谢谢