你不知道的JavaScript(六)Box&Unbox
很多语言中都有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()方法进行拆箱。
你不知道的JavaScript(六)Box&Unbox的更多相关文章
- JavaScript中的this(你不知道的JavaScript)
JavaScript中的this,刚接触JavaScript时大家都在大肆渲染说其多么多么的灵巧重要,然而自己并不关心:随着自己对JavaScript一步步深入了解,突然恍然大悟,原来它真的很重要!所 ...
- 读《你不知道的JavaScript(上卷)》后感-浅谈JavaScript作用域(一)
原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们,也入手看看这 ...
- 《你不知道的 JavaScript 上卷》 学习笔记
第一部分: 作用域和闭包 一.作用域 1. 作用域:存储变量并且查找变量的规则 2. 源代码在执行之前(编译)会经历三个步骤: 分词/此法分析:将代码字符串分解成有意义的代码块(词法单元) 解析/语法 ...
- 《你不知道的JavaScript》整理(二)——this
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...
- 《你不知道的JavaScript》整理(一)——作用域、提升与闭包
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 ...
- 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域
你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
- 从头开始学JavaScript (六)——语句
原文:从头开始学JavaScript (六)--语句 一.条件分支语句:if 基本格式: if (<表达式1>){ <语句组1>}else if (<表达式2> ...
- 【读书笔记】-- 你不知道的JavaScript
<你不知道的JavaScript>是一个不错的JavaScript系列书,书名可能有些标题党的意思,但实符其名,很多地方会让你有耳目一新的感觉. 1.typeof null === &qu ...
- 读书笔记-你不知道的JavaScript(上)
本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...
随机推荐
- BZOJ 3052 树上带修莫队
思路: 就是把带修莫队移到了树上 块的大小开到(n^2/3)/2 比较好- 这是一个卡OJ好题 //By SiriusRen #include <cmath> #include <c ...
- C# 正则表达式
C# 正则表达式 正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成. 定义正则表达式 下面列出了用于定义正则表达式的各种类 ...
- CentOS 安装 PHP 扩展
下载地址:https://pecl.php.net/package/redis 上传目录:/usr/local/src //安装依赖 yum install php-devel -y //进入安装包目 ...
- hdu 3549 Flow Problem 【最大流】
其实还是不是很懂dinic----- 抄了一个模板--- http://www.cnblogs.com/naturepengchen/articles/4403408.html 先放在这里--- #i ...
- Kattis -Backspace
Backspace Bjarki having trouble Shortly before the programming contest started, Bjarki decided to up ...
- Linux入门学习
什么是Linux? Linux是一个操作系统软件.和Windows不同的是,Linux是一套开放源代码程序的.并可以自由传播的类Unix操作系统,它是一个支持多用户.多任务.多线程和多CPU的操作系统 ...
- 解决MYSQL的错误:Got a packet bigger than 'max_allowed_packet' bytes
Mysql 5.1开始遇到的信息包过大问题,当用客户端导入数据的时候,遇到错误代码: 1153 - Got apacket bigger than 'max_allowed_packet' bytes ...
- vertical-align到底是个啥
https://developer.mozilla.org/en-US/docs/Web/CSS/vertical-align http://phrogz.net/css/vertical-align ...
- 编写高性能的javascript代码(持续更新)
参考资料: Vanilla JS——世界上最轻量的JavaScript框架(没有之一) http://segmentfault.com/a/1190000000355277 探索高效jQuery的奥秘 ...
- WePy--使用zanUI组件
因为Wepy 中不能直接引入zanUI组件, 好在还有百度, 参考链接 https://github.com/brucx/wepy-zanui-demo (感谢); 我的做法是将 源码下了下来, 源码 ...