是否所有javascript对象都是引用类型?
好吧,假设我们有如下代码是否所有javascript对象都是引用类型?,javascript,Javascript,好吧,假设我们有如下代码 var b ={}; var a=b; b=null; if (a==null) { alert('a is null'); } 在代码运行之前,我认为a应该为空,因为我认为a和b指向相同的对象,或者它们应该是相同的地址。但事实并非如此。javascript对象引用类型不像经典语言(c++/c#/java)吗?还是我错过了什么重要的事情?谢谢。在JavaScript中,所有变量都是按值保存和传递的 但是,对于对象(任何不是基元的对象),该值是一个引用 var
var b ={};
var a=b;
b=null;
if (a==null)
{
alert('a is null');
}
在代码运行之前,我认为
a
应该为空,因为我认为a
和b
指向相同的对象,或者它们应该是相同的地址。但事实并非如此。javascript对象引用类型不像经典语言(c++/c#/java)吗?还是我错过了什么重要的事情?谢谢。在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.
在我所知道的任何语言中都不是这样的。JavaScript仍然使用对对象的引用,而不是对变量的引用 赋值更改变量包含的内容。当您执行
b=null时代码>,您不更改对象,而是更改b
。由于a
没有更改,它仍然包含对原始对象的旧引用
如果你做了,说:
var b = {};
var a = b;
b.foo = "bar";
if (a.foo === "bar")
{
alert("foobar");
}
然后,警报将确实运行。a不为null的原因是,在将b设置为null之前,您将其赋值给b的值。在Javascript中,变量保存赋值时对右侧求值的内容。因此,如果希望a为null,可以这样做:
var b = {};
b = null;
var a = b;
alert(a) // outputs null
不。事实上,JavaScript1中没有“引用”类型,也没有变量的引用语义。有两类值:基本体和对象。然而,这个问题不涉及区别
而是因为不理解变量赋值:
// 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值行为
虽然实现可能在内部使用“引用”或“指针”,但语义完全是通过接受对象本身以及表达式(如函数参数)中的赋值或使用都不会创建副本来定义的。在JS中再添加一个自引用循环引用。
var x = {name:'myName'}
var y=x
x['y'] = y
对象{name:“myName”,y:Object}
正如Bergi所说,它就像java或C
我在C#中测试了它
谢谢大家。这真的让我更了解它 它就像java,是的a
和b
指向同一个对象,当b
现在指向null
时,a
仍然指向该对象。b
包含对与a
相同对象的引用。然后您修改了b
以包含null
的值,但是a
仍然指向原始对象。+1。更多背景:嗯,有一个。;-)
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();