前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >红宝书 📒 5.3 基本引用类型-原始包装类型

红宝书 📒 5.3 基本引用类型-原始包装类型

作者头像
用户4793865
发布2023-01-12 13:37:42
2430
发布2023-01-12 13:37:42
举报
文章被收录于专栏:前端小菜鸡yym前端小菜鸡yym

思考🤔 1

首先,思考一个问题:我们定义一个字符串,这个字符串是一个原始值,那么为什么我们可以对其使用方法呢?如下

代码语言:javascript
复制
let a = "ss"
let b = a.substring(2)   

答案是: ECMAScript 提供了三种特殊的引用类型 Boolean Number String。每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象。

后台处理实际上经过了如下的过程:

代码语言:javascript
复制
let a = new String("ss")    //创建一个String类型实例
let b = a.substring(2)      // 调用实例上的方法
a = null                    // 销毁实例

思考🤔 2

给原始值添加属性可以吗?也就是定义一个字符串,能给字符串添加属性吗?

代码语言:javascript
复制
    let s = "some"   
    s.name = "test"   
    console.log(s.name)    //  undefined

第二行运行会创建一个String对象,但在第三行执行前,已经被销毁了。

第三行也创建了一个String对象,但是没有name属性。

思考🤔 3

原始包装类的typeof会是什么?

其实这个问题多余问,都是引用类型了。执行typeof 一定是object类型。

看两行代码

代码语言:javascript
复制
let string = new String("ss")
typeof string    //  object
if(string){
    console.log(11)
}                          // 11

打印了11,说明什么?说明if(string)括号内的条件是true。所有的原始包装类都会转换为布尔值true。

代码语言:javascript
复制
Boolean(string)  //true

因为Object构造函数作为一个工厂方法,可以根据传入的类型返回相应的原始包装类型(下面是用instanceof 检测具体的引用类型,因为typeof对于引用类型的检测都是object,当然除了函数)

代码语言:javascript
复制
let obj = new Object("some")
console.log(obj instanceof String)      // true

类型转换

代码语言:javascript
复制
let value = "24"
let number = Number(value)

而如果在前面加一个new关键字,就是构造函数了。

代码语言:javascript
复制
let obj = new Number("24")
typeof obj            //object

5.3.1 Boolean

重写了valueOf(),返回原始数据类型。toString()返回字符串

创建

传入true或false。当然你传入字符串:"true","false"也是可以的,因为他自己会处理。

代码语言:javascript
复制
let bool = new Boolean(true)
let bool1 = new Boolean(false)     

很少使用

Boolean对象在ECMAScript中很少使用。

代码语言:javascript
复制
let booleanObj = new Boolean(false)
let result = booleanObj && true         // 前面说过Boolean对象都会转为true
console.log(result)                     // true

一般这种情况下我们都是声明原始值的boolean类型

代码语言:javascript
复制
let falseValue = false
let result = falseValue && true
console.log(result)                // false

5.3.2 Number

重写了valueOf()、toLocalString()、toString()方法。

  • valueOf():返回对象的原始值
  • toString():不传参数返回字符串、参数传 2 8 10 16 分别对应二进制、八进制、十进制、十六进制。
  • toLocalString():返回字符串

其他方法 之所以原始类型能使用方法,是因为原始包装类型

toFixed()

返回指定小数点位数的数值字符串

代码语言:javascript
复制
let num = 10
console.log(num.toFixed(2))   // "10.00"

如果小数的位数大于 指定的小数位数,则四舍五入

代码语言:javascript
复制
let num = 10.005
console.log(num.toFixed(2))   // "10.01"

对了,这里提一下 一个特殊的求和,好像是计算机二进制上的问题。所有语言执行都会这样

代码语言:javascript
复制
0.1+0.2 = 0.30000000000000004

toExponential()

返回科学计数法表示的数值字符串。参数表示结果中的小数的位数。

一般来说,这么小的数不会使用科学计数法

代码语言:javascript
复制
let num =10
num.toExponential()        // "1.0e+1"

toPrecision()

根据情况返回最合理的输出结果

代码语言:javascript
复制
let num = 99; 
console.log(num.toPrecision(1)); // "1e+2" 
console.log(num.toPrecision(2)); // "99" 
console.log(num.toPrecision(3)); // "99.0"

isInteger()

ES6新增,用于检测是否是整数。有时候,1.00也会被认为是浮点数

代码语言:javascript
复制
console.log(Number.isInteger(1))     // true
console.log(Number.isInteger(1.0))   // true
console.log(Number.isInteger(1.01))   // false

5.3.3 String

3个继承的方法

valueOf()、toLocaleString()和 toString()都返回对象的原始字符串值。

length属性

字符串都具有length属性

代码语言:javascript
复制
let str = "hello"
str.length            // "5"

charAt()

找到指定位置的字符

代码语言:javascript
复制
let str = "hello"
console.log(charAt(2))    "l"

charCodeAt()

查看指定码元的字符编码。Unicode码

代码语言:javascript
复制
"A".charCodeAt()    //65

我觉得不是很常用。

concat()

用于将一个或多个字符串拼接成一个新字符串,可以接收多个参数。但我们常用的拼接方式都是用 + 加号

代码语言:javascript
复制
let a1 ="bro"
let a2 ="ther"
let a3 = a1.concat(a2,"!")   // 'brother!'

let a4 = a1 + a2 

slice() substr() substring()

都是截取字符串的方法

两个参数

  • 第一个:截取开始位置
  • 第二个:截取结束位置 非必要 不包括这个位置的字符
代码语言:javascript
复制
let str = "hello world"
str.slice(3)       // "lo world"
str.substring(3)   // "lo world"
str.substr(3)      // "lo world"

str.slice(3,7)     // "lo w"   不包括7位置上的o
str.substring(3,7) // "lo w"
str.substr(3,7)    // "lo w"

当参数是负数,就不同了

代码语言:javascript
复制
str.slice(-3)   // "rld"    从右侧开始 是-1
str.substr(-3)  // "rld"    第一个负参数当成字符串长度+这个值  11 +(-3)= 8  相当于 str.substr(8)
str.substring(-3)  // "hello world"   负数被替换为0

str.slice(3,-4)   // "lo w"    
str.substr(3,-4)   // ""            第二个负参数转为0   (3,0)所以是空
str.substring(3,-4)  // "hello world"   

字符串位置方法

  • indexOf():字符第一次出现的位置
  • lastIndexOf():字符第二次出现的位置 如果字符串中不含有此字符,则返回-1let str = "hello world" str.indexOf("o") // 4 str.lastIndexOf("o") // 7 还有可选的第二个参数let str = "hello world" str.indexOf("o",6) // 7 str.lastIndexOf("o",6) // 4 结果恰好反过来了。indexOf从索引为6的位置开始向后搜索,lastIndexOf从索引为6的位置向前搜索。

字符串包含方法

ES6新增

  • startsWith():是否以传入字符串为起始
  • endsWith():是否以传入字符串为结束
  • includes():是否包含传入字符串
代码语言:javascript
复制
let str ="start"
str.startsWith("s")      // true
str.startsWith("a")      // false
str.includes("s")        // true
str.includes("srt")      // false

startsWith() 和 endsWith() 有第二个参数。

去空格

  • trim() 会创建字符串的一个副本,删除前、后所有空格,再返回结果。
  • trimLeft() 从字符串开始去空格
  • trimRight() 从字符串末尾去空格repeat() 参数是重复出现次数let a ="cat" a.repeat(5) // catcatcatcatcat padStart()和 padEnd() 两个参数:第一个参数:新字符串的长度,第二个参数:补位的字符
代码语言:javascript
复制
let a = "cat"
a.padStart(6,"!")   // '!!!cat'   以补位字符开始
a.padStart(6)       // '   cat'   不传第二个参数就是空格

a.padEnd(6,"!")     // 'cat!!!'   以补位字符结束
a.padEnd(6)         // 'cat   '

a.padStart(3)        // 'cat'    等于原字符串长度就相当于复制
a.padStart(2)        // 'cat'    小于原字符串长度相当于复制

字符串迭代与解构

字符串的原型上暴露了一个@@iterator,表示可以迭代字符串的每个字符。

代码语言:javascript
复制
let a = "cat"
let itera = a[Symbol.iterator]
console.log(itera.next())   // {value: 'c', done: false}
console.log(itera.next())   // {value: 'a', done: false}
console.log(itera.next())   // {value: 't', done: false}
console.log(itera.next())   // {value: undefined, done: true}   done:true 结束了

解构也是因为这个迭代器才可以实现的

代码语言:javascript
复制
let a ="cat"
console.log([...a])  // ['c', 'a', 't']

大小写转换

地区特定方法和通用方法一样。如不知道代码涉及什么语言,最好使用Local的

代码语言:javascript
复制
let world = "Hello World"
world.toLocaleLowerCase()   // 'hello world'
world.toLowerCase()          // 'hello world'

world.toLocaleUpperCase()   // 'HELLO WORLD'
world.toUpperCase()          //'HELLO WORLD'
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思考🤔 1
  • 思考🤔 2
  • 思考🤔 3
  • 5.3.1 Boolean
  • 5.3.2 Number
    • toFixed()
      • toExponential()
        • toPrecision()
          • isInteger()
          • 5.3.3 String
            • charAt()
              • charCodeAt()
                • concat()
                  • slice() substr() substring()
                    • 字符串位置方法
                      • 字符串包含方法
                        • 去空格
                          • 字符串迭代与解构
                            • 大小写转换
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档