字符串
存储: 计算机只能够存储二进制 所以存储字符串时 也需要转为二进制 所以就需要有一个对照表 方便将字符和二进制进行转换 这样的内容叫做编码方式 常见的有 ascii unicode 等
定义字符串的新的方式
var str = new String("a");
console.log(typeof str); // object
// 转换为字符串的方式就是str.toString();
包装类型:在面向对象的思想中,一切都得是对象。而JS中有一些基本类型,此时就需要“包装”一下,将这些基本类型包装成对象类型。
字符串的length属性
字符串也有length属性
var a = "abcdefg";
console.log(a[2]); // c
字符串也可以通过下标获取对应的字符
常见的方法
charAt 参数是数字 返回值是该数字所指向的下标字符
var str = "abcdefg";
// 获取指定位置的字符
var code = str.charAt(5);
console.log(code); // f
charCodeAt 参数是数字 返回值是该数字所指向的下标字符的编码
var str = "abcdefg";
var code = str.charCodeAt(5);
console.log(code); // 102
split 参数是分隔符 返回值是以该参数作为切割之后的数组
var str = "a1b1c1d1e1f"; // 想要以1作为分隔符 将字符串切割成数组 => ["a", "b", "c", "d", "e", "f"];
var arr = str.split("1");
console.log(arr); // ["a", "b", "c", "d", "e", "f"];
// 数组转为字符串
// ["a", "b", "c", "d", "e", "f"].join("1"); => a1b1c1d1e1f
substring 该方法用于截取字符串中的一段
var str = "abcdefg";
var str1 = str.substring(1, 2);
var str2 = str.substring(1);
var str3 = str.substring();
var str4 = str.substring(-5, -2);
var str5 = str.substring(5, 1);
console.log(str1); // b
console.log(str2); // bcdefg
console.log(str3); // abcdefg
console.log(str4); // 空字符串 截取不到
console.log(str5); // bcde
// 特点:两个参数时,总是从小的截取到大的
// 特点:当数值为负数时 不会从后往前数
substr 该方法也用于截取字符串中的一段 第一个参数依旧表示截取的开始位置 第二个参数表示要截取的字符串的长度
var str = "abcdefghijkl";
var str1 = str.substr(3, 5);
console.log(str1);
slice 该方法用于截取字符串的一段 第一个参数表示截取的开始位置(包含) 第二个参数表示截取的结束位置(不包含)
var str = "abcdefghijkl";
var str1 = str.slice(1, 5);
var str2 = str.slice(5, 1);
var str3 = str.slice(-5);
console.log(str1); // bcde
console.log(str2); // 空字符串 因为截取不到
console.log(str3); // hijkl 从后往前截取
indexOf 该方法用于获取数组中第一个从某个位置开始出现的字符串的第一个字符的下标 如果找不到 就返回-1 第一个参数是被查询的字符串 第二个参数是查询的开始位置
var str = "abcdefgdfdfdf";
var index = str.indexOf("df");
console.log(index); //
toLowerCase 该方法用于将所有的字符串中的英文小写
var str = "ABCDEFG,你好,abcde";
var str1 = str.toLowerCase();
console.log(str1); // abcdefg,你好,abcde
字符串的比较 一位一位的比较 比较对应位数的字符的ascii码 如果相同 比较下一位 如果不同 出结果
var str = "aA"; // ascii A 65
var str1 = "aa"; // ascii a 97
console.log(str > str1); // false
toUpperCase 该方法用于将所有的字符串中的英文大写
var str = "abc";
var str1 = str.toUpperCase();
console.log(str1); // ABC
// replace 该方法用于将字符串中的指定字符(串)替换位指定字符(串)
// var str = "今天天气不错,没下雨";
// var str1 = str.replace("没", "");
// console.log(str1);
郑重声明: 所有的字符串方法都不会改变原字符串
为什么字符串居然能够调用方法,它不是基本数据类型吗?
值类型就是值类型 不应该拥有任何方法的
其实…
var a = "str";
var b = a.replace("s", "a");
字符串这个数据类型,在JS中运行时
JS引擎中解析的时候会先把 a 这个"str"值替换为 var s = new String(“str”);
当a.replace方法调用的时候 等价于
var s = new String("str");
var b = s.repalce("s", "a");
s = null;
因为真正操作的时候是新生成的对象内部在操作 a所保存的"str"只是作为参数传递了进去 在里面复制了一份 操作的是这个"副本" 最终会销毁这个生成的对象
函数的传参规则
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}