一、js局部作用域
1.局部作用域的查找规则
var a = 10;
function fn1() {
function fn2() {
function fn3() {
console.log(a);
}
fn3();
}
fn2();
}
fn1();
2.局部作用域的赋值规则
var a = 0;
console.log(a);
function fn() {
a = 10;
console.log(a);
}
fn(); // 调用之后会赋值
console.log(a);
总结:局部作用域的赋值规则 ,会先赋值给本作用域声明的变量,如果本作用域没有声明改变量,那么这个赋值就会赋值给外层作用域 ,外层作用域如果也没有声明改变量 ,那么会逐层向外赋值。如果外层作用域都没有声明改变量 ,那么该变量就会赋值给全局。
自执行函数;定义之后立刻执行,主要是为了区分作用域,这样相互之间就不会受到影响
(function () {
var a = 10;
function fn() {
console.log("fn1...")
}
fn();
console.log(a);
})();
递归函数
用递归求100!
function fn(num){
if(num==1){
return 1;
}
return num*fn(num-1);
}
var res=fn(100);
console.log(res);
二、对象
1.字面量来定义:大括号包裹, "{键名1:'键值1',键名2:'键值2',键名3:'键值3'}";键名一般不加引号
var obj = {
name:'张三',
age:20,
height:"178cm"
}
console.log(obj);
2. 通过内置构造函数来创建 对象
var obj = new Object(); // Object 就是 js里的内置构造函数
// console.log(obj);
// 给obj添加内容 ,通过 对象.键名
obj.name = "张三";
obj.age = 20;
obj.height = "178cm";
console.log(obj);
对象的操作:
var user = {
name:"张三",
age:20,
height:"178cm"
}
查询:var res=user.name
var res=user['age']
修改:user.name="李四"
增加:user.fav="打篮球"
删除:delete user.height
对象的长度user.length;
对象的循环:for(var key in obj){
console.log(obj[k]);
}
注意:对象的下标不可以重复,键值可以重复,键值可以使任何类型
二、数组
数组基本操作
1、数组的创建 var arr = new Array("1","2","3");
2、pop:删除数组的最后一项:arr.pop();
3、push: 添加一项在数组的最后:arr.push();
4、shift 删除第1项元素(也是下标是0的元素):arr.shift();
5、unshift 往第一项添加内容:arr.unshift();
6、splice: 在指定位置添加或者删除数组的元素:arr.splice() 第一个参数是要开始删除的索引值 第二个参数是删除的个数 第三个是添加的值
7、reverse 反转数组:arr.reverse()
8、join: 把数组通过特殊符号连接成字符串arr.join()
9、indexOf : 会查找数组里元素的索引: 1.不会改变原本的数组 2.返还值就是查找元素的索引,如果没有查找到就会返还-1 arr.indexOf('1');
10、concat :把两个或者多个数组 连接成一个数组的:arr.concat(arr1,arr2)
11、sort : 会把数组做正序 或者是倒序排列 ;数字排列
语法 : arr.sort(function(a,b){return a-b })
// 1.不会改变原本数组 2. 返还值是排序号的数组 3. 如果是返还是a-b那么是正序
// 4.如果函数内返还是b-a 那么 新的数组是倒序 ;
三、数组排序 1、冒泡排序
var arr=[4,5,1,2];
for(j=0;j<arr.length-1;j++){
for(i=0;i<arr.length-1-j;i++){
if(arr[i]>arr[i+1]){
var a=arr[i];
arr[i]=arr[i+1];
arr[i+1]=a;
}
}
}
console.log(arr);
2、选择排序
var arr = [4, 5, 1, 2];
var minIndex, temp;
for (i = 0; i < arr.length - 1; i++) {
minIndex = i;
for (j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
console.log(arr);
地址传递和值传递:
简单数据类型就是传值和传址 :复杂数据类型赋值就是传址
js :简单数据类型是传值 ,复杂数据类型是传址(array ,object,function);简单数据类型存在内存的栈里(有序 );复杂数据类型存在堆里(无须)复杂数据类型可以值和地址要相同比较才是true。