目录
一.对象(Object)
1.1对象简介
六种数据类型,前五种是基本数据类型。
只要值不是属于上面五种基本数据类型,就一定是对象(Object)类型。
如果使用基本数据类型的数据,我们所创建的变量都是独立的,不能成为一个整体
就像这三个变量,不能确定他们表示同一个人,没有什么练习。
就像一个袋子,可以装进许多不同的变量类型。
对象的分类:
- 1.内建对象
在任何js的条件下都能直接使用。 -
- 宿主对象
BOM:浏览器对象模型
DOM:文档对象模型
像console.log()
document.write()
都是浏览器提供的,为宿主对象。
- 宿主对象
- 3.自定义对象
1.2对象的基本操作
- 创建对象
例如;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a= new Object();
document.write(a);
</script>
</head>
<body>
</body>
</html>
显示为:
这就是一个新创建的空对象。
- 向对象中添加值
例如:
a.name="孙悟空";
这条语句的意思就是:向空对象a里添加了一个名为name的属性,name的值是孙悟空。
当然,一个空的对象可以添加多个值。
例如
再添加一个gander属性和age属性。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a= new Object();
a.name="孙悟空";
a.gander="男";
a.age=18;
console.log(a);
</script>
</head>
<body>
</body>
</html>
显示为:
- 读取对象中的属性
例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a= new Object();
a.name="孙悟空";
a.gander="男";
a.age=18;
console.log(a.name);
document.write(a.gander);
console.log(a.age);
</script>
</head>
<body>
</body>
</html>
显示为:
注:
- 修改对象的属性值
就是直接在后面加上一条修改语句。
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a= new Object();
a.name="孙悟空";
a.gander="男";
a.age=18;
a.name="tom"
console.log(a.name);
document.write(a.gander);
console.log(a.age);
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,孙悟空被修改成了tom
- 删除对象的属性
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a= new Object();
a.name="孙悟空";
a.gander="男";
a.age=18;
a.name="tom"
delete a.name;
console.log(a.name);
document.write(a.gander);
console.log(a.age);
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,name属性被删除,进而转化为了undefined。
1.3属性名和属性值
- 属性名
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a= new Object();
a.var="tom";
</script>
</head>
<body>
</body>
</html>
其中的 a.var="tom";
是合法的,但是尽量还是按照标识符的规范去做。
这里存储特殊属性值和取出特殊属性值时,都要用上面的语法形式。
例如
a["123"]=789;
console.log(a["123"]);
显示为:
注:.和[]和new这三个运算符是优先级最高的运算符。
用[]传递变量时,若变量值与某一个属性值相等,那么就会读取那个相等属性的值。
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a= new Object();
var b="123";
a["123"]=789;
console.log(a["123"]);
console.log(a[b]);
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,console.log(a["123"]);
和console.log(a[b]);
效果是一样的。
- 属性值
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a= new Object();
var b=new Object();
b.name="这是一段文字"
a.test=b;
console.log(a);
console.log(a.test);
console.log(a.test.name);
</script>
</head>
<body>
</body>
</html>
显示为;
- in 运算符
注:上面语法中的属性名是一个字符串,需要双引号。
例如;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a= new Object();
var b=new Object();
b.name="这是一段文字"
a.test=b;
console.log("test2"in a);
</script>
</head>
<body>
</body>
</html>
显示为:
证明a对象中没有名为tset2的属性值。
二.基本和引用数据类型
引例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a=100,b;
b=a;
a++;
document.write(a);
document.write("<br/>")
document.write(b);
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,在将a的值赋给b变量后,对a自增,b的值没有发生变化。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var b=new Object();
b.name="111"
var a=b;
b.name="222"
console.log(b.name)
console.log(a.name)
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,a与b的值都发生了变化,这就是基本和引用数据类型的区别。
- 详细解释
- 基本数据类型
- 引用数据类型
假如把obj2的值设为null
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var obj=new Object();
obj.name="swk";
var obj2=obj;
obj.name="zbj";
obj2=null;
console.log(obj);
console.log(obj2);
</script>
</head>
<body>
</body>
</html>
显示为:
就是这样的。
- 对象的比较
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var obj=new Object();
obj.name="swk";
var obj2=new Object();
obj2.name="swk";
console.log(obj==obj2);
</script>
</head>
<body>
</body>
</html>
显示为:
证明对象都是独一无二的。
三.对象自面量(对象的创建方式)
使用对象字面量可以更简单的来创建一个对象。
语法:
var 变量名={};
例如:
var obj={};
这样就创建了一个名为obj的对象。
例子
同时,使用对象字面量还可以方便的添加属性
例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var obj={
name:"孙悟空",
age:18
};
console.log(obj);
</script>
</head>
<body>
</body>
</html>
显示为:
注:如果要使用一些特殊的属性名,则必须加上引号,例如:
"#%@#"
这种。
也可以这样使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var obj={
name:"孙悟空",
age:18,
test:{name:"666"}
};
console.log(obj);
console.log(obj.test);
</script>
</head>
<body>
</body>
</html>
显示为:
注:这里的test不是一个独立的对象,不能独立使用,只能当作obj的一个属性使用。
四.函数的简介
函数也是对象,像document、console等也都是对象,普通的对象只能添加一些属性,一些值,而函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码)。
- 创建函数对象
- 语法1:(构造函数)
var 函数名=new Function();
例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var fun=new Function();
console.log(typeof fun);
</script>
</head>
<body>
</body>
</html>
显示为:
证明fun是一个函数
- 语法二:(函数声明)
function 函数名(形参(可以没有))
{
具体的语句。。。。
}
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var fun=new Function("document.write('hello world');");
console.log(typeof fun);
fun();
document.write("<br/>")
function fun1(){
document.write("这是一个新的函数");
}
fun1();
</script>
</head>
<body>
</body>
</html>
显示为:
新的函数起作用了。
- 语法3:(函数表达式)
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var fun=new Function("document.write('hello world');");
console.log(typeof fun);
fun();
document.write("<br/>")
function fun1(){
document.write("这是一个新的函数");
}
fun1();
document.write("<br/>")
var fun2=function(){
document.write("怎么又多出来一个新函数?")
}
fun2();
</script>
</head>
<body>
</body>
</html>
显示为:
注:function()
{}
这种是匿名函数,而函数表达式的实质就是创建一个匿名函数把他的对象赋值给一个变量。
-
要封装的代码以字符串的形式传递给函数
例如:
var fun=new Function("document.write('hello world');");
这种
-
调用函数
语法:
函数对象();
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var fun=new Function("document.write('hello world');");
console.log(typeof fun);
fun();
</script>
</head>
<body>
</body>
</html>
显示为:
fun函数被调用。
注:函数对象具有普通对象的所有功能,且函数对象的功能更加强大。
例如var fun=new Function()
fun.name="qwe"
document.write(fun.name)
显示为:qwe
五.函数的参数
- 形参与实参
像function sum(a,b){}
就相当于function sum(){var a;var b}
例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function sum(a,b){
console.log(a+b);
}
sum(3,4);
</script>
</head>
<body>
</body>
</html>
显示为:
将3赋值给了a,4赋值给了b。
- 调用函数时,浏览器不会检查实参的类型
所以,函数的实参可以是任意的数据类型
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function sum(a,b){
console.log(a+b);
}
sum(3,"hello");
</script>
</head>
<body>
</body>
</html>
显示为:
进行了拼串操作。
- 调用函数时,浏览器也不会检查实参的数量。
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function sum(a,b){
console.log(a+b);
}
sum(3,"hello",111,null,true);
</script>
</head>
<body>
</body>
</html>
显示为:
没有变化
六. 函数的返回值
引例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function sum(a,b,c){
var d=a+b+c;
return d;
}
var e=sum(3,4,5);
alert("e="+e);
</script>
</head>
<body>
</body>
</html>
显示为:
注:在函数中return后的语句都不会执行,且return后可以返回任意类型的值
七.实参可以是任何值
引例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function iso(sum){
return sum%2==0;
}
var result=iso(3);
alert("result="+result);
</script>
</head>
<body>
</body>
</html>
显示为:
例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function shib(obj){
document.write("name="+obj.name,"age="+obj.age,"address="+obj.address);
}
var obj={
name:"孙悟空",
age:18,
address:"花果山"
};
shib(obj);
</script>
</head>
<body>
</body>
</html>
显示为;
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function shib(obj){
document.write("name="+obj.name,"age="+obj.age,"address="+obj.address);
document.write("<br/>")
}
var obj={
name:"孙悟空",
age:18,
address:"花果山"
};
shib(obj);
function b(a){
a(obj);
}
b(shib);
</script>
</head>
<body>
</body>
</html>
显示为:
函数shib又执行了一遍,通过函数b。
函数也能作为一个实参,因为函数也是一个对象,对象能干的事情,函数都能干。
- 调用函数与函数的区别
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function sum(a,b,c){
return a+b+c;
}
function b(a){
console.log("a="+a)
}
b(sum);
</script>
</head>
<body>
</body>
</html>
当 b(sum);
,即b函数中只是sum的函数名时,这种就是函数,显示为:
而当b(sum(1,2,3))
时,即b函数中有sum(),这种就是调用函数,显示为:
调用函数与函数对象的区别就是(这里的mianji是视频中的函数)
简单的举例:如果把mianji比作一个机器,那么调用函数就是在使用机器的功能,而函数对象就是直接把整个机器给你。
简单的说,不加()就是传递函数对象,加上()就是传递返回值。
八.返回值的类型
实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function a(){
return {name:"sss"}
}
var b=a();
document.write(b.name);
</script>
</head>
<body>
</body>
</html>
显示为:
sss
特别注意:这里的var b=a();
b不是等于a,要加上()才是函数。
注意p55集,有忘的地方再去看看。
- 立即执行函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
(function a(){
alert("我是一个匿名函数");
})();
</script>
</head>
<body>
</body>
</html>
显示为:
直接写匿名函数是会报错的,但是,通过()来表示匿名函数是一个整体,就可以看作一个定义了的函数,然后在后面加上一个(),就可以直接调用。
实例
注
九.对象的属性值(方法)
函数也可以作为对象的属性值,当对象的的某一属性值为函数,并且调用此函数时,就称为调用此对象的方法,方法与函数只是有名字上的区别,其他无区别,本质上是为了更好的区分。
语法:
对象名.属性名=function(){
语法
}
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var obj={
name:"2222",
sayname:function(){
alert("1111")
}
}
obj.sayname();
</script>
</head>
<body>
</body>
</html>
显示为:
- 枚举对象中的属性
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a={
name:"wer",
age:18,
address:"sss"
}
for(var n in a){
document.write("属性名"+n);
document.write("属性值"+a[n]);
document.write("<br/>")
}
</script>
</head>
<body>
</body>
</html>
显示为:
即对象中的属性值。
十.作用域
引例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function hanshu(){
var a=1;
}
console.log(a);
</script>
</head>
<body>
</body>
</html>
显示为:
产生了报错,因为a变量的作用域就在函数hanshu内,在外部无法看到。
10.1全局作用域
- 变量的声明提前
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
console.log("a="+a);
var a=123;
</script>
</head>
<body>
</body>
</html>
显示为:
如果把var a=123改成a=123,则显示为:
产生报错。
因为使用var关键词声明的变量,会在所有的代码执行前被声明。
就比如:
<script>
console.log("a="+a);
var a=123;
</script>
实际上就相当于
<script>
var a;
console.log("a="+a);
var a=123;
</script>
即var a会在所有代码执行之前执行。
- 函数的声明提前
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
fun1();
fun2();
function fun1(){
document.write("111111")
}
var fun2=function(){
document.write("222222")
}
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,只有fun1显示,fun2并未显示,因为fun1是使用函数声明所创建的函数,有这声明提前的性质,与变量的声明提前一样,所以可以显示,而fun2则是用函数表达式来创建的函数,没有声明提前。
10.2函数作用域
如果说全局作用域是一个校园,那么函数作用域就像校园里一间一间的教室,是校园的一部分。
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a=10;
function b(){
var a=20;
document.write(window.a);
}
b();
</script>
</head>
<body>
</body>
</html>
显示为:
10
如果想要在函数中访问全局变量,就使用window对象。
- 在函数中,不使用var声明的变量都会变为全局变量
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var a=20;
function fun(){
console.log("a="+a);
a=10;
}
fun()
console.log("a="+a);
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,在全局作用域中,a变成了10.
- 定义形参就相当于在函数作用域中声明了变量。
例如:
<script>
function fun(e){
console.log("e="+e);
}
fun();
</script>
就相当于
<script>
function fun(e){
var e;
console.log("e="+e);
}
fun();
</script>
十.函数重名问题
- 当变量与变量重名或函数与函数重名时,后面的会替代前面的,
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a=1;
var a=2;
function abc(){
console.log("aaa")
}
function abc(){
console.log("bbb")
}
abc()
console.log(a);
</script>
</html>
显示为:
- 若变量与函数重名,则会显示变量的值,而不会显示函数的效果。
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a=1;
function a(){
console.log("aaa")
}
console.log(a);
a();
</script>
</html>
显示为:
可以看到变量的值和函数的报错。
- 原理
因为定义变量和函数时会有一个预解析,即声明提前,比如
<script>
var a=1;
function a(){
console.log("aaa")
}
console.log(a);
a();
</script>
实际上浏览器运行时是
<script>
var a;
function a(){
}
var a=1;
function a(){
console.log("aaa")
}
console.log(a);
a();
</script>
因为有了这个,且变量a的值在函数之前定义,所以显示的为a的值
再比如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
console.log(a);
a();
var a=1;
function a(){
console.log("aaa")
}
console.log(a);
</script>
</html>
显示为:
十一.debug
可以检查代码的运行情况
在chrome浏览器中的
里的
里的
可以看到源代码,并且可以进行代码的调试。具体有不理解的地方,看60集。
十二.this
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function fun(){
console.log(this);
};
var name="qqqq";
var obj={
name:"eee",
sayname:fun
};
var obj2={
name:"ccc",
sayname:fun
};
obj2.sayname();
obj.sayname();
fun();
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,用函数的形式调用时,this指向的是window,而以方法的形式调用时,this指向的是所调用的那个对象。
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function fun(){
console.log(name);
};
var name="qqqq";
var obj={
name:"eee",
sayname:fun
};
var obj2={
name:"ccc",
sayname:fun
};
obj2.sayname();
obj.sayname();
fun();
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,
obj2.sayname();
obj.sayname();
fun();
这三条语句都展示了var name="qqqq";
的结果,而不是相对应的结果,这时候就可以使用this了。把fun函数中console.log(name);
语句改成console.log(this.name);
显示为:
可以看到,三条语句分别对应了三个name属性,即他们找到相对应的对象了。
十三.使用工厂方法创建对象
可以快速方便的创建多个对象
语法:
需要用到createPerson函数
function createPerson(形参1,形参2...){
var obj=new Object;
obj.属性名=...
return obj;
}
var 属性名=createPerson(实参1,实参2...)
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function createPerson(name,age,gender){
var obj=new Object();
obj.name=name;
obj.age=age;
obj.gender=gender;
obj.sayname=function(){
alert(this.name);
};
return obj;
}
var obj2=createPerson("孙悟空",18,"男");
obj2.sayname();
console.log(obj2);
</script>
</head>
<body>
</body>
</html>
显示为:
十四.用构造函数的方法来创建对象
构造函数与普通函数区别不大,并且,构造函数可以当作普通函数来使用。
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(){
}
var son=Person();
console.log(son);
</script>
</head>
<body>
</body>
</html>
显示为:
可以看到,构造函数Person被当作普通函数来使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(){
}
var son= new Person();
console.log(son);
</script>
</head>
<body>
</body>
</html>
显示为:
构造函数的执行流程
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(){
this.name="孙悟空";
}
var son= new Person();
console.log(son);
</script>
</head>
<body>
</body>
</html>
这样就是使用this来向新建的对象Person中添加一个name属性
显示为:
以后创建对象时尽量使用参数的模式
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
var son= new Person("孙悟空",18,"男");
console.log(son);
</script>
</head>
<body>
</body>
</html>
显示为;
——————————————————————————————————
例如:
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
var son= new Person("孙悟空",18,"男");
var son1=new Person();
var son2=new Person();
这里的son,son1,son2就是一类对象,son,son1,son2也是Person的实例。
- instanceof函数
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
var son= new Person("孙悟空",18,"男");
var son1=new Person();
var son2=new Person();
console.log(son instanceof Person);
</script>
</head>
<body>
</body>
</html>
显示为;
证明son是Person的实例
注:
十五.构造函数修改
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
//向对象中添加一个方法
sayname=function(){
alert("你好,我叫"+this.name);
}
}
var son=new Person("孙悟空",18,"男");
var son2= new Person("白骨精",20,"女");
</script>
</head>
<body>
</body>
</html>
- 使所有对象共享同一个方法的方案。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
//向对象中添加一个方法
sayname=fun;
}
function fun(){
alert("你好,我叫"+this.name);
}
var son=new Person("孙悟空",18,"男");
var son2= new Person("白骨精",20,"女");
</script>
</head>
<body>
</body>
</html>
这样就可以使所有对象共享同一个方案
十六.对象的遍历(快速获取对象中的所有属性)
语法:
var 对象名={
属性1:。。。,
属性2:。。。,
}
for(var i in 对象名){
console.log(对象名[i])
}
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var obj={
name:"111",
age:11,
scd:"saaa"
};
for(var i in obj){
console.log(obj[i])
}
</script>
</html>
显示为:
十七.原型对象
- 引例
这里的污染指函数名不能重复,如果把
即使所有对象共享同一个方法,就会占据一个函数名,然后不能再去取同样的函数名。
不安全指多人开发时,别人很有可能就会取同样的函数名,然后把你的函数覆盖掉。 - 原型(prototype)
即prototype就是原型对象。
每一个新建的函数浏览器都会向函数中添加一个属性prototype,这个属性存放着原型对象的内存地址,且每个函数所对应的原型对象不同。
注:Myclass是网课中的函数
且这个隐含的属性(对象)与构造函数中prototype是同一个对象
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(){
}
var son= new Person();
console.log(son.__proto__==Person.prototype);
</script>
</head>
<body>
</body>
</html>
显示为:
- 原型对象的作用
因而,我们可以将对象中共有的内容,统一设置到原型对象中去。
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(){
}
var son= new Person();
var son1=new Person();
son.a="我是son中的a";
Person.prototype.a=123;
console.log(son.a);
console.log(son1.a);
</script>
</head>
<body>
</body>
</html>
显示为:
对象会首先访问自身的属性,如果自身没有这个属性,才会去访问原型对象中的属性
总而言之,原型对象像是一个公共的区域,由构造函数产生的对象都可以访问这个公共区域。
可以利用原型对象来解决开头引例提到的问题。
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(){
}
var son= new Person();
var son1=new Person();
son.a="我是son中的a";
Person.prototype.a=123;
console.log("a" in son);
</script>
</head>
<body>
</body>
</html>
显示为:
- hasOwnProperty()
如果想要检查对象中(不是原型对象)是否含有这种属性,可以使用对象的hasOwnProperty()来检查对象自身是否含有该属性。
也是返回true和false。
语法:
对象名.hasOwnProperty("属性名")
特别注意属性名的双引号
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(){
}
var son= new Person();
var son1=new Person();
son.a="我是son中的a";
Person.prototype.a=123;
console.log(son.hasOwnProperty("a"));
</script>
</head>
<body>
</body>
</html>
显示为:
- 原型对象的原型对象
因为原型对象也是对象,所以原型对象也有原型对象,但是没有原型对象的原型对象的原型对象(????),且Object的原型对象没有原型。
最多两次原型的叠加,没有第三次
十八.toString()
当我们直接在页面中打印一个对象时,实际上输出的是对象的toString()方法的返回值
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(){
}
var son= new Person();
document.write(son);
</script>
</head>
<body>
</body>
</html>
显示为:
即上述语句中document.write(son);
与document.write(son.toString());
是一样的。
例如;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
var son=new Person("孙悟空",18,"男");
son.toString=function(){
return "我直接返回这个值";
}
var result=son.toString();
console.log("result="+result);
</script>
</head>
<body>
</body>
</html>
显示为:
如果修改toString的返回值的话,修改原型对象的就可以了
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
Person.prototype.toString=function(){
return "我直接返回这个值";
}
var son=new Person("孙悟空",18,"男");
var son2=new Person("猪八戒",18,"男");
document.write(son);
document.write(son2);
</script>
</head>
<body>
</body>
</html>
显示为:
十九.垃圾回收
垃圾回收(GC)
二十.数组
20.1引例
已知,对象分为三种
前面所学的基本上都是自定义对象,而内建对象和宿主对象都是由浏览器定义的。
- 内建对象
像Object,function都是内建对象。
而数组(Array)也是内建对象。
20.2数组简介
注:属性在数组中被称为元素,从0开始的整数就是索引
- 创建数组对象
- 第一种
使用数组字面量来创建数组
语法:var 数组名=[]
例如:var arr=[]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a=[10]
console.log(a);
</script>
</html>
显示为:
- 第二种
语法:var 数组名=new Array()
例如:
var arr=new Array()
使用typeof检查一个数组时,会返回object
有两种方式给第二种数组赋值 - 1.先确定数组长度,再给数组赋值
例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a= new Array(10);
a[0]=10;
a[1]=12;
console.log(a);
</script>
</html>
- 2.直接给数组赋值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a= new Array(10,12);
console.log(a);
</script>
</html>
- 向数组中添加元素
语法:数组名[索引]=值
例如;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var arr=new Array();
arr[0]=10;
arr[1]=33;
console.log(arr);
</script>
</head>
<body>
</body>
</html>
显示为:
- 读取数组中的元素
语法:数组名[索引]
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var arr=new Array();
arr[0]=10;
arr[1]=33;
console.log(arr[0]);
</script>
</head>
<body>
</body>
</html>
显示为:
- 获取数组的长度
可以使用length属性来获取数组的长度(元素的个数)。
语法:数组名.length
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var arr=new Array();
arr[0]=10;
arr[1]=33;
arr[2]=43;
arr[3]=12;
console.log(arr.length);
</script>
</head>
<body>
</body>
</html>
显示为:
4
注:length只能获得连续数组的长度,对于非连续的数组,length的值会返回最大索引+1
例如;``arr[0],arr[3],arr[10];这样的数组,length的值就是11
- 修改数组长度
语法:数组名.length=值
例如
arr.length=10
这个数组的长度被修改到了10
- 向数组最后一个位置添加元素
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var arr=new Array();
arr[0]=10;
arr[1]=33;
arr[2]=43;
arr[3]=12;
arr[arr.length]=100;
console.log(arr);
</script>
</head>
<body>
</body>
</html>
显示为:
可以利用这个方式来清空数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a=[10]
a.length=0;
console.log(a);
</script>
</html>
显示为:
- 遍历
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a=[10,11,12,13,14,15]
for(var i=0; i<a.length;i++){
console.log(a[i])
}
</script>
</html>
显示为:
- 数组的复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a=[10,11,12,13,14,15]
for(var i=0; i<a.length;i++){
console.log(a[i])
}
var arr4=[]
for(var i=0; i<a.length;i++){
arr4[i]=a[i]
}
console.log(arr4)
</script>
</html>
显示为:
20.3冒泡排序法
是一种数组的算法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a=[9,2,4,1,3,5,7,6,8]
for(var m=0;m<a.length-1;m++){
for(var i=0;i<a.length-1-m;i++){
if(a[i]>a[i+1]){
var n=a[i];
a[i]=a[i+1];
a[i+1]=n;
}
}
}
console.log(a)
</script>
</html>
显示为:
20.4选择排序法
是一种数组的算法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
var a=[9,2,3,8,4,6,1];
for(var m=0;m<a.length-1;m++){
var minindex=m
for(var i=m+1;i<a.length;i++){
if(a[i]<a[minindex]){
minindex=i
}
}
var n=a[m]
a[m]=a[minindex]
a[minindex]=n
}
console.log(a)
</script>
</html>
显示为: