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关键字声明的变量,会在函数中所有代码执行之前被声明,但是不赋值。