一、对象
对象(Object)
对象的分类:①内建对象:由ES标准中定义的对象,在任何的ES的实现中都可以使用
比如:Math String Number Boolean Function Object...
②宿主对象:由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
比如:BOM DOM
③自定义对象:由开发人员自己创建的对象
创建对象:使用new关键字调用的函数,是构造函数constructor 构造函数是专门用来创建对象的函数
使用typeof检查一个对象时,会返回Object
如:var obj = new Object();
在对象中保留的值称为属性
①向对象中添加属性 语法:对象.属性名 = 属性值; 例:ovj.name = "张三";
②读取对象中的属性 语法:对象.属性名; 例:console.log(obj.name);
注意:如果读取对象中没有的属性,不会报错而是会返回undefined
③修改对象中的属性 语法:对象.属性名 = 新值; 例:obj.name = "李四";
④删除对象中的属性 语法:delete 对象.属性名; 例:delete obj.name;
二、属性名和属性值
1、属性名
使用特殊的属性名,不能用 . 的方式来操作,要用另一种方式
语法:对象["属性名"] = 属性值;
例:obj["123"] = 789;
//变量值是什么就会读取哪个属性
var n = "123";
//在读取时也要同样要用这个方式读取
console.log(obj[n]);
2、属性值
属性值可以是任意数据类型,甚至可以是一个对象
//创建一个对象
var obj = new Object();
obj.name = "张三";
obj.test = true;
obj.test = null;
var obj2 = new Object();
obj2.name = "李四";
//将obj2设置为obj的属性值
obj.test = obj2;
3、in运算符
in运算符可以检查一个对象是否含有指定的属性,有返回true,否则返回false
语法:"属性名" in 对象 例:console.log("test2" in obj);
三、基本数据类型和引用数据类型
基本数据类型:String Number Boolean Null Undefined
引用数据类型:Object
JS中的变量都是保存在栈空间中的
①基本数据类型是直接在栈空间中存储,值与值之间独立存在。
var a = 123;
var b = a;
a++;
console.log("a = " + a);//124
console.log("b = " + b);//123
修改一个变量不会影响另一个变量
var obj = new Object();
obj.name = "张三";
var obj2 = obj;
//修改obj的name属性
obj.name = "李四";
console.log(obj.name);//李四
console.log(obj2.name);//李四
//设置obj2为null
obj2 = null;
//修改obj2的值obj不会产生影响
console.log(obj);//李四
console.log(obj2);//null
②对象是保存到堆内存中的,每创建一个新的对象,就会在内存中开辟一个新的空间,
而变量保存的是对象的内存地址
//每new一次就要在堆内存中开辟一个新的空间 地址值就不一样
var obj3 = new Object();
var obj4 = new Object();
obj3.name = "王五";
obj4.name = "王五";
两个基本数据类型比较的是值,而引用数据类型比较的是地址值。两个对象一样,但地址值不同,返回false
四、对象字面量
使用对象字面量创建一个对象:var obj = {};
语法:{属性名:属性值, 属性名:属性值...}
名和值之间使用 : 连接,多个名值对之间使用 , 隔开
如果一个属性之后没有其他的属性了,就不要写,
var obj2 = {
name: "猪八戒",
age: 18,
gender: "男",
test: { name: "沙和尚" }
};
五、函数
①函数也是对象,可以封装一些功能(代码)
②使用typeof检查函数对象时,会返回function
构造函数:以字符串的形式传递给构造函数
var fun = new function("console.log('hello');");
//封装到函数中的代码不会立即执行
//函数中的代码会在函数调用的时候执行
//调用函数 语法:函数对象()
//当调用函数时,函数中封装的代码会按照顺序执行
fun();
函数声明:function 函数名([形参1, 形参2...]){语句...} []:可写可不写
函数表达式:var 函数名 = function([形参1, 形参2...]){语句...};这里的函数表达式最后要加分号,这也是一个匿名函数
六、函数的参数
/*
定义一个用来求两个和的函数
可以在函数的()中来指定一个或多个形参(形式参数)
多个形参之间使用,隔开,声明形参就相当于在函数内部声明了对应的变量
但是并不赋值
*/
function sum(a, b) {
console.log("a = " + a);
console.log("b = " + b);
console.log(a + b);
}
//在调用函数时,可以在()中指定实参(实际参数)
//实参会赋值给函数中对应的形参
sum(1, 3);
sum(123, 456);
//调用函数时解析器不会检查实参的类型
//所以要注意,是否有可能会收到非法的参数,如果有可能则需要对参数进行类型的检查
//函数的实参可以是任意的数据类型
sum(123, "Hello");//123Hello
sum(true, false);//1
//调用函数时,解析器不会检查实参的数量
//多余的实参不会被赋值
//如果实参的数量少于形参的数量,则没有对应实参的形参是undefined
sum(123, 456, "Hello", true);
sum(123);
七、返回值
可以使用return 来设置函数的返回值。
语法:return 值;
①return后的值将会作为函数执行结果返回,可以定义一个变量来接收该结果
②在函数中return以后的语句都不会执行
③如果return语句后不跟任何值就相当于返回一个undefined,如果函数中不写return,则也会返回undefined
④return后可以跟任意类型值
//创建一个函数,用来计算三个数的和
function sum(a, b, c) {
var d = a + b + c;
return d;
}
//调用函数
//变量result的值就是函数执行结果
//函数返回什么result的值就是什么
var result = sum(1, 2, 3);
console.log(result);//返回结果为6
实参可以是任何数值类型(包括对象、函数)
//创建一个函数 使其在控制台输出一个人的信息
function sayHello(o){
console.log("我叫" + o.name + ",我今年" + o.age + "岁了,我的性别是" + o.gender);
}
//创建一个对象
var obj = {
name:"张三",
age:18,
gender:"男";
};
//将对象作为一个参数传给sayHello()
sayHello(obj);
/*
sayHello() 这样调用函数相当于使用函数的返回值
sayHello 这样的话相当于直接使用函数对象
*/
返回值也可以是任意数据类型(包括对象、函数)
- ✅break——结束当前循环
- ✅continue——结束本次循环
- ✅return——结束整个循环
八、立即执行函数
函数执行完,立即被调用,这种函数叫做立即执行函数,立即执行函数往往只会执行一次。
用法:(function(a, b){
console.log("a + b =" + (a + b));
};)(1, 2);
九、对象方法
函数也可以作为对象的属性保存
//如果函数作为一个对象的属性保存 那么我们称这个函数是这个对象的方法
var obj = {
name: "张三",
age:18,
gender:"男",
sayHello:function(){}
};
//当函数作为对象的属性保存时 那么我们调用的时候就称调用这个对象的方法
obj.sayHello();
对象的属性值可以是任何的数据类型
var obj = {name:"张三"}
//将函数作为对象的属性保存
obj.sayHello = function(){console.log(obj.name);};
枚举对象中的属性
<script>
var obj = {
name: "张三",
age: 18,
gender: "男"
};
//枚举对象中的属性
//使用for ... in 语句
/*
语法:
for(var 变量 in 对象){
}
for...in 语句对象中有几个属性,循环体就会执行几次
每次执行时,会将对象中的属性赋值给变量
*/
for (var n in obj) {
console.log("属性名:" + n);
console.log("属性值:" + obj[n]);
}
</script>
十、作用域
(一)全局作用域
①直接编写在script标签中的JS代码,都在全局作用域
②全局作用域在页面打开时创建,页面关闭时销毁
③全局对象window代表一个浏览器窗口,可直接使用
④创建的变量都会作为window对象的属性保存;创建的函数都会作为window对象的方法保存
⑤全局作用域中变量是全局变量,页面任意部分都可以访问
//这里的a变量会作为window对象的属性保存,因此window可以直接使用
var a = 10;
console.log(window.a);
//这里的函数会作为window对象的方法保存,因此window可以直接调用
function fun(){
console.log("fun函数");
}
window.fun();
(二)变量声明提前
①使用var关键字声明的变量,会在所有的代码执行之前被声明(但不会赋值),不使用var关键字则不会声明提前
②使用函数声明形式创建的函数会在所有代码执行之前被创建,所以可以在函数声明前调用函数
function fun(){}
③使用函数表达式的函数不会提前声明,所以不能提前调用
var fun = function(){};
(三)函数作用域
①调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
②每调用一次函数就会创建一个函数作用域,他们之间是互相独立的
③在函数作用域中可以访问到全局作用域的变量, 在全局作用域中无法访问到函数作用域的变量
④当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用
如果没有则向上一级作用域中寻找,直到找到全局作用域,
如果全局作用域中依然没有找到,则会报错ReferenceError
⑤在函数中要访问全局变量可以使用window对象
⑥在函数中不使用var声明的变量都会变成全局变量
//使用var关键字声明的变量,会在函数中所有的代码执行之前被声明
//函数声明也会在函数中所有的代码执行之前执行
function fun() {
fun2();
var a;
conole.log(a);//undefined
a = 35;
function fun2() {
alert("Hello");
}
}
fun();
//定义形参就相当于在函数作用域中声明了变量
function fun3(e) {
var e;
alert(e);
}
fun3();