JavaScript基本包装类型

JavaScript对象分为:引用类型,基本包装类型以及内置对象

本文记录学习三个基本的包装类型值

  • Boolean
  • Number
  • String

首先,本文是看了红宝书总结而来.

1
2
3
4
5
var s1 = 'somethings text';
var s2 = s1.tosubstring(2);

s1.r = 1
console.log(s1.r) //undefined

字符串不是对象,理应没有tosubstring方法,但是后台解释器会自动完成如下操作:

1
2
3
var s1 = new String('somethings text');
var s2 = s1.substring(2)
s1 = null

实例化一个字符串对象,得到一个实例,实例拥有方法,调用实例的方法.最后直接销毁这个实例.

此类操作适合Boolean和Number

也就是说,它的生存周期是很短的,执行完一行则直接销毁,以后不能在用了,这就是基本包装类型和引用类型的实例的区别.

并且,建议不要直接使用显式的实例化方法,虽然可以,但是这不是最佳实践,结果会影响开发者和阅读者对代码的理解.让解释器去做这样的事情吧.

另外,对于布尔表达式的判断来说,任何对象都会被转化为true,所以常常有一些情景是值为false的Boolean对象的实例,用在了布尔判断中.

关于Number对象:

1
2
var num = new Number(10)
# 即可创建一个值为10的数字对象

Number类重写了toString等方法,可以指定返回几进制的字符串表示的值,例如:

1
2
var num = 10;
num.toString(2) # 返回的是'1010'二进制表示的字符串

另外,Number对象还提供了一些格式化方法:

1
2
3
4
var num = 10;
num.toFixed(2); // "10.00"

// 还有num.toExponential(int x) 格式化科学计数法

通过new实例化的对象,属于object 而直接赋值,让解释器处理的变量typeof为number/string/Boolean

String类型

string类型提供了很多方法,不只是JavaScript,基本上大多数的脚本语言,甚至编译型语言对字符串都会提供很多方法去操作字符串.
毕竟,对于字符串的处理的需求太频繁.

在JavaScript中,获取字符串某个下标位置的字符的方法为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
string.charAt(int i)	// 类似于python: string.index(int i)

string.charCodeAt(int i) // 返回此字符的字符编码

string.concat(string s) //这里作用是拼接字符串,不会修改原字符串的值,而是返回一个新的字符串
//让我想起tcl对list的处理,concat连接了多个list组合成一个list

# 可以说是创建了新的字符串,另外ECMAScript还有其他函数会创建新的字符串


string.substr()

string.substring()

# 以下三个函数都能截取字符串,区别在于对接收的参数的处理不同.

string.slice(int x, int y) //截断字符串,通过下标控制范围
# slice方法,参数可以是负数,并且可以视为将参数转化为字符串的范围内的整数和0,如果负数或者整数超过
# 字符串长度,则转化为长度值.
var str = '12345'
str.slice(-20,10) # 视为slice(0,5)
str.slice(-20,-30) # 第一个参数大于第二个参数,返回空字符串
str.slice(-2,-1) # 视为slice(length-2,length-1) 即 slice(3, 4)

# 默认范围都是从0到末尾字符串的

str.slice() //返回本身

str.substr(int start, int number) //第二个参数表示返回的字符个数,为0或者为负数都直接返回空字符串

str.substring(int start, int end) //以二者大值为end,小的值为start,负数转化为0,大小相等则返回空字符串

字符串查找

在python中,常用的判断语句:

1
2
if 'a' in 'bac':
pass

可以检查字符串是否在某个字符串中
在JavaScript中,检查子字符串的内置方法有两个:

1
2
3
string.indexOf(string s, int start)	// 从start开始,从前往后查,查到返回位置下标,否则返回-1

string.lastIndexOf(string s, int start) // 从start开始,不过是从后往前查,查法一致

另外,其他通用函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
string.trim() 删除首尾的空格

// 大小写转换
string.toLowerCase()

string.toUpperCase()

// 当然,还有两个搜索和匹配的函数
string.search(regexp) // 返回第一个匹配的索引(首字母索引),或者-1

string,match(regexp) // 返回匹配数组

// 替换函数
string.replace(string s1, string s2)

// 替换函数的拓展,第二个参数是一个函数
// 用法在于此函数接受三个参数,第一个为模式的匹配项,第一个捕获组的匹配项,第2或者第n个
// 捕获组的匹配项
// 倒数第二个参数为匹配项在字符串中的位置,最后一个参数为原始的字符串本身
// 这个函数,返回一个字符串

String.prototype.capitalize(){
return this.replace(/(^|\s)([a-z])/g, function(match, pos1, pos2){
return p1 + p2.toUpperCase();
});
}

console.log("i am a loser".capitalize())

// 输出 I Am A Loser

最后几个符串的处理的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string.split()

// demo

var color = "red,black,pink"
var color_arr = color.split(',')

// 很简单,将指定逗号作为分隔符,将字符串进行分割,返回一个处理好的数组,必须添加分隔符,无默认值

var stringvalue = "yellow";
alert(stringvalue.localeCompare('zata')) // yellow less than zata , return 负数
alert(stringvalue.localeCompare('a')) // yellow large than a, return 正数
// 相等返回0
// 只有一个问题,这个方法不同的浏览器的实现是不一样的,也许是-1,所以需要一点设计

alert(String.fromCharCode(104,101,108,108,111)) // 通过ascii码的值,返回字符串 hello