作用域
ES5两个作用域:全局和局部,只有函数能产生作用域
ES6三个作用域:全局、局部、块级,一定要配合ES6语法(let声明变量)
<script>
/*
let 与 var 的区别
let(ES6) 与 var(ES5) 的区别
在全局声明了一个变量(在同一作用域链中)
1. 如果再次赋值都会覆盖
2. 如果再次声明并赋值时;
var声明的变量会被覆盖,原来的会消失
let则是不同的代码块中不同的值
如果是相同的代码块则报错
*/
/* let a = 10;
let a = 20;
// Uncaught SyntaxError: Identifier 'a' has already been declared
console.log(a); */
/* // let a = 15;
var a = 15;
if (a > 10) {
a = 20;
}
console.log(a); // a =20 */
/* var a = 15;
if (a > 10) {
var a = 20;
}
console.log(a); // a =20 */
/* let a = 15;
if (a > 10) {
let a = 20;
console.log(a); // a = 20
}
console.log(a); // a = 15 */
/* // let name = '张三';
var name = '张三';
function foo() {
var name = '法外狂徒';
console.log(name);
}
foo(); // 法外狂徒
console.log(name); */ // 张三
</script>
作用域链
作用域链:任何局部空间都可以访问全局作用域,JS中函数内部可以定义函数,作用域多了之后就会产生作用域链条
变量在作用域链上的访问规则:
- 就近原则:访问变量时,会优先访问的是在自己作用域链上声明的变量,如果自己作用域上没有声明这个变量,那么就往上一级去找有没有声明这个变量,如果有就访问
- 如果没有就继续往上找有没有声明,直到找到0级作用域链上,如果有,就访问,如果没有就报错
变量提升(预解析)
变量提升:针对变量和函数,声明部分会自动提升到代码的最前面;
变量:var变量,分为声明部分var abc和定义部分 abc = '123';
函数:声明就是定义
变量传值方式
function Person (name, age, salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
function fl (person) {
person.name = 'ls';
person = new Person ('aa', 18, 10); // 对p进行了重新赋值
}
var p = new Person('zs', 18, 1000);
console.log(p.name); // zs
fl(p); // aa, 18, 10
console.log(p.name); // aa
JSON语法规则
JSON是存储和交换文本信息的语法
在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等
JSON作为一个轻量级的数据格式比XML效率要高,XML需要很多的标签
1、JSON可以有两种格式
一种是对象格式的
let jsonStr = `{"name" : "JSON" , "address" : "北京市西城区" , "age" : 25}` // JSON的对象格式的字符串
另一种是数组对象
let jsonStr = `[{"name" : "JSON" , "address" : "北京市西城区" , "age" : 25} ]` // 数组对象格式
JSON.stringify(obj) 将JSON对象转换为字符串
let jsonStr = JSON.stringify(jsonObj);
JSON.parse(string) 将字符串转为JSON对象格式
let jsonObj =JSON.parse(jsonStr) ;
数组去重
let arr = [20, 66, 88, 25, 66, 90, 88, 50];
// 先排序
arr.sort(function (a , b){
return a - b; // 数组升序排列
});
// 定义一个新数组
let newArr = [];
// 遍历数组
for (let i in arr){
if (arr[i] != arr[i+1]){
newArr.push(arr[i]);
}
}