js基础知识

119 阅读3分钟

一、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);
        })();

递归函数

用递归求100function 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。