5.6 JS中基本包装类型
为了便于操作基本类型值,ES还提供了三种特殊的引用类型,即(基本包装类型):Number,String,Boolean。这三种类型与前面介绍的引用类型相似,但同时也拥有基本数据类型的一些特性。
平时经常看到人家代码里创建了一个字符串/数字类型,然后使用字符串/数字类型的一些方法,比如,split()、substring()等等,搞得我们误以为这些方法是基本包装类型拥有这些方法。其实,我们这种理解是错误的。实际上,当我们操作基本包装类型数据时,在后台就会悄悄的创建一个对应的基本包装类型的对象。因为是对象呀,所以我们才能够调用对象所拥有的方法。
举个例子:
var str = "hello,1024idea";
var strSub = str.substring(2,7);
console.log(strSub);//llo,1
执行上面代码,其实,在后台会执行如下步骤:
- 创建基本包装类型的对象实例
- 调用对象实例的函数
- 销毁这个对象
如下所示:
var str = "hello,1024idea";
var str2 = new String(str);
var strSub = str2.substring(2,7);
str2.null;
console.log(strSub);//llo,1
引用类型与基本包装类型的区别:在于对象的生命周期。
使用new关键字创建的引用类型的实例,对象在当前作用域都存在。而基本包装类型自动创建的对象则在对象被调用的时刻存在,调用完毕后,就被销毁不存在了。
Object()构造函数,可以根据你传入的参数的类型,返回基本包装类型的实例。你传入字符串,则返回String类型的实例;传入数字,则返回Number类型的实例;传入布尔值,则返回Boolean类型实例。如:
var obj = new Object("hello,1024idea");
console.log(obj instanceof String);// true
注意:使用new关键字创建的构造函数与使用同名的转型函数的效果是不一样的。如:
// 构造函数与转型函数返回值的区别
var str = "1024"; var strObj = new String(str);
console.log(typeof strObj);//object var strNum = Number(str);
console.log(typeof strNum);//number
这个例子中,变量strObj保存的是object类型,而变量strNum保存的是number类型。
一般情况下,是不建议手动的去创建基本包装类型的对象,因为这样经常造成的问题是,分不清自己是在处理基本包装类型还是引用类型。
Boolean类型
Boolean类型是布尔值创建的引用类型。创建Boolean类型,可以使用Boolean构造函数去创建,并传入true或者false参数。如:
var booleanObject = new Boolean(true);
注意:在布尔表达式中使用Boolean对象,我们可能会出错的一些地方,如:
var booleanObj = new Boolean(false);
var result = booleanObj && true;
console.log(result);
你觉得上面会打印出什么结果呢?大多数人可能会说是false,因为一真一假嘛,所以为false。但是,事实上结果是true,因为booleanObj是一个对象,在布尔表达式中,所有的对象都会被转换为true。记住:引用类型的布尔值,其实是对象。
当然,我们不推荐这么用(不推荐用引用类型的布尔值来判断布尔表达式)
Number 类型
Number类型是数字值创建的引用类型。创建Number类型,使用Number类型的构造函数,可以传递数字值参数,如:
var numberObj = new Number(1024);
这里介绍一个Number类型的一个方法:numberObj.toFixed();可以接受一个数值,表示保留的小数的个数(会自动四舍五入)。在平时项目中,我们经常要处理价格问题或者增长率问题,即保留多少为小数,用这个方法非常有效。
// Number 类型
var numberObj = new Number(1024.153);
console.log(numberObj.toFixed(2));//1024.15
console.log(numberObj.toFixed(1));//1024.2
String类型
String类型是字符串值创建的引用类型。
String类型创建的方式,使用String构造函数创建,可以传入字符串参数;如:
var stringOjb = new String("hello,1024idea");
String类型的每个实例都有一个length属性,用于计算字符串的长度(即字符串中包含多少个字符)。
字符方法:charAt(),charCodeAt(),接受一个数字参数,返回某个数字索引位置的字符或字符编码。
在ES5还定义了另一个访问字符串中某个字符的方法,在支持ES5的浏览器中,可以用方括号[]来访问。
// String类型
var str = "hello,1024idea";
console.log(str.charAt(4));//o
console.log(str.charCodeAt(4));//111
console.log(str[4]);//o
字符串的操作方法:concat(),可以将多个字符串连接起来。返回得到的新字符串。
var str1 = "hello,";
var str2 = str1.concat("1024idea");
console.log(str2);//hello,1024idea
其实,实践中,我们平时用的多的还是用“+”去拼接字符串。
slice(),substring(),substr().这三个是截取字符串的函数。其中,slice()跟substring()非常类似,第一个参数都是截取的起始位置,第二个参数是截取的终止位置;而substr()第一个参数是起始位置,第二个参数则是需要截取的长度。
这三个函数,都不改变原本的字符串,只是在原先的字符串上创建了一个副本。返回操作副本后的值。
字符串的位置方法:indexOf(),lastIndexOf();从索引0的位置开始查询子字符串/从最后一个索引开始查找字符串。如果找到,则返回子字符串的位置,如果没有找到,返回-1;第一个参数为要查找的子字符串,第二个参数 可选的,如果有,则表示从某个位置开始查找。
ES5中还定义了trim()方法,去除字符串的开头和结尾的所有空格。此外,对于firefox,safari,chrome的后面的一些版本中,还支持非标准的trimLeft()和trimRight()方法,用于删除字符串的开头空格或结尾空格。
字符串的大小写转换方法:toLowerCase(),toUpperCase();
原文链接:http://www.1024idea.com/archives/422
注:转载请说明出处。
5.6 JS中基本包装类型的更多相关文章
- js中基本包装类型详情
基本包装类型 基本包装类型有Boolean,Number和string类型,每当读取一个基本类型值时,后台就会创建一个对应的基本包装类型对象. 从逻辑上,基本类型值不是对象,没有方法,但从技术上来看, ...
- js中的包装对象。
我们都知道在js中普通类型的变量是没有属性和方法的,然后有时却并不是这样. var str = "努力,奋斗"; console.log(str.length); var num ...
- js之基本包装类型
为了便于操作“基本类型值”,JS 提供了 三个 特殊的引用类型:Boolean.Number.String.这些类型和其他引用类型相似,但同时 也具备 与各自基本类型相应的特殊行为. 实际上:每当读取 ...
- js的基本包装类型
基本包装类型(包装对象): 先看下以下代码: var s1 = "helloworld"; var s2 = s1.substr(4); 上面我们说到字符串是基本数据类型,不应该有 ...
- js中的变量类型
js 中输出定义变量的类型 typeof 变量名. var u: --underfined类型 var s = "你是一个好人": --string类型 var n = ...
- JS中的各种类型转换规则(转)
JS中的类型转换非常恶心,大家都懂的,不过该学还是要学. 今天看犀牛书看到了转换规则,总结出来. X转字符串.数字.布尔值 X表示各种类型的值,直接上图: 值 转数字 转字符串 转布尔值 undefi ...
- JS 中对变量类型的五种判断方法
5种基本数据类型:undefined.null.boolean.unmber.string 复杂数据类型:object. object:array.function.date等 方法一:使用typeo ...
- JS中 typeof,instanceof类型检测方式
在js中的类型检测目前我所知道的是三种方式,分别有它们的应用场景: 1.typeof:主要用于检测基本类型. typeof undefined;//=> undefined typeof 'a' ...
- JS 中对变量类型判断的几种方式
文章整理搬运,出处不详,如有侵犯,请联系~ 数据类型判断和数据类型转换代码工具 在 JS 中,有 5 种基本数据类型和 1 种复杂数据类型,基本数据类型有:Undefined, Null, Boo ...
随机推荐
- 超详细mysql left join,right join,inner join用法分析
下面是例子分析表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 ...
- HTML5 标签 details 展开 搜索
details有一个新增加的子标签--summary,当鼠标点击summary标签中的内容文字时,details标签中的其他所有元素将会展开或收缩. 默认状态为 收缩状态 设置为展开状态为 <d ...
- 读过MBA的CEO更自私?《哈佛商业评论》2016年第12期。4星
老牌管理杂志.每期都值得精度.本期我还是给4星. 以下是本书中的一些内容的摘抄: 1:他们发现在Airbnb上,如果客人姓名听起来像黑人,那么比名字像白人的客人的接受率会低16%.#45 2:对立组织 ...
- mysql 外键约束备注
梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- JavaScript之web通信
web通信,一个特别大的topic,涉及面也是很广的.因最近学习了 javascript 中一些 web 通信知识,在这里总结下.文中应该会有理解错误或者表述不清晰的地方,还望斧正! 一.前言 1. ...
- 解析大型.NET ERP系统 灵活复杂的界面控件Infragistics WinForms
Infragistics 是.NET平台优秀的控件供应商,囊括了WinForms,ASP.NET,Silverlight,WPF,Windows Phone等所有关于微软.NET技术的界面控件.借助于 ...
- HTML5 学习总结(一)——HTML5概要与新增标签
一.HTML5概要 1.1.为什么需要HTML5 HTML4陈旧不能满足日益发展的互联网需要,特别是移动互联网.为了增强浏览器功能Flash被广泛使用,但安全与稳定堪忧,不适合在移动端使用(耗电.触摸 ...
- SQL Server里在文件组间如何移动数据?
平常我不知道被问了几次这样的问题:“SQL Server里在文件组间如何移动数据?“你意识到这个问题:你只有一个主文件组的默认配置,后来围观了“SQL Server里的文件和文件组”后,你知道,有多 ...
- Java进击C#——开发环境
在进入本章之前.笔者想说一些话.对于笔者来讲语言没有好坏之分.只有适不适用之别.当上一篇发到首页的时候,我突然发现有可能会引发争论.这是笔者担心的,这也是笔者不想看到的. 笔者想写这一系列的原因不是为 ...