作业1:获取数组中,数值出现的次数
说明:
1
,如果从数组中,获取不存在的索引,从对象中获取不存在的属性
执行结果都是 undefined
只要执行结果是 undefined 证明对象中是没有这个键名/属性
调用数组的数据和对象的数据,与调用 字符串,数值,布尔值等基本数据类型不同
数组和对象是 引用数据类型,有特殊的存储方式,调用的结果也是不同的
你只要记住,调用数组的索引,调用对象的属性,如果不存在是 undefined , 不是报错
循环遍历这个数组,获取数组中的数据
将这个数据作为 对象的属性,进行写入
对象的属性,就是数组的数据
对象的属性值,第一次写入是,是这个数据第一次出现,属性值就是1
之后再次出现,给属性值值做 ++ 自增1 的操作
var arr = [1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7,1,2,3,4,5,6,7,8];
var obj = {};
arr.forEach(function(v){
// obj[v] === undefined , 证明 obj中,没有当前v这个属性
// 新增单元 v 属性值是1,表示第一次出现
// !obj[v] 也是可以的 因为 开始的时候不存在属性,执行结果的是undefined,转化为布尔值就是false,此时只有true才能触发if后面的语句,所以取反
// 此时的 undefined 是一个数值 , 不能加引号,加引号是字符串undefined
if(obj[v] === undefined ){
obj[v] = 1;
}else{
// 证明 obj 中已经有 v 这个属性了,属性值也就是表示的次数,要 ++
// obj[v]++ ---> obj[v] = obj[v]+1 在原始数值基础上加1
obj[v]++;
}
})
console.log(obj);
复习: 不能加引号的,看上去是一串字符,其实是表示数值的内容
true false null undefined NaN
var obj = { name } 有name属性,但是没有赋值
var obj = {age:18} 没有name属性
2
.字符串(此方法数组也可以用)中字符出现的次数 — 原理相同
字符串是包装类型,只是一个伪数组,并不能具有数组的所有属性
不能使用forEach(),循环遍历
可以使用for…in来循环遍历字符串
可以在for…in中自定义变量,来存储,字符串中,字符的索引下标
var str = 'abcdabcdeabcdefabcedefg';
var obj2 = {};
index 存储的 索引下标
str[index] 就是 索引下标对应的字符
for(var index in str){
// console.log(index);
// console.log(str[index]);
// forEach 获取数据 直接是 v
// for...in 获取数据是 str[index]
// 对象中,是否有,字符对应的属性
if( obj2[ str[index] ] === undefined ){
// forEach 是 obj[ v ] = 1;
// 现在 forin中 获取 v 的方式 是 str[index]
obj2[ str[index] ] = 1;
}else{
obj2[ str[index] ]++;
}
}
console.log(obj2);
循环输出结果
for(var attr in obj2){
document.write( `字符${attr},出现了${obj2[attr]}次` + '<br>' );
}