变量和对象
原始类型(基本类型,不可再细分):number、string、boolean、null、undefined
引用类型:object、function 函数
在变量中存放对象
var obj = {};
- 通过变量,读取对象中的某个属性
变量名.属性名
var user = {
name: 'wjh',
age: 18,
sex: '男',
girlFried: {
name: 'xmg',
age: 19,
sex: '女'
}
}
console.log(uesr, typeof user);
console.log(user.name, typeof user.name); //读取user里面的name属性
console.log(user.girlFried, typeof user.girlFried); //读取user里面的girlFriend属性
「当读取的属性不存在时,会得到undefined」
var user = {
name: 'wjh',
age: 18,
sex: '男',
girlFried: {
name: 'xmg',
age: 19,
sex: '女'
}
}
console.log(user.address); // undefined 访问对象中没有的属性会得到undefined
「当读取属性的对象不存在(undefined 或 null)时,程序报错」
var user2;
console.log(user2.name); // 报错 --> undefined.name undefined是原始值不可再细分,无属性会报错
var user3 = undefined;
console.log(user3.name); // 报错
var user4 = null;
console.log(user4.name); // 报错
// 访问undefined 和 null 中属性, 会报错
- 通过变量,更改对象中的某个属性
「当赋值的属性不存在时,会添加属性」
var user = {
account: "abc",
pwd: "123456",
gender: "男",
isVip: false,
age: 18
};
user.pwd = "654321"; //将密码修改成了654321
console.log(user, user.pwd);
user.skill = "qwer";
console.log(user, user.skill, typeof user.skill);//user中不存在 skill那么访问没有的就会给其加上这个属性
var user = {
account: "abc",
pwd: "123456",
gender: "男",
isVip: false,
age: 18,
address: {
country: "中国",
city: "成都"
}
};
//输出用户的所在城市
console.log(user.address.city);
var user1 = {
account: "abc",
pwd: "123456",
gender: "男",
isVip: false,
age: 18,
address: {
country: "中国",
city: "成都"
}
};
var user2 = {};
user2.addr = user1.address;
console.log(user2, user1);
// var user2 = {
// account: user1.account
// };
// console.log(user1.account, user2.account);
// console.log(user2.pwd);
- 删除属性
delete 变量名.属性名;
var user = {
account: "abc",
pwd: "123456",
gender: "男",
isVip: false,
age: 18,
address: {
country: "中国",
city: "成都"
}
};
delete user.account; // 删除user中的account属性
console.log(user);
// delete一般用的不多,一般在做项目开发时,如果想删除其都将其值改为undefined
user.account = undefined; //这样这个属性不会被删除,只是值为undefined。 delete的话对象中的该属性会直接被删除
- 属性表达式
给属性赋值,或读取属性时,可以使用下面的格式操作
对象变量["属性名"]
对象中的属性名本身也是字符窜形式。
使用属性表达式能更灵活的获取属性。
var user = {
account: "abc",
pwd: "123456",
gender: "男",
isVip: false,
age: 18,
address: {
country: "中国",
city: "成都"
}
};
//用属性表达式读取用户的性别属性
var prop = "account"; // 可以随意修改prop中的值,将其当做一个变量来操作
// console.log(user.gender);
console.log(user[prop]);
console.log(user.prop); // undefined 因为对象中没有prop属性
var obj = {
"? asdf sdfsgf sd sdf ": 123,
0: 'hhh'
};
console.log(obj["? asdf sdfsgf sd sdf "]); // 用obj.xxx的方式就没有办法获取
// console.log(obj["0"]);
// console.log(obj["0"]); // 宿主环境会自动将数字转换为字符串
- 某些属性名中包含特殊字符
实际上,JS对属性名的命名要求并不严格,属性可以是任何形式的名字
「属性的名字只能是字符串,如果你书写的是数字,会自动转换为字符串」
来一到面试题
var obj = {};
obj[0] = "123"; // { "0": "123" }
obj["0"] = "234"; // { "0": "234" }
console.log(obj[0], obj["0"]); //"234" "234"
// 考察点: *属性的名字只能是字符串,如果你书写的是数字,会自动转换为字符串
全局对象
JS大部分的宿主环境,都会提供一个特殊的对象,该对象可以直接在JS代码中访问,该对象叫做全局对象.
在浏览器环境中,全局对象为window,表示整个窗口。
全局对象中的所有属性,可以直接使用,而不需要写上全局对象名。
「开发者定义的所有变量,实际上,会成为window对象的属性。」
var age;
console.log(window);
// console.log(age) == > console.log(window.age);
「如果变量没有被赋值,则该变量不会覆盖window对象上的同名属性。」
var age;
console.log(window);
// console.log(age) == > console.log(window.age);
// var console = undefined; // console本来window上有这个属性,现在把其原来是给覆盖了。 所以一般避免使用window上已有的属性,导致原有功能不能使用
// var alert; //本来widow上有的变量,如果只是声明了并没赋值,那么也不会覆盖window上的属性。如果赋值那么就会覆盖
// console.log(alert);
var name = 123;
console.log(name, typeof name); //123 string name经过了特殊处理,类型都是string