是否所有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();