JavaScript字符串不是对象,为什么会有属性呢?(理解JavaScript中的包装对象)

实例1:

var s = "hello javascript!"; //定义一个字符串
var world = s.substring(s.indexOf(" ")+1, s.length); //使用字符串的方法

实例2:

var s=""test"; //创建一个字符串
s.len=4; //给字符串设置一个属性
var t=s.len; //查询这个属性

结果:
在实例1中,可以正常使用s的属性length,在实例2中t的值为undefined
结论:
字符串s是一个原始值,在实例1中,当访问字符串s的属性时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。而在读取模式中访问字符串是,后台都会自动完成以下处理:
(1)创建String类型的一个实例;
(2)在实例上调用指定的方法;
(3)销毁这个实例。
实例2中,第二行代码创建的是一个临时字符串对象,并给len属性赋值为4,随即销毁这个对象,所以第三行t的值是未定义。
以上的这个“临时对象”被称为**“包装对象”**,对象和包装对象的 主要区别在于对象的生存周期,可以看到自动创建的包装对象的生存周期只是一行代码的执行瞬间,然后立即销毁。而使用new操作符创建的对象的生存周期在执行流离开当前作用域之前都一直保存在内存中。
可以通过String(),Number(),Boolean()构造函数来显示地创建包装对象。但是通常情况下不建议这么做。
对包装对象的实例调用typeof会返回“object”,而且所有包装对象都会转换为布尔值true。
例:

var falseObject=new Boolean(false);
var result=falseObject && true;
alert(result);//true;

var falseValue=false;
result=falseValue && true;
alert(result);

alert(typeof falseObject);//object
alert(typeof falseValue);//boolean
alert(falseObject instanceof Boolean);//true
alert(falseValue instanceof Boolean);//false

另外,“ == ” 运算符将原始值和其包装对象视为相等,“ === ”全等运算符则视为不等。

发布了243 篇原创文章 · 获赞 87 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/IT_10/article/details/103557660