javascript预解析机制:
-预解析
-再逐行解析
全局作用域、局部作用域都是通过以下两个步骤进行:
1.先读取var的变量(没有使用var的变量不会被解析),赋值为undefind,如果两个变量重名,无影响
函数名与变量名重名,直接去掉变量名,不进行解析,如果函数中存在参数,那么参数也一样使用var 进行解析
2.再读取function后面的函数---fn,如果有多个函数重名,那么取最后一个函数进行声明.
解析顺序:
1.全局变量
2.函数
3.函数局部变量
预解析完成后再逐行解析代码
通过逐行解读代码进行赋值,改变变量的属性值。遇到函数,直接跳过,因为与解析已经声明过。
解析代码前,预解析做了哪些事情?
1.把变量的声明提前了---提前到当前所在的作用域上面,只会提升声明,不会提升赋值
2.把函数的声明提前了---提前到当前所在的作用域上面,只会提升声明,不会提升调用
3.先提升var,再提升function
字符串内置函数使用
字符串常用的方法和属性:
- .length ---> 返回字符串的长度
- .charAt(索引) ---> 返回值是指定索引位置的字符串,索引值超出返回空字符串
- .concat(字符串1, 字符串2, ..., 字符串n) ---> 返回值是拼接之后的新字符串
- .indexOf(要找的字符串, 从某个位置开始找的索引) ---> 返回值是要找的字符串第一次出现的值,没找到返回-1
- .lastIndexOf(要找的字符串, 从某个位置开始找的索引) ---> 倒序查找,效果同上
- .replace("原来的字符串", "新的字符串") ---> 替换字符串
- .slice(开始的索引a, 结束的索引b) ---> 从索引为a的地方开始截取,到b的位置结束,不包括b不包后),返回值是提取出来的字符串
- .substr(开始的位置, 截取的个数) ---> 返回值是提取出来的字符串
- .substring(开始的索引a, 结束的索引b) ---> 从索引为a的地方开始截取,到b的位置结束,不(包前不包后),返回值是提取出来的字符串
- .split("要干掉的字符串", [分隔后留下的个数])
- .trim() ---> 去掉字符串前后端的空格
- .toLowerCase() ---> 转小写
- .toUpperCase() ---> 转大写
console.log(str3.indexOf("a"));// 不写第二个参数,默认从索引为0的位置开始找
console.log(str3.indexOf("a", 99));
console.log(str3.lastIndexOf("a"));// 不写第二个参数,默认从索引为length-1的位置开始找
console.log(str3.replace("a", "♪(^∇^*)"));
console.log(str3.replace(/a/, "\(^o^)/~"));// 正则表达式的语法
console.log(str3.replace(/a/g, "☆"));// 正则表达式的语法
* 注意 字符串替换并没有将字符串真正的改变,只是得到了我们想要改变的值
// 去除中间的空格
console.log(str3.replace(/ /g, ""));
Array数值内置函数
Array.isArray(对象名) 判断对象是不是数组
对象 instanceof 类型
- .concat(数组1, 数组2, ..., 数组n)组合成新数组
- .push(值)把值追加到数组的末尾,返回值是追加数据之后数组的长度
- .unshift(值)把值追加在数组的前面,返回值是追加数据之后数组的长度
- .pop()删除数组的最后一个,返回值是删除的这个值
- .shift()删除数组的第一个元素,返回值是删除的这个值
- .every(函数)返回值是布尔类型,函数是用来当作参数使用的,函数中要有三个形参,一假即假
- .some(函数)返回值是布尔类型,函数是用来当作参数使用的,函数中要有三个形参,一真即真
- .filter(函数)返回值是数组中每一个符合条件的元素,组成一个新数组,函数有三个形参,看成是过滤的方法
- forEach(函数)遍历数组,想当于一个for循环中有三个形参
- .indexOf(元素值)返回值是元素对应的索引,找不到返回-1
- .join("字符")返回值是通过这个字符连接的一个字符串
- .reverse()翻转数组
- .sort(函数)排序,不稳定,根据MDN的固定方法
- .splice(开始的位置, 要删除的个数, 替换元素的值)一般用于删除数组中的某个元素,或替换元素或者插入元素
// 判断类型
var arr = [];
console.log(Array.isArray(arr));
console.log(arr instanceof Array);
// 合并
var arr1 = [1, 2, 3, 4];
var arr2 = [10, 20, 30, 40];
console.log(arr2.concat(arr1));
// 追加
console.log(arr1.push(100));
console.log(arr1.unshift(200));
console.log(arr1);
// 删除
console.log(arr1.pop());
console.log(arr1.shift());
console.log(arr1);
// .every(函数)一假即假
var arr3 = [5, 10, 15, 20, 25, 30];
// ① 要遍历的元素
// ② 元素所对应的索引
// ③ 要遍历的数组名
var flag = arr3.every(function(item, index, arr3) {
console.log(item, index, arr3);
return item > 100;
})
console.log(flag);
// .some(函数)一真即真
var flag2 = arr3.some(function(item, index, arr3) {
console.log(item, index, arr3);
return item > 20;
})
console.log(flag2);
// 过滤
var arr4 = [1000, 2000, 3000, 4000];
var newArr = arr4.filter(function(item, index, arr4) {
return item > 2000;
})
console.log(newArr);
// .forEach
var arr5 = [-1, 0, 7, 99, 85, -18];
var sum = 0;
arr5.forEach(function(item, index, arr5) {
sum += item;
console.log(item);
})
console.log(sum);
var arr6 = [1, 4, 6, 2, 1, 6, 3, 8];
console.log(arr6.indexOf(6));
console.log(arr6.join("|"));
console.log(arr6.reverse());
var arr7 = [11, 54, 2, 76, 42, 7];
console.log(arr7.sort());
var arr8 = ["虞姬", "金蝉", "蔡文姬", "伽罗", "明世隐"];
// 索引值为2的地方插入孙悟空
console.log(arr8.splice(2, 0, "孙悟空"));// 返回值是要删除的元素
console.log(arr8);
// 删除索引值为4
console.log(arr8.splice(4, 1));
console.log(arr8);
// 索引值为4的替换为"澜"
console.log(arr8.splice(4, 1, "澜", "赵云"));
console.log(arr8);