JavaScript字符串对象


Posted in Javascript onJanuary 14, 2017

JavaScript 对象是一种复合值,是有属性或已命名值的集合。通过”.”来引用属性值。当属性值是一个函数的时候,称其为方法。那么本篇文章来讲解讲解JavaScript中的String对象。

我们在书写js代码时,经常调用字符串的length属性,substring()方法,charAt(),indexOf()方法等。这里需要特别说明一点是js中字符串对象也是不可变的。 通过+拼接字符串创建一个字符串对象,建议使用[].join()的方式拼接字符串。

看下面的例子:

var str="javascript";
var len=str.length;
var substr=str.substring(2,len);

那么一个问题来了,字符串不是对象为什么又属性呢? 我们知道在js中使用”“或者”号包装起来的,我们都叫字符串。在字符串调用length属性或者其方法时, JavaScript就会隐士的将字符串的值通过调用new String(str)的方式转换为对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦引用结束,这个新创建的对象就会被自动销毁。同字符串一样,数字和布尔类型也具有各自的方法,通过new Number()、new Boolen() 构造函数创建一个临时对象,这些方法的调用均是来自这个临时对象。null和undefined没有包装对象,访问它们的属性会造成一个类型错误。

现在来看一个模拟过程的例子:

var str = "test";
    str.length = 10;
    str.testStrLen = 10;
    var res = str.length;
    console.log(res);//输出4
     res = str.testStrLen;
    console.log(res);//输出undefined

当js运行到这段代码的时候,res的值输出4、undefined。其中第二行代码尝试覆盖字符串原本的属性length,第三个增加一个属性testStrLen。从最终输出的结果来看,并未达到预期的结果。原因是第二行和第三行都分别创建了一个临时字符串对象,随后又销毁了这个临时对象。当进行取值是lenth获取的还是字符串里面的lenth属性,当尝试读取testStrLen的值,通过对应的原型链进行查找,没有找到,就返回一个undefined。通过测试这段代码说明了在读取字符串的时候,表现出来的结果像对象调用一样。但如果试图给其属性赋值,则会忽略这个操作,修改只是发生在临时对象上,然而这个临时对象并未继续保存下来。

存取字符串、数字、布尔类型值的属性时创建的临时对象称作包装对象,是偶尔用来区分字符串值和字符串对象、数字和数值对象以及布尔值和布尔对象。包装对象只是被看做是一种实现细节,而不用特别的关注。由于字符串、数字和布尔值的属性都是只读的,并且不能给他们定义新属性,因此有助于明白它们是有区别的。

需要注意的是,可通过String()、Number()、Boolean()构造函数来显示包装对象。

var str = new String("test");
    str.length = 10;
    str.testStrLen = 10;
    var res = str.length;
    console.log(res);//输出4
    res = str.testStrLen;
    console.log(res); //输出10

通过上面代码我们成功给str这个字符串对象增加了testStrLen属性,但是并没有成功覆盖原来的length属性,也由此可以推出原型链读取时自身属性优先,找到就不进行下一步查找。而testStrLen的成功追加也可有助于我们理解通过字符串直接追加属性时创建了一个临时的字符串对象。

那我们来比较一下包装和不包装的值得的相等性。

var str1 = new String("test");
    var str2 = "test";
    console.log(str1 == str2);//true
    console.log(str1 === str2);//false

    var n1 = new Number(1);
    var n2 = 1;
    console.log(n1 == n2);//true
    console.log(n1 === n2);//false

    var b1 = new Boolean(false);
    var b2 = false;

    console.log(b1 == b2);//true
    console.log(b1===b2);//false

由此我们可见JavaScript会在必要时将包装对象转换成原始值。“==”运算符将原始值和其包装对象视为相等。但是”===”全等运算符将它们视为不等。通过typeof运算符可以看到原始值和其包装对象的不同。
例如:

var str1 = new String("test");
    var str2 = "test";
    console.log(str1 == str2);//true
    console.log(str1 === str2);//false
    console.log(typeof str1); //object
    console.log(typeof str2); //string

    var n1 = new Number(1);
    var n2 = 1;
    console.log(n1 == n2);//true
    console.log(n1 === n2);//false
    console.log(typeof n1); //object
    console.log(typeof n2); //number


    var b1 = new Boolean(false);
    var b2 = false;
    console.log(b1 == b2);//true
    console.log(b1 === b2);//false
    console.log(typeof b1); //object
    console.log(typeof b2); //boolean

常见的typeof返回类型

JavaScript字符串对象

js数据类型 参考

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js function使用心得
May 10 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
Jan 14 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
全国省市二级联动下拉菜单 js版
May 10 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
jQuery.Callbacks()回调函数队列用法详解
Jun 14 Javascript
AngularJS1.X学习笔记2-数据绑定详解
Apr 01 Javascript
JavaScript中使用import 和require打包后实现原理分析
Mar 07 Javascript
用vue-cli开发vue时的代理设置方法
Sep 20 Javascript
vue+web端仿微信网页版聊天室功能
Apr 30 Javascript
Javascript如何递归遍历本地文件夹
Aug 06 Javascript
vue前端工程的搭建
Mar 31 Vue.js
jquery mobile移动端幻灯片滑动切换效果
Apr 15 #Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
Jan 14 #Javascript
jQuery实现select模糊查询(反射机制)
Jan 14 #Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
Jan 14 #Javascript
Angular2 PrimeNG分页模块学习
Jan 14 #Javascript
bootstrap datetimepicker日期插件使用方法
Jan 13 #Javascript
详解jQuery事件
Jan 13 #Javascript
You might like
缓存技术详谈―php
2006/12/14 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
php常用Stream函数集介绍
2013/06/24 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
JavaScript Split()方法
2015/12/18 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
单身联谊活动方案
2014/01/29 职场文书
环保小标语
2014/06/13 职场文书
员工保密协议书
2014/09/27 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
婚礼家长致辞
2015/07/27 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
Python 数据可视化之Seaborn详解
2021/11/02 Python