很多语言中都有Box和Unbox的概念,很多书籍把Box翻译为”装箱操作”,指的是將基本数据类型包装成对象;Unbox和它相反,把对象类型转换为基本类型。

我们知道JavaScript中只有对象才有属性和方法,看下面的代码,你可能会产生一些疑惑:

    <script type="text/javascript">
var str = "hello world";
var num = 200;
alert(typeof str);//string
alert(typeof num);//number
alert(str.length);//11
alert(num.toString());//200
</script>

细心的朋友会发现,我们定义两个变量,str变量存放string类型数据,num 变量则存放number类型数据。下面我们竟然可以使用str.length属性获取字符串的长度,还可以直接使用num.toString()这种形式將数值转换为字符串。

为什么可以这样调用呢?不是说只有对象才有属性和方法吗?

上一节中提到JS提供一些内置对象模版,每种基本类型都有相应的对象模版与之对应,例如string->String,number->Number等等。事实上,当我们使用基本类型调用属性或方法时,JS引擎会自动將基本类型装箱成对象模版对应的对象。

 str.length

这段代码JS引擎会自动做类似与下面的处理:

new String(str).length

为了证明这一点,笔者写了下面一段代码:

    <script type="text/javascript">
String.prototype.getLen = function()
{
return this.length;
}
var str = "hello world";
alert(str.getLen());
</script>

为String对象模版增加一个自定义的成员方法getLen(),可以看到我们一样可以使用str.getLen()形式调用。

所以出于提高性能考虑,请尽量不要写下面类似的代码:

    <script type="text/javascript">
var str = "hello world";
//for循环中使用str.length
for(i=0;i<str.length;i++)
{
//...
}
</script>

拆箱操作(Unbox)就更简单了,分为自动拆箱和手动拆箱两种,例如:

    <script type="text/javascript">
var strObj = new String("hello world");
alert(typeof strObj);//object
alert(typeof (strObj + ""));//string
alert(typeof strObj.valueOf());//sring
</script>

当对象类型和基本类型数据进行运算时会自动拆箱,我们还可以手动调用对象的valueOf()方法进行拆箱。

演示代码地址:https://github.com/rongbo-j/you-dont-know-js

你不知道的JavaScript(六)Box&Unbox的更多相关文章

  1. JavaScript中的this(你不知道的JavaScript)

    JavaScript中的this,刚接触JavaScript时大家都在大肆渲染说其多么多么的灵巧重要,然而自己并不关心:随着自己对JavaScript一步步深入了解,突然恍然大悟,原来它真的很重要!所 ...

  2. 读《你不知道的JavaScript(上卷)》后感-浅谈JavaScript作用域(一)

    原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们,也入手看看这 ...

  3. 《你不知道的 JavaScript 上卷》 学习笔记

    第一部分: 作用域和闭包 一.作用域 1. 作用域:存储变量并且查找变量的规则 2. 源代码在执行之前(编译)会经历三个步骤: 分词/此法分析:将代码字符串分解成有意义的代码块(词法单元) 解析/语法 ...

  4. 《你不知道的JavaScript》整理(二)——this

    最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...

  5. 《你不知道的JavaScript》整理(一)——作用域、提升与闭包

    最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 ...

  6. 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域

    你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...

  7. 你不知道的JavaScript上卷笔记

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章   初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...

  8. 从头开始学JavaScript (六)——语句

    原文:从头开始学JavaScript (六)--语句 一.条件分支语句:if 基本格式: if (<表达式1>){    <语句组1>}else if (<表达式2> ...

  9. 【读书笔记】-- 你不知道的JavaScript

    <你不知道的JavaScript>是一个不错的JavaScript系列书,书名可能有些标题党的意思,但实符其名,很多地方会让你有耳目一新的感觉. 1.typeof null === &qu ...

  10. 读书笔记-你不知道的JavaScript(上)

    本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...

随机推荐

  1. 常见问题处理之Emoji

    所谓Emoji就是一种在Unicode位于\u1F601-\u1F64F区段的字符.这个显然超过了目前常用的UTF-8字符集的编码范围\u0000-\uFFFF.Emoji表情随着IOS的普及和微信的 ...

  2. VB.net 捕获项目全局异常

    在项目中添加如下代码:新建窗口来显示异常信息. Namespace My '全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 '添加后还需要一个From用来显示 ...

  3. PHP验证器类Validator

    Particle\Validator是一个小巧优雅的实用的PHP验证类库,提供了一个非常简洁的API.它无需依赖其他组件,提供友好的文档,并且有利于扩展. 安装 composer require pa ...

  4. ZBrush设计制作小怪兽并用KeyShot渲染

    ZBrush为电影制作设计独特的生物概念重点向大家介绍了概念设计师Ian Joyner使用ZBrush®3D图形绘制软件雕刻面对镜头咆哮的生物半身像的具体过程,ZBrush创建好模型之后,要想让角色更 ...

  5. Java从入门到精通一步到位!

    Java作为近几年来非常火的编程语言,转行来做Java的人不计其数,但如今真正的人才仍然匮乏,所以学习Java一定要有一个系统的学习规划课程.阿里云大学帮您规划Java学习路线可以帮助您从一个小白成长 ...

  6. 操作mysql操作数据库

    操作数据库 查询数据库:show databases: 增加数据库:create database student default character set uft-8:(设置默认字符集) 删除数据 ...

  7. jquery 将函数作为参数传递

    等待执行函数 这是自己封装的layui的询问框 //------[询问框](parameter:执行函数的参数,f_name:执行函数,msg:提示,time:自动消失时间,btn_arr:按钮组,o ...

  8. 使用 satis 搭建 composer 本地仓库

    环境 windows nginx php composer 安装 拉取 satis 项目包,并拉取项目依赖 composer create-project composer/satis --stabi ...

  9. vue 根据下拉框动态切换form的rule

    taskCategorySelect (val) { // 任务类别下拉选择 if ( val == 5 ) { this.cameraORgateway = false; // true不可以使用 ...

  10. jboss <context /> 配置虚拟路径,映射本地文件

    这个目录下的server.xml <host><host/>标签中添加: <Context path="/file" docBase="D: ...