全部,说我们有如下代码。
var b ={};
var a=b;
b=null;
if (a==null)
{
alert('a is null');
}
在代码运行之前,我曾认为a
应为null,因为我认为a
和b
指向同一个对象,或者它们应该是相同的地址。但事实并非如此。 javascript对象引用类型不是经典语言(c ++ / c#/ java)吗?还是我错过了重要的事情?感谢。
答案 0 :(得分:5)
在JavaScript中,所有变量都按值保存并传递。
但是,对象(任何不是原始的)的值都是参考。
var v1, v2;
v1 = {
someProp: true
}; // Creates an object
v2 = v1; // The object now has two references pointed to it.
v1 = null; // The object now has one reference.
console.log(v2); // See the value of the object.
v2 = null; // No references left to the object. It can now be garbage collected.
答案 1 :(得分:3)
没有。实际上,JavaScript 1 中没有“引用”类型,并且对于变量肯定存在 not 引用语义。有两类值:Primitives和Objects。但是,这个问题/问题并不涉及这种区别。
相反,问题是由于不理解变量赋值:
// let X be a singleton object, {}
var b = X; // the object X is assigned to the variable `b`
// (this does NOT make a copy)
// b -> X
var a=b; // the object that results from evaluating `b` is assigned to `a`
// however, `a` and `b` are SEPARATE non-related variables
// (once again, no copies are made)
// b -> X, a -> X
b=null; // assigns the value null to `b` - this does NOT AFFECT `a`
// b -> null, a -> X
b==null // true, as b -> null
a==null // false, as a -> X
1 有可变对象,然后有参考规范类型; RST不直接应用于问题,不与“引用”类型相关,但它用于描述赋值的l值行为。
虽然实现可以在内部使用“引用”或“指针”,但语义完全是通过接受一个对象本身并且既不是赋值也不是在表达式中使用(例如function argument)创建一个副本。
答案 2 :(得分:1)
在我所知的任何语言中,它都不起作用。 JavaScript仍然使用对象的引用,而不是变量。
分配会更改变量包含的内容。执行b=null;
时,如果不更改对象,则更改b
。由于a
未更改,因此它仍包含对原始对象的旧引用。
如果你这样做,请说:
var b = {};
var a = b;
b.foo = "bar";
if (a.foo === "bar")
{
alert("foobar");
}
然后alert
确实会运行。
答案 3 :(得分:0)
a不为空的原因是因为您将其设置为b BEFORE,将b设置为null。在Javascript中,变量会保存评估右侧的任何内容。因此,如果您希望a为null,则可以这样做:
var b = {};
b = null;
var a = b;
alert(a) // outputs null
答案 4 :(得分:0)
再添加一个 - 自我参考 - JS中的循环参考
var x = {name:'myName'}
var y=x
x['y'] = y
对象{name:" myName",y:Object}
答案 5 :(得分:0)
正如Bergi所说,它就像java或C#!
我在C#中测试过它。
TestClass b = new TestClass();
TestClass a = b;
b = null;//doesn't change the object ,
//only change the variable b. the object is remained.
if (a == null)
{
Console.WriteLine("a is null");//not hit here
}
Console.ReadLine();
谢谢大家。这真的让我更好地理解它。