Javascript通过引用传递对象.这很有道理.但是一旦你开始操纵这些物体,一切都会以一种看起来不直观的方式发挥作用.让我举一个例子:
var a, b;
a = {}
b = a;
a['one'] = {};
console.log( JSON.stringify(a) );
// outputs: {"one":{}}
console.log( JSON.stringify(b) );
// outputs: {"one":{}}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,因为现在b有一个指针,a所以预计分配东西a也会影响b.
但是如果我这样做:
a = a['one'];
console.log( JSON.stringify(a) );
// outputs: {}
console.log( JSON.stringify(b) );
// outputs: {"one":{}}
Run Code Online (Sandbox Code Playgroud)
这对我来说很惊讶.我期望a,并b仍然是相同的(并且是{}因为a['one']原先设置为{}和a设置为a['one']).
但事实并非如此.似乎a失去了b对它被赋予新内容的时间的引用,但b保留了a在a失去引用之前设置的值b.
但是如果我这样做:
a['two'] …Run Code Online (Sandbox Code Playgroud) 我知道在JS中,对象是通过引用传递的,例如:
function test(obj) {
obj.name = 'new name';
}
var my_obj = { name: 'foo' };
test(my_obj);
alert(my_obj.name); // new name
Run Code Online (Sandbox Code Playgroud)
但为什么下面没有工作:
function test(obj) {
obj = {};
}
var my_obj = { name: 'foo' };
test(my_obj);
alert(my_obj.name); // foo
Run Code Online (Sandbox Code Playgroud)
我已经将对象设置为{}(空)但它仍然说foo.
任何人都可以解释这背后的逻辑吗?
既然我已经在Angular2上工作了近3个月,我遇到了一些场景让我想知道这是怎么发生的?
在特殊this关键字的情况下,很明显它正在传递相关DOM Object或实例的引用或实例Class.
但是,还有另一种叫做的东西ControlGroup,只要它被分配给另一个变量,它也会做同样的事情.并且这两个变量都可以访问相同的实例ControlGroup.
例如,我有一个带有两个参数的函数function (a,b).我想在函数中,取b的值,并用c替换它.我在想类似的东西$(b).replaceWith(c),但它没有成功.我知道我可以使用新值在函数内创建一个新变量,但是可以更改b本身的值吗?这样的事情是可能的.或者参数设置在石头上?
让我试着解释一下我想做什么.有三个函数,一个是总体函数,然后是两个函数,由toggle事件触发.我希望第二个函数做一些事情来获取一个值并将其传递给第三个函数.所以这里是代码
function(a,b){
$('selector').toggle(
//I want this to gather a value and store it in a variable
function(){},
//and I want this to accept the variable and value from the previous function
function(){}
)}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是为总体函数添加一个参数c,然后用第一个函数修改它,并将新值传递给第二个函数.
假设您有以下复杂对象:
var object1 = .... // (something complexed)
Run Code Online (Sandbox Code Playgroud)
这会占用xJS应用程序中的内存量.现在假设您有一些其他参考对象object1:
var otherObject = { something: true, value: 'yes', object: object1 };
var anotherObject = { color: '#FFF', object: object1 };
Run Code Online (Sandbox Code Playgroud)
我object1最初占用的内存量是否增加了两倍?或者引用object1不添加内存开销?
我不确定如何自己测试以确定答案.(如果你可以告诉我如何指向一个有助于对此进行基准测试的工具,那么可以获得奖励积分).
我在函数外部定义了一个对象,在全局范围内.此对象不作为参数传递给函数,但函数会修改它并返回修改后的对象.
我想知道的是,如果函数返回对象的副本,或原始的全局对象?
另外,将该对象作为参数传递给函数会产生影响,因为对象是通过引用传递给函数的吗?
在javascript中传递对象及其引用.意味着应该反映任何地方对象的变化.在这种情况下,console.log(a)的预期输出为{}
function change(a,b) {
a.x = 'added';
a = b;//assigning a as {} to b
}
a={}
b={}
change(a,b);
console.log(a); //expected {} but output {x:'added'}
console.log(b)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?据我所知,这不应该是因为功能范围.谢谢
当我开始在C++中学习函数时,它的全部传递值和参考.我们在javascript中有类似的东西吗?
如果是/不是如何在javascript的情况下工作?
谢谢大家.
如果我没有得到这个非常错误,这种行为对我来说很奇怪.而不是解释,我将在下面发布一个示例代码,请告诉我为什么我得到输出x而不是y.
private void button1_Click(object sender, EventArgs e)
{
List<int> l = new List<int>() { 1, 2, 3 };
Fuss(l);
MessageBox.Show(l.Count.ToString());
}
private void Fuss(List<int> l)
{
l.Add(4);
l.Add(5);
}
Run Code Online (Sandbox Code Playgroud)
输出应该,我假设是3.但我得到输出为5.我理解输出可以是5如果我这样做:
private void button1_Click(object sender, EventArgs e)
{
List<int> l = new List<int>() { 1, 2, 3 };
Fuss(ref l);
MessageBox.Show(l.Count.ToString());
}
private void Fuss(ref List<int> l)
{
l.Add(4);
l.Add(5);
}
Run Code Online (Sandbox Code Playgroud) 在bluebird文档中,他们将此作为反模式停止优化.他们称之为漏洞,
function leaksArguments2() {
var args = [].slice.call(arguments);
}
Run Code Online (Sandbox Code Playgroud)
我做这一切的时候在Node.js的 这真的是一个问题.如果是这样,为什么?
仅假设Node.js的最新版本.
javascript ×7
function ×2
node.js ×2
angular ×1
c# ×1
c#-4.0 ×1
jquery ×1
memory ×1
object ×1
optimization ×1
parameters ×1
pointers ×1
ref ×1
reference ×1
scope ×1
typescript ×1