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在这种情况下,我将按照您的建议对存储函数本身进行更改。将在此处更新代码。谢谢