欢迎关注前端小讴的github,阅读更多原创技术文章
基本包装类型
相关代码 →
- 3 个特殊的引用类型
Boolean、Number、String
- 每读取一个基本类型值,后台就创建一个对应的基本包装类型的对象
var s1 = 'some text'
var s2 = s1.substring(2)
var s1 = new String('some text')
var s2 = s1.substring(2)
s1 = null
- 上述步骤同样适用于
Boolean 和 Number类型
- 引用类型和基本包装类型的主要区别在于对象的生存期:
- 引用类型:离开作用域前,对象一直在内存中
- 基本包装类型:执行完,立即被销毁
var s1 = 'some text'
s1.color = 'red'
console.log(s1.color)
- 对基本包装类型的实例调用 typeof 会返回"Object",所有基本包装类型的对象都会被转换为布尔值 true
- Object 构造函数,根据传入值的类型返回基本包装类型的实例
var objText = new Object('some text')
console.log(objText instanceof String)
var objBoolean = new Object(false)
console.log(objBoolean instanceof Boolean)
var objNumber = new Object(123)
console.log(objNumber instanceof Number)
console.log(objNumber instanceof Boolean)
- 使用
new 调用基本包装类型的构造函数 vs 直接调用同名的转型函数
var value = '25'
var number = Number(value)
console.log(typeof number)
var obj = new Number(value)
console.log(typeof obj)
Boolean 类型
var booleanObject = new Boolean(true)
| 重写(继承)的方法 | 返回值 |
|---|
| valueOf() | Boolean true / false |
| toString() | String "true" / "false" |
- 基本类型布尔值 vs 引用类型布尔值:
- typeof 操作符对基本类型返回 boolean,对引用类型返回 object
- instance 操作符对基本类型返回 false,对引用类型返回 true
var falseObj = new Boolean(false)
var falseValue = false
console.log(falseObj && true)
console.log(falseValue && true)
console.log(typeof falseObj)
console.log(typeof falseValue)
console.log(falseObj instanceof Boolean)
console.log(falseValue instanceof Boolean)
Number 类型
var numberObject = new Number(10)
| 重写(继承)的方法 | 返回值 |
|---|
| valueOf() | Number 数值 |
| toLocaleString() | String 字符串形式的数值 |
| toString() | String 字符串形式的数值 |
- 为 toString()方法传递表示基数的参数,告诉返回几进制的字符串形式
var num1 = 10
console.log(num1.toString())
console.log(num1.toString(2))
console.log(num1.toString(8))
console.log(num1.toString(10))
console.log(num1.toString(16))
| 格式化字符串方法 | 返回值 |
|---|
| toFixed(num) | String 指定小数位 |
| toExponential(num) | String 指数表示法 |
| toPrecision(num) | String 返回 fixed 或 exponential 格式 |
var num2 = 10000
console.log(num2.toFixed(2))
console.log(num2.toExponential(2))
var num3 = 99
console.log(num3.toPrecision(1))
console.log(num3.toPrecision(2))
console.log(num3.toPrecision(3))
- 基本类型数值 vs 引用类型数值:
- typeof 操作符对基本类型返回 number,对引用类型返回 object
- instance 操作符对基本类型返回 false,对引用类型返回 true
var numberObject = new Number(10)
var numberValue = 10
console.log(typeof numberObject)
console.log(typeof numberValue)
console.log(numberObject instanceof Number)
console.log(numberValue instanceof Number)
String 类型
var StringObject = new String('hello world')
| 重写(继承)的方法 | 返回值 |
|---|
| valueOf() | String 字符串值 |
| toLocaleString() | String 字符串值 |
| toString() | String 字符串值 |
- String 类型每个实例都有 length 属性,表示字符串包含的字符数量,双节字符也算作 1 个字符
console.log(stringObject.length)
| 字符方法 | 返回值 |
|---|
| charAt(num) | 给定位置的字符 |
| charCodeAt() | 给定位置的字符编码 |
console.log(stringObject.charAt(1))
console.log(stringObject.charCodeAt(1))
console.log(stringObject[1])
| 字符串操作方法 | 返回值 |
|---|
| concat() | 拼接得到的字符串 |
| slice(num1,num2) | 被操作字符串的子字符串 |
| substring(num1,num2) | 被操作字符串的子字符串 |
| substr(num1,num2) | 被操作字符串的子字符串 |
console.log(stringObject.concat(' wonderful'))
console.log(stringObject.slice(3))
console.log(stringObject.substring(3))
console.log(stringObject.substr(3))
console.log(stringObject.slice(3, 7))
console.log(stringObject.substring(3, 7))
console.log(stringObject.substr(3, 7))
console.log(stringObject.slice(-3))
console.log(stringObject.substring(-3))
console.log(stringObject.substr(-3))
console.log(stringObject.slice(3, -4))
console.log(stringObject.substring(3, -4))
console.log(stringObject.substr(3, -4))
| 字符串位置方法 | 返回值 |
|---|
| indexOf() | 子字符串的位置,前 → 后搜索 |
| lastIndexOf() | 子字符串的位置,后 → 前搜索 |
console.log(stringObject.indexOf('o'))
console.log(stringObject.lastIndexOf('o'))
console.log(stringObject.indexOf('o', 6))
console.log(stringObject.lastIndexOf('o', 6))
var loremString =
'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.'
var position = new Array()
var pos = loremString.indexOf('o')
while (pos > -1) {
position.push(pos)
pos = loremString.indexOf('o', pos + 1)
}
console.log(position)
| trim()方法 | 返回值 |
|---|
| trim() | 创建副本,删除前置后缀空格,返回副本 |
| trimLeft() | 创建副本,删除前置空格,返回副本 |
| trimRight() | 创建副本,删除后缀空格,返回副本 |
var stringValue = ' hello world '
var trimStringValue = stringValue.trim()
console.log(stringValue)
console.log(trimStringValue)
| 字符串大小写转换方法 | 返回值 |
|---|
| toLowerCase() | 转小写 |
| toLocaleLowerCase() | 根据地区转小写 |
| toUpperCase() | 转大写 |
| toLocaleUpperCase() | 根据地区转大写 |
console.log(stringObject.toUpperCase())
console.log(stringObject.toLocaleUpperCase())
console.log(stringObject.toLowerCase())
console.log(stringObject.toLocaleLowerCase())
| 字符串模式匹配方法 | 返回值 |
|---|
| match() | 数组 |
| search() | 首个匹配项索引,没有返回-1 |
| replace() | 替换后的字符串 |
| split() | 分割成多个字符串,放在数组中 |
var text = 'cat, bat, sat, fat'
var pattern = /.at/
var matches = text.match(pattern)
console.log(matches)
console.log(matches.index)
console.log(matches[0])
console.log(pattern.lastIndex)
var pos = text.search(/at/)
console.log(pos)
var result = text.replace('at', 'ond')
console.log(result)
result = text.replace(/at/g, 'ond')
console.log(result)
result = text.replace(/(.at)/g, 'word($1)')
console.log(result)
function htmlEscape(text) {
return text.replace(/[<>"&]/g, function (match, pos, originalText) {
switch (match) {
case '<':
return '<'
break
case '>':
return '>'
break
case '&':
return '&'
break
case '"':
return '"'
break
}
})
}
console.log(htmlEscape('<p class="greeting">Hello world!</p>'))
console.log(text.split(','))
console.log(text.split(',', 2))
console.log(text.split(/[^\,]+/))
| localeCompare()方法 | 返回值 |
|---|
| localeCompare() | 字符串参数在字母表中的前后关系 |
var stringCompare = 'yellow'
console.log(stringCompare.localeCompare('brick'))
console.log(stringCompare.localeCompare('yellow'))
console.log(stringCompare.localeCompare('zoo'))
function determineOrder(value) {
var result = stringCompare.localeCompare(value)
result < 0 &&
console.log(`The string 'yellow' comes before the string ${value}.`)
result > 0 &&
console.log(`The string 'yellow' comes after the string ${value}.`)
result === 0 &&
console.log(`The string 'yellow' is equal to the string ${value}.`)
}
determineOrder('brick')
determineOrder('yellow')
determineOrder('zoo')
| fromCharCode()方法 | 返回值 |
|---|
| fromCharCode() | 转换后的字符串 |
console.log(String.fromCharCode(104, 101, 108, 108, 111))
| html 方法 | 返回值 |
|---|
| anchor(name) | <a name="name">string</a> |
| big() | <big>string</big> |
| bold() | <b>string</b> |
| fixed() | <tt>string</tt> |
| fontcolor(color) | <font color="color">string</font> |
| fontsize(size) | <font size="size">string</font> |
| italics() | <i>string</i> |
| link(url) | <a herf="url">string</a> |
| small() | <small>string</small> |
| strike() | <strike>string</strike> |
| sub() | <sub>string</sub> |
| sup() | <sup>string</sup> |
总结 & 问点
- 基本包装类型包含哪些特殊的引用类型?读取时后台经历了什么步骤?
- 引用类型和基本包装类型的主要区别是什么?
- 对基本包装类型的实例调用 typeof 会返回什么?基本包装类型的对象都会被转换为什么?
- 请使用 Object 构造函数判断基本包装类型的实例
- 使用 new 调用基本包装类型的构造函数与直接调用同名转型函数的区别是什么?
- Boolean 的引用类型重写了哪些方法?其基本类型和引用类型的区别是什么?
- Number 的引用类型重写了哪些方法?提供了哪些格式化字符串方法?其基本类型和引用类型的区别是什么?
- String 的引用类型重写了哪些方法?提供了哪些字符串操作或解析方法?其基本类型和引用类型的区别是什么?
- 请说明 charAt()、charCodeAt()、concat()、slice()、substr()、substring()、indexOf()、lastIndexOf()、trim()、toLowerCase()、toUpperCase()、match()、search()、replace()、split()、localeCompare()、fromCharCode()等方法的含义,并举出相关例子