js基础知识和误区
var o={};
var s=1;
o[s]=30;
o["s"]=40;
o.s=50;
console.log('o', o)
输出结果{1:30,s:50},o.s=50改变的是o["s"]=40,因为其中的s属于字符串。 在var s=5;时里边的s属于变量变为 o[5]=30;
var d;
o[d]=10;
console.log(o.d);
console.log(o.undefined);
第一个输出结果为undefined,因为点于法的d属于字符串,与上方的并不相同,所以无定义 第二的输出结果为10
var d={a:1};
o[d]=5;
console.log(String({a:1}),String({b:3})); //两者都为对象object
console.log(o[{b:3}]);
答案是5,第一步需要把d转换为字符串,结果为object,而下方的{b:3}转换为字符串也是object, 带入后等于5
对象的存储一共有两种情况,一种是存储数据,一种是存储函数,存储数据的叫做对象的属性,存储函数叫做对象的方法
console.log("a" in o); 就是判断o对象里有没有a这个key
var o = {
a: 1,
b: 2,
c: 3,
d: 4
}
for(var prop in o){
console.log(prop);
}
console.log(prop,o[prop]);
定义prop这个变量,遍历每个key并输出
遍历键值对,现在prop是变量,不能用点于法, 如果键是一个变量,不能使用.语法,必须使用[]带入变量
var a=String.fromCharCode(122);
console.log(a);
将ascii转换为字符 97-122就是小写字母a-z
对象中存储的内容 相互之间是没有关联的
var o={a:1};
console.log(o);
堆里面有一个对象所存的引用地址,首先在堆里面建立以对象o,然后在栈里边开辟了一个变量o,变量o存储了一个值,就是对象o在堆中的引用地址,当console.log打印时,只将栈中的o打印出来,当打印o时,地址由于太多,将地址简化写成object,当点击object时,就是在堆中查找对象
var o={a:1};
console.log(o);
o.a=2;
当打开页面时,程序已经执行完毕,显示的还是对象object,点击时o对象变为了{o:2},点击刷新时,页面就处于卸载过程,重新打开页面时,有缓存机制调用,将打印时的数据存放在缓存当中,也就是{a:1},然后再继续向下执行,点击箭头后,出现了{a:2}显示时打印的对象可能已经发生变化
{a:1,b:{c:1}}
此时{c:1}也存放在堆中,在b中只是存放了一个地址
var o={a:1};
var o1=o;
o1.a=10;
console.log(o.a);
输出结果为10 因为o和o1引用地址一样,这种方式是赋值了引用地址,修改任何一个,另一个看到的也是被修改后的结果
浅复制
var o={a:1,b:2};
var o1={};
for(var prop in o){
o1[prop]=o[prop];
}
o.b=10;
console.log(o1);
o和o1是两个对象,在将o中的每个属性赋值给o1后,对o进行修改,不会影响o1的值
var o={a:1,b:2,c:{d:1,e:10}};
var o1={};
for(var prop in o){
o1[prop]=o[prop];
}
o.a=10;
o.c.d=10;
console.log(o1);
当对象里面包含对象时,在复制时将引用地址也赋值了过去,所以对c中 d和e的改变,就是对引用地址进行改变