1.生成方法
对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。
什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
var obj={
foo:'red', //键值对
bar:'blue'
};
console.log(obj);
/* Object{
bar : "blue"
foo : "red"
}
*/
释义:大括号定义了一个对象,特备赋值给变量obj,所以obj就指向一个对象,该对象内包含两个键值对(或者成员),
其中,foo是“键名(成员名)” 字符串red是键值(成员的值), 其中,键名与键值之间用冒号分隔,两个键值之间用逗号分隔。(对象的每一个键名又称之为属性(property))
1.1如果键名是数值,则被自动转为字符串
1.2键名不符合标志明的条件(比如第一个字符为数字或者空格,运算符),并且也不是数字的时候,必须加上单引号,否则会报错
//报错
var obj={
1p:'hello'
};
//正确
var obj={
'1p':'hello', //开头字母为数字
'h w':'hello', //含有空格
'p+q':'hello' //含有运算符
};
1.3对象的每一个键名又称为“属性”(property) ,他的“键值可以是任何数据类型”,如果一个属性的值为“函数” 通常把这个属性成为“方法”。它可以像函数那样被调用
var obj={
p:function (x) {
return x*x;
}
}
console.log( obj.p(2)); //4
1.4如果属性的值还是一个对象,就可以形成链式引用
var O1={};
var O2={bar:'hello'};
O1.foo=O2; //o1对象的foo属性指向o2
console.log( O1.foo.bar); //hello
1.5属性可以动态添加,不用在对象声明时候就指定
var obj={};
obj.foo='hello';
console.log(obj.foo); //hello
2.对象的引用
2.1如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。
var ob1={};
var ob2=ob1;
ob1.a=2;
console.log(ob2.a); //2
/*
ob1和ob2指向同一个对象
因此为其中任何一个变量添加属性,另一个变量都可以读写该属性。
*/
2 .2如果取消某一个变量对于原对象的引用,不会影响到另一个变量
var ob1={};
var ob2=ob1;
ob1.a=2;
console.log(ob2); //object
ob1和ob2指向同一个对象,然后ob1的值变为2,这时不会对ob2产生影响。ob2还是指向原来的对象。
2.3这种引用仅局限于对象,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。
var x=1;
var y=x;
x=2;
console.log(y); //1
当x的值发生变化后,y的值还是原本的1,这表明x和y不是指向同一个内存地址
3.关于大括号内是表达式(对象)还是语句
为了避免这种歧义,JavaScript 规定,如果行首是大括号,一律解释为语句(即代码块)。如果要解释为表达式(即对象),必须在大括号前加上圆括号。
console.log(eval('{foo:123}')); //123
console.log(eval('({foo:123})')) //{foo:123}
//第一个大括号内为语句块,输出的是语句的内容值
//第二个大括号内的为对象(表达式) 输出的类型为对象
4.属性的操作
4.1读取属性:1.使用点运算符 2.使用方括号
var obj={
p:'hello'
};
console.log(obj.p); //hello
console.log(obj['p']) //hello
(特别注意:如果使用方括号 键名必须放在单引号里面,否则会被当作变量)
var foo='bar';
var obj={
foo:1 ,
bar :2
}
console.log(obj.foo) ; // 1
console.log(obj[foo]); //2
《上面的例子就是对象obj引用foo属性的,输出的值就是字符串1(数字键可以不加引号,会自动转换为字符串),然而方括号引用的时候,没有加单引号,所以foo会被当作变量和使用。指向的是字符串bar》
数字键可以不加引号,因为可以自动转换为字符串,但是你在读取属性值的时候,点运算符需要加没法用,只能用方括号,将属性值直接写在方括号里面即可。
var obj={
123:'hello world'
};
//obj.123;//报错
console.log( obj[123]) ; //hello world
4.2属性的赋值:(1.点运算符 2.方括号运算符)
JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。
var obj={
};
obj.foo='hello';
obj['bar']='world'; //必须加引号
console.log(obj.foo); //hello
console.log(obj.bar); //world
4.3查看使用属性(Object.keys)
查看一个对象本身的所有属性,可以使用Object.keys方法。
var obj={
key1:1,
key2:2
};
console.log(Object.keys(obj));
//['key1','key2']
4.4delete命令
1.delete命令用于删除对象的属性,删除成功后返回true。
var obj = {p: 1};
console.log(obj);
console.log(Object.keys(obj)); //["p"]
console.log( delete obj.p) ;// true
console.log(obj.p); //undefined
console.log(Object.keys(obj)); //[]
2.删除一个不存在的属性,delete不报错。而且返回true
var obj={
};
console.log(delete obj.p); //true
不能根据delete命令的结果,认定某个属性是存在的。
3.delete返回false,本篇不做记录
4.delete只能删除对象本身的属性,无法删除继承的属性
5.in运算符
1.in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false。
var obj={p:1};
console.log('p' in obj); //true
但是in运算符的一个问题是,他无法识别哪些属性是自身的,哪些属性是继承的。
2.for..in循环 (用来遍历一个对象的全部属性)
var obj={
a:1,
b:2,
c:3
};
for(var i in obj){
console.log(obj[i])
}
//1
//2
//3
3.for…in循环来提取对象属性
var obj={
x:1,
y:2
};
var Arr=[]; //定义一个数组来存值
var i=0;
for(var a in obj){
Arr[i++]=a
}
console.log(Arr); //['x','y']
注意:
1.它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
2.它不仅遍历对象自身的属性,还遍历继承的属性。
var obj={
};
obj.toString();
for(var p in obj){
console.log(p)
} //没有任何输出
对象obj继承了toString属性,该属性不会被循环遍历到,因为该循环默认为“不可遍历”。
3.一般情况下,都是只想遍历对象自身的属性,所以使用for…in的时候,应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性。
var person={
name:'张三'
};
for(var key in person){
if(person.hasOwnProperty(key))
console.log(key); //name
}