进阶/ 基本包装类型
var realMessage="Said I love you but I lied"; var myMessage=realMessage.substring(5,15); console.log(myMessage); //"I love you"
字符串为什么会有方法?
基本类型的值是保存在栈内存中的简单数据段,它们是按值访问的。JS中有五种基本类型:Undefined、Null、Boolean、Number和String。
引用类型的值是保存在堆内存中的对象,它的值是按引用访问的。引用类型主要有Object、Array、Function、RegExp、Date。
对象是拥有属性和方法的,所以我们看到下面这段代码一点也不奇怪.
var favs=['鸡蛋','莲蓬']; favs.push('秋葵'); console.log(favs);//["鸡蛋", "莲蓬", "秋葵"] console.log(favs.length);//3
基本包装类型
除了一开始提到的Object、Array等引用类型,JavaScript还为我们提供了三种特殊的引用类型:String、Number和Boolean,方便我们操作对应的基本类型。
尽管使用了substring方法,realMessage本身的值是不会变的,调用这个方法只是返回了一个新的字符串。
这就是基本包装类型的作用了。本来你是没有方法的,但是你想用方法的时候,你尽管调,对应的基本包装类型有这个方法就行。例如上面的substring方法,string这个基本类型是不可能有这个方法的,但是String这个包装类型有啊,它会吭吭哧哧地把这个方法执行完把结果返回。在执行到:
realMessage.substring(5,15)
这行代码时,发生了很多事。
首先,它会从内存中读取realMessage的值。当处于这种读取模式下的时候,后台就开始干活了。JS高程是这样描述后台完成的这些动作的:
1.创建String类型的一个实例; 2.在实例上调用指定的方法; 3.销毁这个实例
var _realMessage=new String("Said I love you but I lied"); var myMessage=_realMessage.substring(5,15); _realMessgae=null; //方法调用后即销毁
这样我们就明白了,并不是基本类型string执行了自身方法,而是后台为它创建了一个对应的基本包装类型String,它根据基本类型的值实例化出了一个实例,让这个实例去调用指定方法,最后销毁自己,感天动地有木有。
注意最后一步基本包装类型“会销毁”的特性,这决定了我们不能为基本类型值添加自定义属性和方法。
总结
多亏了有基本包装类型,我们操作string、boolean、number这三种基本类型更方便了。每当读取这三种基本类型值时,后台会创建对应的包装类型实例,这个实例会调用指定方法,调用完会被销毁。这种短暂的生命周期决定了我们不能为基本类型添加自定义的属性和方法。
再谈回忆
为什么会写这篇博客,主要是碰到一个小bug
var a = {1 : '库里'} a[1] //"库里" a['1'] //"库里"
说好的 对象key只能是字符串 怎么就可以数字了
然后我博览群书 重要发现
对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。
如果键名是数值,会被自动转为字符串。
over
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号