字符串和值类型、引⽤类型⽬录
⼀、字符串
1、字符串的创建⽅式:
(1)直接创建
var 变量名 = "字符串"
例如:var str = "⼀⼆三四五"
(2)通过String对象创建
var str = new String('apple'); // 创建字符串对象
console.log(str);  // 输出结果:String {"apple"}
console.log(str.length);  // 获取字符串长度,输出结果:5
2、字符串默认的属性
length,⽤来记录字符串的长度
3、⽅法
字符串对象提供了⽤于检索元素的属性和⽅法,字符串对象的常⽤属性和⽅法
(1)根据字符返回位置
indexOf(value):返回参数value在字符串中⾸次出现的位置。若返回-1表⽰未到value lastIndexOf(value):返回参数value在字符串中最后出现的位置
indexOf(searchValue)获取searchValue在字符串中⾸次出
现的位置
lastIndexOf(searchValue)获取searchValue在字符串中最后出现的位置
var str = 'HelloWorld';
str.indexOf('o');    // 获取“o”在字符串中⾸次出现的位置,返回结果:4 str.lastIndexOf('o');  // 获取“o”在字符串中最后出现的位置,返回结果:6
//要求在⼀组字符串中,到所有指定元素出现的位置以及次数。
//字符串为 ' Hello World, Hello JavaScript '。
var str = 'Hello World, Hello JavaScript';
var index = str.indexOf('o');
var num = 0;
while (index != -1) {
console.log(index);    // 依次输出:4、7、17
index = str.indexOf('o', index + 1);
num++;
}
console.log('o出现的次数是:' + num);  // o出现的次数是:3
(2)根据位置返回字符
charAt(index):返回index位置上的字符
charCodeAt(index):返回index位置上的字符的ASCII码值
048
a97
A65
空格32
str[index]:H5中新增的⽅法.把字符串看作是数组
var o = {} //表明变量o是⼀个对象.对象保存数据的格式是
{属性名}
str = 'Apple'
o={
'A':1,
'P':2,
'l':1,
'e':1
}
charAt(index)获取index位置的字符,位置从0开始计算
charCodeAt(index)获取index位置的字符的ASCII码
str[index]获取指定位置处的字符(HTML5新增)
var str = 'HelloWorld';
var str = 'Apple';
console.log(str.charAt(3));          // 输出结果:1
console.log(str.charCodeAt(0));  // 输出结果:65(字符A的ASCII码为65)
console.log(str[0]);          // 输出结果:A
//使⽤charAt()⽅法通过程序来统计字符串中出现最多的字符和次数。
var str = 'Apple';
// 第1步,统计每个字符的出现次数
var o = {};
for (var i = 0; i < str.length; i++) {
var chars = str.charAt(i); // 利⽤chars保存字符串中的每⼀个字符
if (o[chars]) {                // 利⽤对象的属性来⽅便查元素
o[chars]++;
} else {  o[chars] = 1; }
}
console.log(o);  // 输出结果:{A: 1, p: 2, l: 1, e: 1}
// 第2步,统计出现最多的字符
var max = 0;  // 保存出现次数最⼤值
var ch = '';  // 保存出现次数最多的字符
for (var k in o) {
if (o[k] > max) {
max = o[k];
ch = k;
}
}
// 输出结果:“出现最多的字符是:p,共出现了2次”
console.log('出现最多的字符是:' + ch + ',共出现了' + max + '次');
(3)字符串操作⽅法
字符串对象提供了⼀些⽤于截取字符串、连接字符串、替换字符串的属性和⽅法。字符串对象的常⽤属性和⽅法
concat(str1,str2,...)连接多个字符串
slice(start,[end])截取从start位置到end位置之间的⼀个⼦字符串
substring(start, [end])截取从start位置到end位置之间的⼀个⼦字符串,基本和slice相同,但是不接收负值
substr(start,
[length])
截取从start位置开始到length长度的⼦字符串toLowerCase()获取字符串的⼩写形式
toUpperCase()获取字符串的⼤写形式
split(seq,[,limit])使⽤separator分隔符将字符串分隔成数组,limit⽤于限制数量
replace(str1,str2)⽤str2替换str1
var str = 'HelloWorld';
str.slice(1, 3);  // 截取从位置1开始包括到位置3的范围内的内容,结果:el str.substring(5);      // 截取从位置5开始到最后的内容,结果:World
str.substring(5, 7);  // 截取从位置5开始到位置7范围内的内容,结果:Wo str.substr(5);          // 截取从位置5开始到字符串结尾的内容,结果:World str.substring(5, 7);  // 截取从位置5开始到位置7范围内的内容,结果:LowerCase();  // 将字符串转换为⼩写,结果:helloworld
str.split('l');  // 使⽤“l”切割字符串,结果:["He", "", "oWor", "d"]
str.split('l', 3);  // 限制最多切割3次,结果:["He", "", "oWor"]
⼆、值类型和引⽤类型
1、值类型
简单的数据类型(String、Number、Boolean、undefined、null)⼜称值类型
2、引⽤类型
复杂数据类型(对象)⼜称为引⽤类型。引⽤类型的特点是,变量中保存的仅仅是⼀个引⽤的地址,当对变量进⾏赋值时,并不是将对象复制了⼀份,⽽是将两个变量指向了同⼀个对象的引⽤
var student = {
name: '⼩王',
gender: '男',
age: 12
};
var s2 = student; //将对象的地址赋给s2
student = {id:1234,address:'杭州'}
substring和slice//代码中的obj1和obj2指向了同⼀个对象
// 创建⼀个对象,并通过变量obj1保存对象的引⽤
var obj1 = { name: '⼩明', age: 18 };
// 此时并没有复制对象,⽽是obj2和obj1两个变量引⽤了同⼀个对象
var obj2 = obj1;
// ⽐较两个变量是否引⽤同⼀个对象
console.log(obj2 === obj1);  // 输出结果:true
/
/ 通过obj2修改对象的属性
obj2.name = '⼩红';
// 通过obj1访问对象的name属性
console.log(obj1.name);    // 输出结果:⼩红
obj1和obj2两个变量引⽤了同⼀个对象,此时,⽆论是使⽤obj1操作对象还是使⽤obj2操作对象,实际操作的都是同⼀个对象。
3、函数的参数是对象
当obj1和obj2两个变量指向了同⼀个对象后,如果给其中⼀个变量(如obj1)重新赋值为其他对象,或者重新赋值为其他值,则obj1将不再引⽤原来的对象,但obj2仍然在引⽤原来的对象。
var obj1 = { name: '⼩明', age: 18 };
var obj2 = obj1;
// obj1指向了⼀个新创建的对象
obj1 = { name: '⼩红', age: 17 };
// obj2仍然指向原来的对象
console.log(obj2.name);  // 输出结果:⼩明
注意:当⼀个对象只被⼀个变量引⽤的时候,如果这个变量⼜被重新赋值,则该对象就会变成没有任何变量引⽤的情况,这时候就会由JavaScript的垃圾回收机制⾃动释放。
若在函数体中修改了对象的属性值,则在函数外部访问该对象时,得到的是修改后的对象的值。
function change(obj) {
obj.name = '⼩红'; // 在函数内修改了对象的属性
}
var stu = { name: '⼩明', age: 18 };
change(stu);
console.log(stu.name); // 输出结果:⼩红