我一直有个问题不明,var str1=new String("aaa");var str2="aaa"; String构造函数这三者之间的关系还不是很明了呢,根据面向对象的原理,我发现str1和str2都可以看成String的实例对象(因为通过alert(str2.constructor),显示的是String构造函数,说明str2是通过String函数构造而来的对象),但是str2既然是对象为啥不能通过str2.name="aaa";alert(str2.name);得到name属性呢,而str1可以,恳请大叔解惑,万谢,如果有什么理解错误还请指点
var str1=new String("aaa"); var str2="aaa"; typeof str1 //object typeof str2 //string (5中基本类型之一 undefined null Boolean number string )
Javascript是一门弱语言 他没有语句块(block) 函数里声明的变量 在函数外也能引用 所以怪异之处 很正常
原因就是基本类型 引用类型的对象生存周期不一样 str1是引用类型,这个有点像面向对象的对象一样。 但是str2是基本类型,他创建的类型的对象,只存在这一行代码执行的瞬间,然后立即销毁。我们不能再运行时为基本类型添加属性和方法。
1 var str2="aaa"; 2 str2.name="aaa"; 3 alert(str2.name)//undefined
这里访问的str2的name属性不见了是因为第二行创建的对象在第三行访问时已经被销毁了
不知楼主明白了不 :)
恩,谢谢,从数据结构上解释,我还想知道的是作为基本类型的str2它为啥能够像引用类型对象一样访问到String.prototype.name="dfa";alert(str2.name);
var str1=new String("aaa"); 其实有两个操作,第一、创建一个String对象,第二给str1 赋值。
var str2="aaa" 只是给一个变量赋值,str2不是对象,只是变量
不是吧
var str1=new String("aaa");
var str2=new String();
str2="aaa";
str1.name="aaa";
str2.name="aaa";
alert(str2.name); 输出 underfine
var str1=new String("aaa");
var str2=new String();
//str2="aaa";
str1.name="aaa";
str2.name="aaa";
alert(str2.name); 输出 aaa
这个我知道,我是真正想知道的是这3者之间的真正关系
1 var str1="aa"; 2 var str2=new String("aa"); 3 String.prototype.name="kk"; 4 alert(str1.name);//kk 5 alert(str2.name);//kk
关键是作为基本类型的str1弹出constructor属性是function Function(){},和str2是一样,结合上面的代码,我觉得不是类型区别那么简单的解释呢
哦 原来前者是var str1=new String("aaa");
alter(typeof str1) //输出object
var str2=new String();
alter(typeof str2) //输出object
str2="aaa";
alter(typeof str2) //输出string
object属于对象 可以用name属性 输出aaa
所以string没name属性 是underfined