存储
- 计算机只能够存储二进制
- 存储字符串转为二进制
- 需要有
对照表
方便将字符
和二进制
进行转换 - 这样的
对照表
叫做 编码方式 常见的有ascii
、unicode
等
定义字符串的新的方式
var str = new String("a");
console.log(typeof str); // object
// 转换为字符串的方式就是str.toString();
包装类型:在面向对象的思想中,一切都得是对象。而JS中有一些基本类型,此时就需要 包装
一下,将这些基本类型 包装
成对象类型。
- 在JS中,基本数据类型(除了undefined、null之外),都有包装类型
- 字符串的包装类型 String()
- 布尔型的爆猪肝类型 Boolean()
- 数字的包装类型 Number()
属性
- length属性:length属性表示字符串的长度
// 字符串也可以通过下标获取对应的字符
var a = "abcdefg";
console.log(a[2]); // c
console.log(a.length); // 7
方法
- charAt 参数是数字,返回值是该数字所指向的下标字符
- charCodeAt 参数是数字,返回值是该数字所指向的下标字符的编码
- split 参数是分隔符,返回值是以该参数作为切割之后的数组
- slice 该方法用于截取字符串的一段,第一个参数表示截取的开始位置(包含) 第二个参数表示截取的结束位置(不包含),左闭右开
- concat 用法与数组方法中的concat一致,都是拼接任意个内容,但是不会拆分数组,只会将内容向字符串进行转换
- indexOf 将会返回参数字符串的第一个字符在原字符串中的位置,如果没有匹配到完全一样的字符串,返回-1
- match 用于匹配字符串,但是它更与正则表达式配合的多
- search 查询字符串
- toUpperCase 该方法用于将所有的字符串中的英文大写
- toLowerCase 该方法用于将所有的字符串中的英文小写
- replace 替换,将原字符串中的某些个字符替换成参数指定的字符
- substring 该方法用于截取字符串中的一段,与slice很类似,也是截取字符串,但是slice的参数只能是参数一小于参数二,substring能够参数一小于参数二
- substr 该方法也用于截取字符串中的一段 第一个参数依旧表示截取的开始位置 第二个参数表示要截取的字符串的长度
注意:字符串的所有方法都不会改变原字符串
// 1、charAt 参数是数字 返回值是该数字所指向的下标字符
var str1 = "abc";
var char1 = str1.charAt(1);
console.log(char1); // b
console.log(str1[1]); // b
// 2、charCodeAt 参数是数字 返回值是该数字所指向的下标字符的编码
var code1 = str1.charCodeAt(2);
console.log(code1); // c的字符编码 99
var str2 = "你好";
var code2 = str2.charCodeAt(0);
console.log(code2); // “你”的字符编码 20320
// 3、split 参数是分隔符 返回值是以该参数作为切割之后的数组
var str3 = "1-2-3-4";
var arr1 = str3.split("-");
console.log(str3); // "1-2-3-4"
console.log(arr1); // ["1", "2", "3", "4"]
// 4、slice 该方法用于截取字符串的一段 第一个参数表示截取的开始位置(包含) 第二个参数表示截取的结束位置(不包含)
// 用法和数组一样
var str4 = "abcdefg";
var str4_1 = str4.slice(0);
var str4_2 = str4.slice(1,4);
var str4_3 = str4.slice(1,-2);
var str4_4 = str4.slice(-5,-1);
console.log(str4_1); // abcdefg
console.log(str4_2); // bcd
console.log(str4_3); // bcde
console.log(str4_4); // cdef
// 5、concat
// 用法与数组一致,都是拼接任意个内容,但是不会拆分数组,只会将内容向字符串进行转换
var str5_1 = "abc";
var str5_2 = "def";
var str5_3 = str5_1.concat(str5_2,[1,2,3,[4,5]],{});
console.log(str5_3); // abcdef1,2,3,4,5[object Object]
// 6、indexOf() 将会返回参数字符串的第一个字符在源原字符串中的位置
// 如果没有匹配到完全一样的字符串,返回-1
var str6 = "abcdefgcdefdddd";
var str6_1 = str6.indexOf("cde"); // 默认从下标0开始查询
console.log(str6_1); // 2
var str6_2 = str6.indexOf("cde",5); // 第二个参数表示从哪个下标开始查询
console.log(str6_2); // 7
var str6_3 = str6.indexOf("cdf");
console.log(str6_3); //-1
// 7、match() 用于匹配字符串,但是它更与正则表达式配合的多
var str7 = "abcdefg";
console.log(str7.match("ef")); // ["ef", index: 4, input: "abcdefg", groups: undefined]
// 8、search() 查询字符串
var str8 = "abcdefcdefddd";
console.log(str8.search("cde")); // 2 默认从下标0开始查询
// 9、toUpperCase 该方法用于将所有的字符串中的英文大写
var str = "abc";
var str1 = str.toUpperCase();
console.log(str1); // ABC
// 10、toLowerCase 该方法用于将所有的字符串中的英文小写
var str = "ABCDEFG,你好,abcde";
var str1 = str.toLowerCase();
console.log(str1); // abcdefg,你好,abcde
// 不区分大小写的验证码原理
var code = "abcd";
var check = prompt("请输入验证码","");
console.log(code);
console.log(code === check.toLowerCase());
// 11、replace
var str11 = "这个敏感字眼——卧槽,卧槽——是敏感字眼";
console.log(str11);
while(str11.indexOf("卧槽") != -1){
str11 = str11.replace("卧槽","**");
}
console.log(str11);
// 以下方法是使用了正则的知识
var str11_1 = "这个敏感字眼——卧槽,卧槽——是敏感字眼";
var str11_2 = str11_1.replace(/垃圾/g,"xx");
console.log(str11_2);
// 12、substring 该方法用于截取字符串中的一段
// 与slice很类似,也是截取字符串,但是slice的参数只能是参数一小于参数二,substring能够参数一小于参数二
var str12_1 = "abcdefg";
var str12_2 = str12_1.slice(1,5);
var str12_3 = str12_1.substring(1,5);
var str12_4 = str12_1.substring(5,1);
console.log(str12_1);
console.log(str12_2); // bcde
console.log(str12_3); // bcde
console.log(str12_4); // bcde
// 13、substr 该方法也用于截取字符串中的一段 第一个参数依旧表示截取的开始位置 第二个参数表示要截取的字符串的长度
var str13 = "abcdefghijkl";
var str13_1 = str13.substr(3, 5);
console.log(str13_1); // defgh
为什么字符串居然能够调用方法,它不是基本数据类型吗?
字符串这个数据类型,在JS中运行时,JS引擎中解析的时候会先把 a 这个"str"值替换为 var s = new String(“str”);此时就成了一个字符串对象。
var str1 = new String("abc"); // 这是一个字符串对象
var str2 = "abc"; // 这是一个字符串
console.log(typeof str1); //object
console.log(typeof str2); //string
函数的传参规则
JS中的函数可以执行时传递参数。那么如果在函数内部修改传递进去的参数,会不会影响到函数外部的值呢?
函数在传递参数时,到底是如何传参的呢?
JS中的数据类型分两种: 基本数据类型,引用数据类型
基本数据类型的数据在传递时,复制传递,也就是复制了一份并传递进去,所以在函数内部,如何操作都只是在操作副本。与外部的数据无关。
引用数据类型的数据在传递时,传递引用,也就是把地址复制了一份并传递进去,所以函数内部是可以得到函数外部的数据保存的地址的,如果在函数内部打点或者方括号修改地址内容,则会影响到函数外部,如果在函数内部使用 =
修改变量保存的内容,则不会影响函数外部。
// 在函数内部修改值类型参数
var a = 123;
function demo(b) {
b = 12;
}
demo(a);
console.log(a); // 123
// 在函数内部使用等号修改引用类型参数
var obj = {};
function demo(b) {
b = 123;
}
demo(obj);
console.log(obj); // {}
// 在函数内部使用方括号或者点语法修改引用类型参数
var obj = {};
function demo(b) {
b.a = 10;
b["b"] = 11;
}
demo(obj);
console.log(obj); // {a: 10, b: 11}
// 在函数内部先使用方括号或者点语法修改 再使用等号
var obj = {};
function demo(b) {
b.a = 10;
b["b"] = 11;
b = {};
b.c = 12;
}
demo(obj);
console.log(obj); // {a: 10, b: 11}