JS学习笔记(三)

JS学习笔记(三)



本文小结

本文主要内容:
1.学习区分JS的基本基本数据类型和引用数据类型。基本数据类型保存的是变量值,引用数据类型保存的是内存地址。
2.


一、JS的基本数据类型和引用数据类型

不同类型的数据的数据引用

基本数据类型 String Number Boolean Null

  • 基本数据类型直接保存在栈中,值和值之间独立存在。
    在这里插入图片描述栈中的值相互独立

引用数据类型 Undefine Object

  • 对象在堆内存中开辟一片新的空间,栈中保存空间的起始内存地址。
  • new了两个对象,即使这两个对象的值完全相同,但是两个对象不相等,指向的内存地址不同。
    在这里插入图片描述
    指向相同的内存空间
    在这里插入图片描述
    给一个对象设置值为null,不影响其他指向的对象。

不同类型的数据的比较

  • 基本数据类型的比较是比较值,值相等即相等。
  • 引用数据类型的比较是比较对象的内存地址,不比较内存空间中的值的大小。即如果两个对象看起来一模一样,但是地址不同,比较==时也是false。

二、对象

1.对象的创建

两种方式 ①new Object() ②字面量创建对象 ③使用工厂方法创建新对象:

1. 构造函数 new Object()

var obj = new Obeject();

2. 使用对象字面量创建新对象`

// 属性名和属性值是用键值对:表示
var obj ={ id:"123",
		   age:26
		   test:{
		         name:"hellen"
		   		 }
		 };
obj.name = "jack";

3. 使用工厂方法创建新对象

通过该方法可以大批量的创建对象。
使用工厂方法创建的对象,使用的构造函数都是Object,创造的对象都是Object类型,就导致我们无法区分多个不同类型的对象(因此不常用)

		function createPerson(name,age)
		{
		    var obj = new Object();
		    obj.name = name;
		    obj.age = age;
		    return obj;
		}
		var obj1 = createPerson("11",12);
		var obj2 = createPerson("21",32);

4. 构造函数方法创建新对象

  • 构造函数习惯首字母大写,使用new关键字调用
					构造函数执行流程:
					
					1.创建一个新的对象
					2.将新建对象设置为函数中的this,在构造函数中可以使用this来引用新建对象
					3.逐行执行函数中代码
					4.将新建对象作为返回值返回
  • 使用同一个构造函数创建的对象称为一类对象,也将一个构造函数称为一类。
  • 通过一个构造函数创建的对象,称为该类的一个实例

举例说明:

function Person(name,age)
{
    this.name=name;
    this.age=age;
}
var per = new Person("nini",18);
console.log(per instanceof Person);
console.log(per instanceof Object);

输出:
true    //可以区分对象的类型
true   //所有对象的类型都是对象

2.枚举对象中的属性

使用for in语句,对象中有几个属性,循环体就会执行几次,每次执行会将对象中一个属性的名字赋值给变量

for(var n in 对象名){
		console.log("属性名"+n);
		console.log(obj[n]);//输出对象的每个属性的值
}

举例说明:

var obj ={ id:"123",
		   age:26	
		 };
for(var n in obj){
    console.log(n);
}

//输出
id
age


三、函数的创建与使用

函数也是一个对象

1.使用函数声明创建函数

function 函数名(参数1,参数2)
{
语句...
}

2.使用函数表达式创建函数

var 函数名 = function (参数1,参数2)
			{
			语句...
			}
  • 形参
  • 实参 实参可以是基础类型的变量值,也可以是一个对象,一个函数。

3.使用函数对象和调用函数的区别

func();//调用函数     相当于使用函数返回值
func;//函数对象      相当于使用函数对象

四、方法

函数可以作为对象的属性,这时该函数称为这个对象的方法,调用函数即调用对象的方法。

  • 方法和函数其实没有本质区别。
				var obj = new Object();
				obj.name = "hello";
				obj.sayName = function(){
				    console.log(obj.name);
				}
				obj.sayName();//调obj对象的方法
				
				function sayName()
				{
				    console.log(obj.name);
				}
				sayName();//调函数

五、变量作用域

1. 全局作用域:全局作用域中的变量都是全局变量

  • 全局作用域在页面打开时候创建,页面关闭时销毁
  • 全局作用域中有个全局对象window,代表一个浏览器窗口,由浏览器创建,我们可以直接使用。
    • 在全局作用域中,创建的变量都会作为window的属性保存
    • 在全局作用域中,创建的函数都会作为window的方法保存
  • 变量的提前声明: 使用var关键字声明的变量,会在所有的代码执行之前被声明,但是不会被赋值
  • 函数的提前声明:使用函数声明式创建的函数function函数(){ }会在代码执行之前创建,可以在声明前调用函数;使用函数表达式var 变量名 = function(){ }创建的函数不会被提前声明,不能在声明前调用。

2. 函数作用域

  • 调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁。
  • 每调用一次函数会创建一个新的函数作用域,彼此相互独立。
  • 在函数中想访问同名的全局变量,可以访问window.变量名。
  • 函数作用域中的变量和函数的声明提前:在函数中,用var关键字声明的变量,会在函数中所有代码执行之前被声明,但是不赋值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值