首页 > 代码库 > Javascript中让人迷惑的一些基本数据类型跟内置包装对象
Javascript中让人迷惑的一些基本数据类型跟内置包装对象
数据类型跟对象的区别:
基本的数据类型是没有 属性 和 方法的,但是对象有;就像是java中的基本数据类型跟引用类型一样;
看个例子:
var s= " xxxx"
var xxxx=s.substring(s.lastIndexOf(" ")+1,s.length);
首先得明白在js中字符串可是基本类型,与数字类型一样。对比java,它的基本类型会有这种方法调用么?当然没有。java的String可是个对象,才能这么调。换成是int肯定不行。
我们可以使用typeof运算符来查看字符串的数据类型,我们可以在浏览器地址栏中输入以下代码并回车查看结果
javascript:var s="";typeof(s)
结果当然是 string。
而对象类型则是object。迷惑么?那么为什么字符串的操作采用对象的表示法呢?
事实上js中三个关键的基本类型都有一个对应的对象类。即js还支持Number、String、Boolean类,这些类是那些基本数据类型的包装类,就是wrapper。wrapper不仅与基本类型的值相同,还封装了一些运算数据相关的属性和方法。
js可以很灵活的将一种类型转换为另一种了类型,当我们在对象环境中使用字符串是,js会为这个字符串值内部地创建一个String包装对象。String对象就代替了原始的字符串。其他两个类型也是如此。我们在对象环境中使用字符串是,要注意这个String对象只是瞬时存在的,它使得我们可以访问属性或方法,此后就没有用了,所以系统会将他丢弃。
比如:
var len=s.length;
假设s存在且是一个字符串。那么在上述语句执行过程中会创建一个新的String对象以便可以访问length属性,它是瞬时的。而s不会有任何变化。这就如同电影里的替身。地球人都能理解吧。
如果你想在js中显式的使用String对象,你得使用new运算符。如:
var s = ”hello world“;//字符串基本类型 primitive
var s= new String("hello world");//字符串对象 object
这两个s的功能和操作几乎是一模一样的。大概只有typeof能识别真假孙悟空。
反过来,当String对象 s要与基本类型字符串作+运算,即在需要原始字符串的环境下,String对象会自动转换成基本字符串类型。
比如 msg= s+"!";那么此时s暗地里由一个基本类型字符串替身来完成这个运算过程,其本身还是字符串对象,但是如果是
s = s+"!";则s变为基本类型字符串;
记住其他两个类型,Number和Boolean,原理跟String是一样的。
Javascript中让人迷惑的一些基本数据类型跟内置包装对象