是否有任何方法可以通过指向一个对象属性的局部变量在JavaScript中更少的冗长?
例如,在PHP中我可以这样做:
$obj->subobject->property = 'Foo';
$property =& $obj->subobject->property;
$property = 'Bar';
echo $obj->subobject->property;
// output 'Bar'
这不是一个很好的例子,但你明白了。
我想在Javascript中复制此行为。我经常需要对对象进行深入的操作这变得非常烦人必须这样做:
if (please.stop.making.me[somevar].type.so.much.length) {
please.stop.making.me[somevar].type.so.much[newSubObjectKey] = anObject;
}
// perform more operations on the object down here
这样读起来容易多了,输入起来也容易多了:
var subObj = is.much.easier.to.type.once;
if (subObj.length) {
subObj[newSubObjectKey] = anObject;
}
// now that's much better
我知道我应该已经知道这些了,但是我刚刚升到"高级新手"。在JavaScript中,
在JavaScript中,所有内容都是通过值传递的,但是变量的类型将决定它是否是值传递的引用;
- 对象是引用
- 原语(数字,字符串等)通过值传递。
简单来说,如果你将一个变量传递给一个数组函数,在函数中修改它会影响父函数。
但是,在数组中给它传递一个值则不会。当然,绝对没有什么可以阻止您在对象中包装原语,以确保它像"指针"一样工作。
可以指定一个新变量来引用属性键链中的任何深度,只要所引用的条目不是基本类型
这样做是因为裸对象变量实际上是对该变量的引用,因此您的新(更短的)变量可以指向相同的位置。
然而,原始数字和字符串值是通过值传递给的,所以你不能为它们创建新的引用。
这样读起来容易多了,输入起来也容易多了:
var subObj = is.much.easier.to.type.once;
if (subObj.length) {
subObj[newSubObjectKey] = anObject;
}
你试过上面的方法吗?因为它有效。
对于实际问题。不能有指向值的引用或指针。在javascript中,一切都是通过值传递的(不是引用)。
编辑:我忘了提到一些值是引用。您仍然无法获得指向这些引用值的指针。
coffeeScript code
# result method
Object::r = (v) ->
s=@
st='global.'+v+'={'+'s'+'}'
re=(eval st)
str='global.'+v+'=re["s"]'
eval(str)
@
[1..10].r('a').
map( (v) -> 'lorem_ipsum_'+v.toString() ).r('ar').
join("__").r('s').
split("__").reverse().r('arr')
console.log("'n")
console.log(a); console.log("'n")
console.log(ar); console.log("'n")
console.log(s); console.log("'n")
console.log(arr); console.log("'n")
截图