一 对象
1)内建对象:在标准ES标准中定义的对象,例 String Number
2) 宿主对象:由js运行环境所提供的对象 例 console document 都是对象
3)自定义对象:由开发人员自定义
###########主要是对自定义对象的描述
1)
//创建对象
var obj =new Object();
//为对象添加属性
obj.name=“小红”;
obj.gender=“男”;
console.log(obj);//输出对象
//修改对象的属性
//obj.gender=“女”;
console.log(obj);//输出对象
//删除某一属性名
//delete obj.gender;
console.log(obj);//输出对象
???????delete obj.gender 为什么前边两个输出中也没了gender属性????
2)属性名和属性值
属性名的定义不要求执行命名规范,但是对于特殊的需要用
对象【“属性名”】=属性值;
obj[“gender”]=“男”;
例:
obj[“123”]=789;
var a=“123”;
console.log(obj[a]);//输出789
###检查某一对象中是否存在某一属性
console.log(“test” in obj);//返回false
console.log(“gender” in obj);//返回true
3)基本数据类型:string Number null undefined
js中的变量保存在栈内存中,基本数据类型直接在栈内存中存储,值和值之间独立存在,修改其中一个并不会更改另一个的值
举例:
var a=10;
var b=a;
console.log(“a=”+a+" b="+b);//a=10 b=10
a=30;
console.log(“a=”+a+" b="+b);//a=30 b=10
发现a和b互不影响,其中任一个变量改变都不会影响另一个变量的改变
画图以后补上。。。。。。。。。。。。。。。。。。
| 变量 |变量值 |
| a | 10 |
| b | 10 |
栈内存中
引用数据类型:Object
引用数据类型中对象是保存在堆内存中,没创建一个新的对象,都会在堆内存中开辟一块新的内存空间,在栈内存中保存变量名和对象所在地址,通过地址找到堆内存中的对象,如果两个变量保存的是同一个对象,则他们指向同一块内存空间,其中一个对象发生改变,另一个对象也一定会发生改变
举例:
var obj =new Object();
obj.name=“小红”;
obj[“gender”]=“男”;
var obj2=obj;
obj2.name=“小绿”;
console.log(obj);//{name: “小绿”, gender: “男”}
console.log(obj2);//{name: “小绿”, gender: “男”}
###总结:判断是否相同,基本数据类型看属性值,引用数据类型看地址值
4)对象字面量
//定义对象
var obj={
name:“阿涛”,
age:18,
gender:“男”
};
二 函数 也是一个特殊的对象
//定义函数
function fun(a,b){
return a+b;
}//相当于函数内部 var a,var b;
fun(11,22)//调用函数
console.log(fun(11,22));//33
console.log(fun(11,“hello”));//11hello
###注意:调用函数时不会检查实参的类型和数量,如果实参数量多了则自动忽略,如果少了就会自定义为undefined,
return;相当于 return undefined; 相当于 不写return
2)函数还可以作为函数的形参
举例:
function fun(){
alert(“我是fun”);
}
function a(fun2){
console.log(fun2);
}
a(fun);
输出:
ƒ fun(){
alert(“我是fun”);
}
3)匿名执行函数
function(){
alert(“我是匿名函数”);
} //但是无法执行
执行方法:
(function(a,b){
alert(“我是匿名函数”);
})(1,1);//称为立即执行函数,一般只执行一次
4)对象的属性名也可以实是函数
var obj={
name:“swk”,
age:19,
sayHello:function(){
alert("hello "+this.name);
}
};
//调用方法
obj.sayHello();可是函数
5)枚举属性 for(var n in 对象)
var obj={
name:“swk”,
age:19,
sayHello:function(){
alert(“hello “+this.name);
}
};
for(var n in obj)
{
console.log(n+”:”+obj[n]);//n 为属性名,obj[n]为属性值。
}
输出:
name:swk
age:19
sayHello:function(){
alert("hello "+this.name);
}
三 作用域
1全局作用域:直接编写在script标签中的即为全局作用域,全局对象window则可以直接使用,代表所创建的窗口,页面打开时创建,页面关闭时销毁,所有创建的对象都是window的属性
window.alert("nihaoya ");只是把window省略。
2 var 声明的变量,在所有代码执行之前声明(声明提前)注意以下两个的区别
a=10;//相当于window.a
function fun(){
console.log(a);//undefined
var a=20;
console.log(a);//20
}
fun();
#######
a=10
function fun(){
console.log(a);//10如果在函数中找不到所要输出的变量,就去上一级寻找,如果能找到则输出,直到找到全局变量。
a=20;
console.log(a);//20
}
fun();
3函数作用域,调用函数时创建,函数执行完毕之后销毁。每调用一个函数就创建一个新的函数作用域,且相互独立各不相同
4 定义形参相当于在函数作用域中声明了变量
var e=30;
function fun(e)
{
alert(e);//undefined
}
fun();
##############
5 this 隐含参数为this,指向一个对象
根据调用方式不同,this指向不同的对象
1)函数调用时,this指向window
2)方法调用时,this指向obj;
var name=“全局”;
function fun(){
console.log(this.name);
}
fun();//输出 全局
var obj={
name:“swk”,
sayName:fun
}
function fun(){
console.log(this.name);
}
obj.sayName();//输出swk
##########
6工厂方法创建对象
function CreatePerson(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
var per=new CreatePerson(“swk”,18,“男”);
console.log(per.age);
构造函数中可用this来引用新建对象。
function CreatePerson(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
console.log(this);
}
var per=new CreatePerson(“swk”,18,“男”);
7将对象共同使用的函数放在prototype(原型)中,原型对象相当于一个公共区域,所有一个类的实例都可以访问到这个原型对象,当一个对象访问属性时首先从自身属性中查询,如果自身属性中没有就从该对象的prototype属性中查询。
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
};
Person.prototype.fun=function(){
alert(this.name);//弹出swk
}
Person.prototype.a=“123”;//将属性和函数定义在公共区域prototype中
var per=new Person(“swk”,18,“男”);
per.fun();
console.log(per.a);//输出123
????为什么console.log(per.proto);是undefined,但是console.log(per);
输出结果如下:其中有_proto_属性。
Person {name: “swk”, age: 18, gender: “男”}
age: 18
gender: “男”
name: “swk”
proto: Object