资讯专栏INFORMATION COLUMN

重温JS基础--引用类型(三)

kel / 508人阅读

摘要:今天把接下来引用类型中的一些内容全部记录完毕基本包装类型为了便于操作基本类型值,还提供了种特殊的引用类型。这三种类型具有与各自的基本类型响应的特殊行为。重写后的返回对象表示的数值类型,另外两个方法则返回字符串形式的数值。

今天把接下来引用类型中的一些内容全部记录完毕~

基本包装类型

为了便于操作基本类型值,JavaScript还提供了3种特殊的引用类型:Boolean, Number, String。这三种类型具有与各自的基本类型响应的特殊行为。

实际上每当读取一个基本类型值得时候,后台就会创建一个对应的基本包装类型的对象。从而可以调用一些方法来操作这些数据。

var s1 = "some text"
var s2 = s1.substring(2)

如上,s1包含一个字符串,字符串应该是基本类型的,而下一行调用了s1的substring方法,并保存在了s2中。但是一般只有对象才具有方法,s1是一个基本类型的字符串是不应该具有这个特性的,那么是为什么呢?

这是因为访问s1的时候处于一种读取模式,也就是要从内存中读取这个字符串的值,然而在读取模式中访问这个字符串时后台都会进行如下操作:

1. 创建一个String类型的实例
2. 在实例上调用指定方法
3. 销毁这个实例

经过这样的处理,基本的字符串值就变得跟对象一样了。

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

因为有了基本包装类型对象,虽然我们可以显示的创建String,Number,Boolean创建包装类型的对象,但是我们不建议这样去做,因为这样很容易把自己弄混淆,不知道自己在处理基本类型还是引用类型的值,

Object构造函数会像工厂方法一样,根据传入的值得类型返回对应基本包装类型的实例。

var obj = new Object("text") //创建了一个string实例

console.log(obj instanceOf String) //true

Boolean
Boolean算是比较简单的,不需要过得的介绍,但是有一点是值得我们去注意的。

因为首先我们要知道布尔表达式中所有的对象都会被转为true,看下面一个例子:

var f = new Boolean(false)
var res = f && true;
console.log(f) //false
console.log(res) //true

var f = false
var res = f && true
console.lo(res) //false

而且基本类型和引用类型的布尔值还有两个区别:

var f = false
var f1 = new Boolean(false)

typeof f //"boolean"
typeof f1 // "object"

f instanceOf Boolean // false
f1 instanceOf Boolean //true

Number类型
接下来再看下Number类型,Number类型也改写了原来的toString(),valueOf(),toLocaleString()方法。重写后的valueOf()返回对象表示的数值类型,另外两个方法则返回字符串形式的数值。我们还可以给toString()方法传递一个表示基数的参数,告诉它返回几进制数值的字符串形式。

var num = 10
console.log(num.toSting()) //10
console.log(num.toSting(2)) //1010

除了继承的方法外,Number还提供了一些用于将数值格式化为字符串的方法:

var num = 10
console.log(num.toFixed(2)) // "10.00"

另外可以格式化数值的方法是toExponential(),该方法返回以指数表示法,表示的数值的字符串形式,

var num = 10
console.log(num.toExponential(1)) //"1.0e + 1"

String类型

String类型是字符串的对象包装类型。String对象的方法可以在所有基本的字符串值中访问到,其中继承的valueOf,toString, toLocaleString都是返回基本的字符串。

String类型的每个实例都有一个length属性,表示字符串中包含多少个字符。

var str = "abc"
console.log(str.length) //3

接下来介绍一些字符串的方法:

1. 字符方法 charAt、charCodeAt

两个用于访问字符串中特定字符的方法,这两个方法都接受一个基于0的参数,即表示字符基于0的位置。charAt以单字符传形式返回给定位置的那个字符串。

var str = "hello"
console.log(str.charAt(1)) // "e",如果传入负数或大于字符串长度的数字则返回undefined

如果你想获得到的不是该位置上的字符,而是该字符编码

var str = "hello world"
console.log(str.charCodeAt(1)) //"101",如果不存在的话返回NAN
2. 字符串操作方法

(1). concat()
创建一个字符串副本,然后用该副本将一个或多个字符串拼接起来返回一个新的字符串:

var str = "hello"
var res = str.concat(" world", "!")
console.log(res) //"hello world!"
console.log(str) //"hello" 
(2). substring, slice , substr

基于子字符串副本创建新字符串的方法,这个三个方法都接受两个参数,slice和substring的第二个参数都表示子字符串到哪里结束,而substr规定的是返回的字符串个数。如果没有传入第二个参数,则将字符串的末尾作为结束为止,和concat一样,这三个方法都不会修改字符串本身。

var str = "hello world"
console.log(str.slice(3)) //"lo world"
console.log(str.substring(3))// "lo world"
console.log(str.substr(3)) //"lo world"
console.log(str.slice(3, 7)) //"lo w"
console.log(str.substring(3, 7)) //"lo w"
console.log(str.substr(3, 7)) //"lo worl"

有一种特殊的情况,就是当我们传入带有负数的时候,就有所差异了:
传入到slice中的负数会从字符串后端开始数。
substr的第一个负数会从字符串尾部开始数,第二个如果是负数的话会转为0。
substring会把所有负数都转为0,若果第二个参数比第一个小的话会调换两个参数位置:

var str = "hello world"
console.log(str.slice(-3)) //"rld"
console.log(str.substring(-3)) //"hello world"
console.log(str.substr(-3)) //"rld"
console.log(str.slice(3, -4)) //"lo w"
console.log(str.substring(3, -4)) //"hel"
console.log(str.substr(3, -4)) //""
(3). 字符串位置方法(indexOf, lastIndexOf)

有两个可以从字符串中查找子字符串的方法:indexOf()lastIndexOf().这两个方法都是从一个字符串中搜索给定的子字符串,然后返回子字符串的位置,如果没有找到子字符串,则返回-1。这两个方法的区别就是indexOf是从字符串的头部进行搜索,而lastIndexOf是从字符串末尾位置向前搜索。

var str = "hello world"
console.log(str.indexOf("o")) //4
console.log(str.lastIndexOf("o")) //7

这两个方法都可以接受第二个参数,表示是从哪个位置进行查找。

var str = "hello world"
console.log(str.indexOf("o", 6)) //7
console.log("o", 6) // 4
(4). trim()方法

该方法会创建一个字符串的副本,删除前置以及后缀的所有空格:

var str = " hello world " 
var trimStr = str.trim()
console.log(str) // " hello world "
console.log(trimStr) //"hello world"
(5). 字符串大小转换方法

toLowerCase(), toUpperCase(), toLocaleLowerCase(), toLocaleUpperCase()
这些都是比较简单常见的就不一一介绍了~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88701.html

相关文章

  • 重温基础】22.内存管理

    摘要:内存泄露内存泄露概念在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。判断内存泄漏,以字段为准。 本文是 重温基础 系列文章的第二十二篇。 今日感受:优化学习方法。 系列目录: 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理) 【重温基础】1-14篇 【重温基础】15.JS对象介绍 【重温基础】16.JSON对象介绍 【重温基础】1...

    Pandaaa 评论0 收藏0
  • 重温JS基础--变量、作用域和内存问题

    摘要:作用域链是保证对执行环境有权访问的所有变量和函数的有序访问。如上,包含的作用域链包含它自己的变量对象和全局环境的变量对象,为什么能在函数内访问,这就是通过作用域链找的。 前言JavaScript的变量类型是弱类型的,在特定的时间内保存一个特定的值,变量的值和数据类型可以在脚本的生命周期内随意改变。 1. 基本类型和引用类型的值 JavaScript包含两种不同类型的值:基本类型和引用类...

    huaixiaoz 评论0 收藏0
  • 重温JS基础--引用类型(二)

    摘要:创建一个日期对象中国标准时间在调用构造函数而不传参数的情况下,新创建的对象自动获得当前日期和时间。日期格式化方法类型还有一些专门用于将日期格式化为字符串的方法中国标准时间下午以上的这些方法都会根据系统环境而异。 咱们接着上面一篇继续~ 1. Date类型 JavaScript中的Date类型使用自UTC时间,1970年1月1日零时开始的毫秒数来保存日期。创建一个日期对象: var no...

    NusterCache 评论0 收藏0
  • 重温JS基础--继承

    摘要:继承了如上,我们通过方法借调了超类的构造函数,实际上是在新创建的实力环境下调用了构造函数。组合继承组合继承的基本思想将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。继承方法在上面这个例子中,构造函数定义了两个属性和。 在ECMAScript中只支持实现继承,而且实现继承主要是依靠原型链来实现的。 1. 什么是原型链 继承基本思想:利用原型让一个引用类型继承另一个...

    sixleaves 评论0 收藏0
  • 重温基础】6.数字

    摘要:本文是重温基础系列文章的第六篇。以指定的精度返回该数值对象的字符串表示,可接收一个参数,用来指定有效数个数的整数。 本文是 重温基础 系列文章的第六篇。今日感受:自己需要多总结,会有不同收获(比如今晚我做的转正总结)。 系列目录: 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理) 【重温基础】1.语法和数据类型 【重温基础】2.流程控制和错误处理 【重温基础】3.循环和...

    terro 评论0 收藏0

发表评论

0条评论

kel

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<