一、js 的数据类型

Number Boolean String Null Undefined 以上五种叫做基本数据类型

Object 对象

对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性
对象的分类
	1、内建对象
		--有es标准中的对象,在ES中的任何实现都能使用
			比如Math String Number Boolean Function Object
	2、宿主对象
		-- 由js环境提供的对象,目前主要是浏览器提供的对象
		比如BOM DOM
	3、自定义对象
	由开发人员自建的对象
1、对象操作
	//1、创建对象
		var obj = new object();
	//2、添加对象的属性
		obj.name = "sin";
		obj.sex = "女";
		obj.age = 18;
	//3、读取对象的属性  如果对象中的属性时则为  undefined
		console.log(obj.name);	//值为"sin"
		console.log(obj.hello);	//值为"undefined"
	//4、修改对象的属性  对象.属性 = 修改的值
			obj.name = "cos";
    //5、删除对象的属性 delete 对象.属性
    	delete obj.name;
<script type="text/javascript">


        // 创建对象
        //使用new关键字的函数是构造函数 constructor
        //构造函数是专门用来创建对象的
        //typeof检查一个对象时,会返回一个object

        var obj = new Object();
        console.log(obj);
        //向对象中添加属性  直 接对象.属性 = 值
        obj.name="sin";
        obj.sex="女";
        obj.age =18;
        console.log(obj);
        //读取对象中的属性 对象.属性
        console.log(obj.age);
    </script>
2、对象中的属性名
	1、属性名不强制遵守标志符的规则
	 eg:var obj = new Object();
	 obj.var ="sin";
	
	2、如果使用特殊的属性的时候需要采用 对象["属性名"]
		//obj.123 = "sin";这是一个错误的
		obj["123"] = "sin";
        console.log(obj["123"]);//这是正确的选项
      特别说明  使用[]更加灵活
      在[]可以传递一个变量,
      var n = "123";
      var n ="你好";
      console.log(obj[n]);
3、对象中的属性值
   1、属性值可以是任意的数据类型,当然也可以是数据对象
   2、我们如何判断某个对象中的属性是否存在
   		"属性" in 对象
   		如果有则返回true,否则则返回false
 <script type="text/javascript">


        // 创建对象
        //使用new关键字的函数是构造函数 constructor
        //构造函数是专门用来创建对象的
        //typeof检查一个对象时,会返回一个object

        var obj = new Object();
        var obj2 = new Object();
        obj2.name = "sin";
        obj2.sex = "男";
        obj2.age =11;
        obj.test = obj2;
        console.log(obj);
        console.log("sex" in obj2);
        console.log("name" in obj);
    </script>
4、可以根据对象的字面量进行
语法: {属性名:属性值,属性名:属性值}
<script type="text/javascript">
     
       var a = {
           name : 123,
           sex:"男",
           age:22
           test:{name:"sin"}
       }
		console.log(a.test);	//也是一个Object
   </script>

二、数据基本类型和引用类型

//基本数据结构类型开辟的内存叫做栈内存
//引用数据结构类型开辟的内存叫做堆内存

  <script type="text/javascript">
       var a  = 123;
       var b = a;
       a++;
       console.log(a);  //a 的值是124
       console.log(b);  //b的值是123
       console.log(a == b);
       //因为基本数据类型开辟的是栈内存,然后只是将值进行了复制,他们之间是相互独立的,他们比的都是值

       var c = new Object();
       c.name = "sin";
       var d = c;
       d.name ="cos";
       console.log(c);
       console.log(d);
       console.log(c == d);
       //引用数据类型开辟的是堆内存,栈内存保存的是堆内存的地址,所以c==d比的都是堆内存的地址

   </script>

1609850976952

3、函数
3、1函数创建的三种方式
1、函数也是一个对象,可以进行封装一些功能
	//创建一个函数的对象,可以将封装的代码按照字符串的形式传递给构造函数
	var fun = new Function("console.log('Hello'));
	//调用函数 对象()
	fun();
2、使用函数声明来创建一个函数
	//语法: function 函数名([形参1,形参2,形参3])
	function fun(){
	
	}
	fun();
3、使用函数表达式来创建一个函数
	var 函数名 = function(){
	}
	var fun = function([形参1,形参2,形参N]){
	}
	fun();
	
3、2函数的参数
调用函数的参数时,不会检查实参的类型,后果--->所以可能会接受到非法的参数
也不会检查的实参的数量,多余的实参不会赋值 后果 ---->没有对应实参的形参将是undefined

实参是一个对象,他也是一个函数

<script type="text/javascript">

        // console.log(b);
        //创建一个函数,可以在控制台中输出一个人信息,名字,年龄,性别,地址
        function  person(name,age,sex,address) {
            // var c = new Object();
            var c = {};
            c.name = name;
            c.age = age;
            c.sex = sex;
            c.address = address;
            return c;
        }
        var c = person("sin",13,"女","南昌");
        console.log(typeof c);
        console.log(c);
        //可以使用对象进行操作
        function sum(obj) {
            console.log(obj.name+"n年芳"+obj.age+"性别"+obj.sex+"地址"+obj.address);

        }
        var obj = {
            name:"sin",
            age:13,
            sex:"女",
            address:"南昌"
        }
        sum(obj);
        //实参也可以是是一个函数
        function fun(a) {
            a(obj);
        }
        fun(sum);
       fun(function (m) {
           console.log("你就是个弟弟");
       })

    </script>
3、3函数的返回值
//用return ;返回的是undefined ,你不写return也是undefined
function fun(a,b){
	var d = a+b;
	return d;
}
var res = fun(1,2);
console.log(res);

举例

 <script type="text/javascript">
     //以下三个函数都是求解偶数  
     function fun(a) {
            var b  = !!(a%2);
            return b;
        }
        var c = fun(3);

        console.log(fun(2));
        console.log(c);

        function fun2(a) {
            return (a%2) === 0 ;
        }
        console.log(fun2(2));
        function fun3(a) {
            if(a%2==0){
                return true;
            }else{
                return false;
            }
        }
        console.log(fun3(1));

    </script>

四、方法

1、对象的属性值可以是任意的数据类型,也可以是个函数
函数也可以称为对象的属性
如果一个函数作为对象的属性保存,我们称这个函数是对象的方法,调用函数就是调用这个对象的方法

<script type="text/javascript">
            var obj = new Object();
            obj.name = "sin";
            obj.age = 12;
            
            obj.sayName = function () {
                console.log("你就是一个弟弟");
            };
            //函数
            function fun(){
                console.log("你就个弟弟");
            }
            //函数的调用
            fun();
            //方法的调用
            obj.sayName();
            
        </script>

五、枚举对象中的属性

语法:使用for....in语句
当变量作为属性名的时候,用[]

 <script type="text/javascript">
            var obj ={
                name:"sin",
                age:100,
                sex:"男",
                address:'你家在哪'
            };
            for(var a in obj){
                console.log("属性名"+a);
                console.log("属性值"+obj[a]);
            }


        </script>

刘、作用域(重点,面试会问),变量声明提前

作用域是指一个变量的范围,有两种,
声明统一提前,赋值原地不变
1、全局作用域
		-直接编写在script标签的中的js代码,都在全局作用域
		-全局作用域在页面打开是创建,在页面关闭时销毁
		-在全局作用域中有一个全局对象window
			window代表一个浏览器的窗口,他有浏览器创建我们可以直接使用
		-在全局作用域中:
			创建的变量都会作为window的属性保存
2、函数(局部)作用域
	2、1在函数作用域中,可以访问到全局作用域
		在全局作用域中,访问不到函数作用域
	2、2在函数作用域中,他会在自身作用域中查找,如果没有的花,就会去上一层查找,如果在全局作用域中都没有找到的话,就会报reference error
	2、3在函数中没使用var声明的变量,都会变成全局变量
	2、4定义了形参就相当于在函数中声明了一个变量

3、声明变量提前
	3、1使用var关键字声明的变量,会在所有代码执行之前声明
	3、2使用函数声明创建的function fun(){}会在所有代码执行前就会被创建
		函数表达式

<script type="text/javascript">
    //全局变量举例
           var c = "sin";
           console.log(c);      //"sin"
           console.log(window.c);//"sin"
           //console.log(m);报错
           console.log(window.m);   //undefined
           function  f() {
               console.log("zs是个弟弟");
           }

           console.log(f());        //zs是个弟弟
           window.f();              //zs是个弟弟
           console.log(window.f());         //这里放回的undefined的,因为没有返回值
       </script>
 <script type="text/javascript">
 			//函数的形参相当于声明了函数的变量
            function fun(e){
                console.log(e); //undefined
            }
            fun();
        </script>
<script type="text/javascript">
           //3\变量的声明提前:
           /*
                使用var关键字声明的变量,会在所有代码执行之前声明(undefined),在执行赋值语句才会赋值
            */
           console.log("a="+a);     //undefined
           var a = 123;             //123
       </script>
//关于函数变量提升和声明变量提升那个优先级更高

var getName = function(){
    console.log(2);
}
function getName (){
    console.log(1);
}
getName();
function getName(){    //函数声明提升到顶部
    console.log(1);
}
var getName;    //变量声明提升
getName = function(){    //变量赋值依然保留在原来的位置
    console.log(2);
}
getName();    // 最终输出:2

使用小技巧 ---->在chrome的debug模式

1、第一步,打开开发者工具,然后在在sources里面单击哪一行哪一行就开始调试

2、可以选着某个变量进行查看(因为谷歌的全局变量太多了)Add Select text to Watches

3、按照f10进行一下步调试

posted on 2021-01-06 22:02  jwthong  阅读(69)  评论(0)    收藏  举报