一、es5
js在产生的时候,年代比较早,当时的web需求比较少,所以刚开始的js功能比较少,语法没有特别严谨。随着时代的发展和web应用的普及,js需要更多的功能,以及更严谨的语法,所以,js会有版本的升级。第一版的js是ECMA一开始统一了标准以后的版本。我们现在的所使用的语法,大多是ECMAScript版本3的语法,简称es3。到目前为止,已经有了es7,8,9,甚至es10 的版本了。近几年,基本每年都会有新的版本更新。
每个版本的更新,都需要浏览器支持才能运行,但浏览器不会在js更新之后,立马更新。所以有的版本出来之后,需要在很长时间之后,浏览器才会兼容他。到目前为止,我们公认,es5是兼容性最好的版本。
es5比起我们所正在使用的es3,语法没有什么变化,增加了一个严格模式,还有一些数组的方法。
1.概念
(1)ECMAScript的第5个版本
(2)他是公认的兼容性最好的版本
(3)我们将来的项目,真正去运行的代码是es5的代码
2.严格模式
(1)概念
由于js的作用域和隐式声明变量等语法会造成很多预想不到的错误,所以ES5中新增了一个严格模式的语法,用于严格规范代码的书写。 严格模式就是对不合理的语法进行严格的约束
(2)使用语法
字符串 - 'use strict'
1.写在全局的顶部 ----- 可以约束整个页面
2.写在局部的顶部 ----- 只能约束局部代码
要放在代码的最前面,也就是在script标签中的第一行或者某个函数中的第一行,否则会失效;严格模式可以规范当前script标签或者当前函数中的代码,不能规范别的script标签中的代码和别的函数
(3)约束了哪些
1.不允许省略var定义变量
2.不允许形参同名
3.不允许普通函数中的this代表window
(4)this关键字
在js中有一个关键字叫this,this关键字是代表一个变量的,在不同的作用域中代表的值是不一样的
1.全局的this - window
2.非严格模式下普通函数中固定this - window
3.严格模式下的普通函数中的this - undefined
(5)严格模式优点
1.消除了一些不合理的语法,规避了未知的错误
2.代码更规范了,运行效率更高了
二、字符串
1.重新认识
(1)字符串可以取下标 - 有下标就可以进行遍历
(2)字符串有length长度,字符串中的length不允许改
(3)字符串是只读数据,不允许修改、删除、添加字符
2.比较
(1)字符串的比较规则是逐字符比较
字符串能比较大小,中文汉字也是字符串,中文汉字也能比较大小:
console.log('我'>'你') // true
console.log('你'>'我') // false
中文汉字的大小由unicode来决定。
阿斯克码总共128个,包含符号、大小写英文字母、数字。阿斯克码是由美国人创建的,所以对于英文的支持非常好。后来随着计算机的普及,各个国家在使用计算机的时候,没办法使用本国文字,这样用起来非常困难。所以众多国家的科学家一起制定了一个更大的对照表,包含各个国家的文字符号,所以称之为万国码,也叫作unicode。
其实unicode就是更大的阿斯克码。
(2)大小由阿斯克码决定
0~9 -------- 48~57
A~Z ------- 65~90
a~z -------- 97~122
(3)字符串方法
1.charAt - 通过指定下标获取到对应的字符
语法:字符串.charAt(下标) - 返回字符
2.charCodeAt - 通过指定下标获取到对应字符的阿斯克码
语法:字符串.charCodeAt(下标) - 返回字符对应的阿斯克码
3.String.fromCharCode - 通过指定的阿斯克码获取到他对应的字符
语法:String.fromCharCode(阿斯克码) - 返回字符
4.startsWith - 判断字符串是否以某个字符或小字符串开头的
语法:字符串.startsWith(字符/小字符串) - 返回布尔值
5.endsWith - 判断字符串是否以某个字符或小字符串结尾的
语法:字符串.endsWith(字符/小字符串) - 返回布尔值
6.includes - 判断字符串中是否包含某个字符或小字符串
语法:字符串.includes(字符/小字符串) - 返回布尔值
7.replace - 替换字符串中指定的一小段
语法:字符串.replace(被替换的那一小段, 新的内容) - 返回替换后的字符串
(1)参数1为空,就会将新内容添加到原字符串的最前面
8.indexOf - 查找字符或小字符串在字符串中第一次出现的下标
语法:字符串.indexOf(字符/小字符串) - 找到了就返回下标,找不到就返回-1
第二个参数表示从哪个下标开始查找
var str = 'abcdababefcd'
var idx = str.indexOf('a', 2) // 参数a为要查找的字符,参数2为开始查找的下标
console.log(idx);
9.lastIndexOf - 查找小字符串或字符在字符串中最后一个出现的下标
语法:字符串.lastIndexOf(字符/小字符串) - 找到就返回下标,找不到就返回-1
第二个参数表示将下标几当做是字符串结尾
var str = 'abcdababefcd'
var idx = str.lastIndexOf('ab', 5) /* 将下标5当做字符串末尾,查找字符ab在字符串中最后一次
出现的下标 */
console.log(idx);
10.trim - 去除字符串左右两边的空格字符
语法:字符串.trim()
11.trimLeft - 去除左边空格
语法:字符串.trimLeft()
12.trimRight - 去除右边空格
语法:字符串.trimRight()
13.toUpperCase - 所有字符都转大写
语法:字符串.toUpperCase()
14.toLowerCase - 转小写
语法:字符串.toLowerCase()
15.split - 将字符串通过指定的分隔符,组成数组
语法:字符串.split(分隔符) - 返回数组
(1)split的第二个参数是数字,表示我们在数组中要保留前几个元素
(2)如果不加参数,默认将整个字符串当做一个元素放在数组中
(3)空字符串做分隔符,会将每个字符都作为数组的元素
16.slice - 截取字符串
语法:字符串.slice(开始下标, 结束下标) - 返回一小段字符串
(1)包前不包后(不包含结束下标)
(2)省略第二个参数,表示截取到末尾
(3)省略第二个参数时,就可以第一个参数也省略 - 从头截取到末尾
(4)下标可以使用负数表示,-3表示倒数第3个字符,-1表示倒数第1个字符
(5)如果开始下标比结束下标大,会截取到空
17.substr - 截取字符串
语法:字符串.substr(开始下标, 截取的字符串长度) - 返回一小段
(1)省略第二个参数,默认截取到末尾
(2)开始截取的下标可以用负数表示
(3)长度超出最大下标,就相当于省略了参数2
18.substring - 截取字符串
语法:字符串.substring(开始下标, 结束下标) - 返回一小段
(1)包前不包后
(2)省略第二个参数就是截取到末尾
(3)开始下标和结束下标相等就截取到空字符串
(4)开始下标大于结束下标,就先交换两个参数位置,然后再截取
(5)开始下标或结束下标是负数,就先替换为0,然后开始截取
3.字符串常见
(1)字符串翻转 - 将`'I Love You'`转换成`'You Love I'`
// 将`'I Love You'`转换成`'You Love I'`
var str = 'I Love You'.split(' ').reverse().join(' ')
console.log(str);
(2)过滤字符串中的敏感词
var str = "无论多大麻烦,黑夜总会过去";
var arr = ['大麻', '夜总会']
for(var a = 0; a < arr.length; a++) {
var s = ''
for(var b = 0; b < arr[a].length; b++) {
s += '*'
}
str = str.replace(arr[a], s)
}
console.log(str);
(3)字符串去重
var str = 'aabbbccaaddd'
// 方法1.将重复的删除
// ①转成数组,去重再转成字符串
// ②利用字符串替换,将重复字符换成空字符,但是必须保留后面的字符,去除前面的重复
str.replace(str[1])
for(var a = str.length - 1; a >= 0; a--) {
// str[a]跟他前面所有字符比较
for(var b = 0; b < a; b++) {
if(str[a] === str[b]) {
str = str.replace(str[b], '')
}
}
}
console.log(str);
// 方法2.将不重复的放在新字符串中
var newStr = ''
for(var a = 0; a < str.length; a++) {
if( !newStr.includes(str[a]) ) {
newStr += str[a]
}
}
console.log(newStr);
// 方法3.利用对象去重
var obj = {}
for(var a = 0; a < str.length; a++) {
obj[ str[a] ] = str[a]
}
console.log(obj);
var newStr = ''
for(var key in obj) {
newStr += obj[key]
}
console.log(newStr);
(3)统计字符串中每个字符的个数
// 方法1.利用循环去统计
var str = 'aabbbccaaddde'
// 先将str去重 - 再统计
var newStr = 'abcde'
for(var a = 0; a < newStr.length; a++) {
str[a]
var k = 0 // 定义计数器,用于统计当前str[a]的次数
for(var b = 0; b < str.length; b++) {
if(newStr[a] === str[b]) {
k++
}
}
console.log(newStr[a] + '出现了' + k + '次');
}
// 方法2.利用indexOf找到就是下标,找不到就是-1,第二个参数代表从哪里开始找
var str = 'aabbbccaaddde'
// 先将str去重 - 再统计
var newStr = 'abcde'
var index = 0
var k = 0
while(true) {
index = str.indexOf(newStr[0], index)
if(index === -1) {
break
} else {
k++
index++
}
}
console.log(newStr[0] + '出现了' + k + '次');
// 方法2代码优化
var str = 'aabbbccaaddde'
// 先将str去重 - 再统计
var newStr = 'abcde'
for(var a = 0; a < newStr.length; a++) {
var index = 0
var k = 0
while(index != -1) {
index = str.indexOf(newStr[a], index)
if(index != -1) {
k++
index++
}
}
console.log(newStr[a] + '出现了' + k + '次');
}
// 方法3.对象去重并统计
var str = 'aabbbccaaddde'
var obj = {}
for(var a = 0; a < str.length; a++) {
if(obj[str[a]] === undefined) {
obj[str[a]] = 1
} else {
obj[str[a]]++
}
console.log(obj);
// 方法3代码优化
var str = 'aabbbccaaddde'
var obj = {}
for(var a = 0; a < str.length; a++) {
obj[str[a]] = obj[str[a]] ? obj[str[a]] + 1 : 1
}
console.log(obj);