对象
JS就定义了一个对象数据结构 允许使用 key: value作为一组键值对
对象可以有多个key:value对组成
对象的使用
- 对象: 是一组k:v对的集合。
- 每一组k:v对,叫做对象的属性。
- k表示对象的属性名
- v表示对象的属性值。
- 每一组k:v对,使用逗号隔开,推荐一行一个k:v对
- k最好符合变量的命名规范(属性名必须是字符串 " ‘’、’ ',但是只要属性名是符合变量命名规则,那么可以省略双引号或者单引号)
- v是具体的数据,可以是任何类型的数据。
定义对象:
- 字面量 (推荐方式)
var obj = {}; // 字面量定义对象
// 定义对象并设置属性
var obj1 = {
name: "张三"
};
- 构造函数
var obj = new Object();
- 构造函数
var obj = Object();
对象的属性操作:
- 读取属性
点语法
var obj = {
name: "张三"
}
console.log(obj.name); // 张三
方括号语法
var obj = {
name: "张三"
}
console.log(obj["name"]); // 张三
- 设置属性
点语法
var obj = {
name: "张三"
}
obj.age = 12;
console.log(obj); // {name: "张三", age: 12}
方括号语法
var obj = {
name: "张三"
}
obj["age"] = 13;
console.log(obj); // {name: "张三", age: 13}
注意: 点语法 是 方括号语法 的简写,但是属性名必须符合变量名规则,当不符合时,使用点语法会报错,只能使用方括号语法
- 删除属性
delete
关键字,该关键字只能用来删除对象的属性,而不可以用来删除变量
var obj = {
name: "张三"
}
delete obj["name"];
console.log(obj); // {}
对象的循环遍历
语法:
for (var i in obj) {}
实例:
var obj = {
name: "小明",
age: 13,
sex: "男",
married: false
}
// 使用for in 循环遍历对象
for (var k in obj) {
// k 是对象的属性名
// obj[i] 是对象的属性值
}
注意: obj.i 这种方式,是真的在读取 obj的 k
这个属性,而不是读取i变量所保存的值属性
方括号语法与点语法的区别
-
方括号语法
- [] 之间是一个JS的执行环境,可以使用变量,表达式
- [] 最终需要的是一个字符串,如果不是字符串,会转为字符串(调用toString方法)
- [] 只要内容是字符串,不论是否符合变量命名规范,都可以成功
-
点语法
- 点语法,点什么,就是什么
- 点语法,必须符合变量的命名规范
var a = "name";
var obj = {
name: "张三",
a: 123
}
// 点语法:
console.log(obj.name); // "张三"
console.log(obj.a); // 123
// 方括号语法:
console.log(obj[a]); // "张三"
console.log(obj["a"]); // 123
请实现函数copy,接收一个参数,参数是对象。该函数返回一个新对象,该新对象拥有与传递对象完全一致的属性和属性值。
var obj = {
name: "张三",
age: 22,
sex: "男",
married: false
}
function copy(){
var obj1 = {};
for (var key in obj){
obj1[key] = obj[key];
}
console.log(obj1);
console.log(obj === obj1); // false表示成功复制,但是两个是指向不同的地址,是两个不同的对象
}
copy(obj);
有数组如下 [{name: “张三”, year: 13}, {name: “李四”, year: 14}, {name: “王五”, year: 15}]
编写一段程序,得到 {张三: 13, 李四: 14, 王五: 15}
var arr = [{name: "张三", year: 13}, {name: "李四", year: 14}, {"name": "王五", year: 15}];
var arr1 = {};
for (var key in arr){
arr1[arr[key]["name"]] = arr[key]["year"];
}
console.log(arr1);
统计字符串中每个字符的个数
var str = "abcd.acbabc.bababc babc abdiawe你好,你们好!fioewafmklsdnvklsnaaeofihoai";
var newStr = ""; // 用来存放经过去重之后的字符
var obj = {};
// 将原字符串中每一个字符都遍历出来
for (var i = 0; i < str.length; i++){
// console.log(str[i]);
// 去重:判断遍历出来的字符与字符串newStr内的字符是否匹配,若匹配则不再存入newStr,-1表示不匹配
if(newStr.indexOf(str[i]) == -1){
// 将不匹配的(也就是newStr里面还没有的字符,但str里面有的字符)存入newStr
newStr += str[i];
}
}
// console.log(newStr);
// 遍历newStr中每一个字符
for (i = 0; i < newStr.length; i++){
var count = 0; // 记录每一个字符在str中出现的次数,为什么要在这里定义变量并赋值为0呢,因为计算完上一个字符出现的次数后,下一个字符的出现次数要重新开始计算
// 遍历str中每一个字符
for (j = 0; j < str.length; j++){
// 如果str中下标为j的字符与newStr中下标为i的字符匹配,出现的次数将+1
if(newStr[i] === str[j]){
count++;
}
}
// console.log(newStr[i],count);
// 将每一个不同的字符当做对象的一个属性名,将每一个不同的字符出现的次数当做对应的属性名的属性值
obj[newStr[i]] = count;
}
console.log(obj);