var i=1;
i.d=2;
alert(i.d); //undefined
--------
var c=new Object();
c.b=1;
alert(c.b); //1
------
var e=new Object();
e=2;
e.b=1;
alert(e.b); //undefined
为什么第一个和第三个的输出是undefined?
typeof i // 'number'
i instanceof Object // Object
typeof e // 'number'
e instanceof Object // Object
i 和 e 这两个变量是属于js里的基本数据类型(原始类型)中的number,不是object
对象类型才是属性的集合,所以i.id和e.b是undefind
你的问题基本就是“自动装箱”的问题,当你通过property accessor访问一个原始数据类型时,执行引擎会先自动对原始类型数据装箱,变成对象后再调用其方法/属性。所以你的代码
var i = 1;
i.d = 2;//相当于:new Number(1).d = 2;
alert(i.d);//这里相当于:alert(new Number(1).d);
注意到问题了么?两次访问都重新装箱了
new Number(1)
,所以在第一个对象上设置的d = 2
,在第二次访问时,其实是不存在的哦
是引用类型与包装类型的区别,包装类型包括String,Boolean,Number,会在创建时有效,过了一就会消失。所以var i=1;
i.d=2;//并没有报错,
alert(i.d);//但是包装类型执行完毕就没有了。引用类型就不一样,会一直有效。所以会存在。
var e=new Object();//这个e在里面确实是对象,
e=2;//这时,你赋值 typeof e--》number,实际上确实包装类型 ( 这个是不是js中弱类型的体现,引用类型也可以转换成元素类型)
e.b=1;
alert(e.b); //所以没有了