详细了解js中的包装对象

news/2024/7/19 15:26:23 标签: js, 包装对象

什么是包装对象

基本类型有自己对应的包装对象String、Number、Boolean。但是null和undefined没有包装对象

首先我们复习一下js的数据类型:分为两类基本类型和引用类型

基本类型:String、Number、Boolean、Null、Undefined

引用类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。

但引用类型中包含了三种基本包装类型:String、Number、Boolean。它们是特殊的引用类型,既与其他的引用类型相似,同时又具有具有与各自的原始类型相应的特殊行为

所以我们要怎样理解包装对象呢?

我们知道:引用类型是有方法和属性的,但基本类型是没有的,但是我们都遇到过这样的代码

var str = 'hello'; //string 基本类型
var s2 = str.charAt(0);
alert(s2); // h

毫无疑问上面的string是一个基本类型,但是它却能召唤出一个charAt()的方法,这是什么原因呢?

主要是因为:字符串去调方法的时候,基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法给了基本类型,然后包装类型消失。

再看一个例子

var str = 'hello'; //string 基本类型
var s2 = str.charAt(0); //在执行到这一句的时候 后台会自动完成以下动作 :
( 
 var str = new String('hello'); // 1 找到对应的包装对象类型,然后通过包装对象创建出一个和基本类型值相同的对象
 var s2 = str.chaAt(0); // 2 然后这个对象就可以调用包装对象下的方法,并且返回结给s2.
 str = null;  //    3 之后这个临时创建的对象就被销毁了, str =null; 
 
alert(s2);//h 
alert(str);//hello     注意这是一瞬间的动作 实际上我们没有改变字符串本身的值。就是做了下面的动作.这也是为什么每个字符串具有的方法并没有改变字符串本身的原因。

我们再来看一个面试题:

var str="hello";
str.number = 10;//包装对象消失
alert(str.number);//undefined
当我们走str.number = 10;这句话的时候。基本类型要添加一个属性(当然我们知道基本类型是没有方法和属性的),所以这时它会在基本类型所对应的包装对象下面创建一个对象,然后把10添加到了对象下面,添完之后包装对象就消失了,消失之后,当我们再执行alert(str.number);时,str又要重新执行上面的过程,重新创建一个对象,而新的对象是没有number属性的,所以结果就是undefined。

那如果我们想要这个number属性一直可以找到怎么办呢?其实也很简单,我们只需要把number这个属性添加到对应的包装对象的原型下面是再去找时是可以找到的。

var str="hello";
String.prototype.number = 10;
alert(str.num);//10

再看一个例子:

var arr=[];
arr.num = 10;
alert(arr.num);//10

这个结果是毫无疑问的,但是如果和上面的基本类型相比,你是否会有一点点的小迷惑呢?

所以接下来我们就要讨论一下包装类型和引用类型的区别啦

包装类型和引用类型的区别

引用类型和包装类型的主要区别是对象的生存期:使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于这句代码的执行期间,然后立即被销毁,这也意味着我们不能在运行时为基本类型添加属性和方法。




http://www.niftyadmin.cn/n/952195.html

相关文章

python中readline的用法_简单介绍Python中的readline()方法的使用

readline()方法从文件中读取一整行。尾部的换行符保持在字符串中。如果大小参数且非负,那么一个最大字节数,包括结尾的换行和不完整的行可能会返回。遇到EOF时立即返回一个空字符串。语法以下是readline()方法的语法:fileObject.readline( si…

Asp.Net 学习资源列表

Asp.Net 学习资源列表 名称:快速入门地址:http://chs.gotdotnet.com/quickstart/描述:本站点是微软.NET技术的快速入门网站,我们不必再安装.NET Framework中的快速入门示例程序,直接在网上查看此示例即看。名称&#x…

判断js数据类型的四种方法,以及各自的优缺点(很详细哦)

首先我们简单的说一下js中的几种数据类型 数据类型分为基本类型和引用类型: 基本类型:String、Number、Boolean、Null、Undefined 引用类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。 然后判断…

python颜色的字母代码_Python3.5 + sklearn利用SVM自动识别字母验证码方法示例

前言最近正在研究人工智能,为了加深对算法的理解,决定写个自动设别验证码的程序。看了看网上的demo,大部分都是python2的写法,而且验证码的识别都是用的数字做例子,那我就写个基于python3字母识别的程序,不…

js面向对象(三)组件开发实现弹窗效果

组件开发:多组对象,像兄弟之间的关系(也是代码复用的一种形式) 组件开发需要解决的问题:1、参数的顺序问题 2、参数不写报错的问题 解决办法:主要就是通过设置默认参数和配置参数 话不多说,直接…

转: 技巧和诀窍:防范SQL注入攻击

【原文地址】Tip/Trick: Guard Against SQL Injection Attacks 【原文发表日期】 Saturday, September 30, 2006 9:11 AM SQL注入攻击是非常令人讨厌的安全漏洞,是所有的web开发人员,不管是什么平台,技术,还是数据层,需…

pythonflask项目实战_Flask框架的学习与实战(二):实战小项目

昨天写了一篇flask开发环境搭建,今天继续,进行一个实战小项目-blog系统。blog系统很简单,只有一个页面,然而麻雀虽小五脏俱全。这里目的不是为了做项目而做项目,这篇文章本意是通过这次练习传达以下几个知识点&#xf…

深入彻底理解原生js的作用域、作用域链(以及浏览器是怎样解析js代码的)

在学习闭包的过程中,我发现,要想真正的理解闭包,光知道什么闭包是不行的,我们还需要知道什么是作用域以及作用域链、函数声明和函数表达式,当然还牵扯到的知识有,垃圾回收机制和内存泄漏等,所以…