持续更新,主要方便于存一些笔记。
对象
使用for...in循环,提取对象属性名
var obj = { key1: 1, key2: 2 }; Object.keys(obj); // ['key1', 'key2']
或者:
var obj = {'x':1,'y':2};
var props = [];var i =0;
for(var p in obj){
props[i++] = p};
console.log(props);
读取对象属性
var foo='bar';
var obj={foo:1,bar:2};
obj.foo// 1
obj[foo]// 2
备注:引用对象obj的foo属性时,如果使用点运算符,foo就是字符串;如果使用方括号运算符,但是不使用引号,那么foo就是一个变量,指向字符串bar。
var obj={0.7:'Hello World'};
obj['0.7']// "Hello World"
obj[0.7]// "Hello World"
数字加不加引号都可以,因为会被自动转为字符串。
var obj={123:'hello world'};
obj.123// 报错
obj[123]// "hello world"
对数值键名123使用点运算符,结果会报错
var person = { name: '老张' };
for (var key in person) {
if (person.hasOwnProperty(key))
{ console.log(key); } } // name
使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性。
var obj = {};
with (obj) {
p1 = 4;
p2 = 5;
}
obj.p1 // undefined
p1 // 4
如果with区块内部有变量的赋值操作,必须是当前对象已经存在的属性,否则会创造一个当前作用域的全局变量。
数组
var a = [1, 2, 3];
a.foo = true;
for (var key in a) {
console.log(key);
}
// 0
// 1
// 2
// foo
可以遍历新增key
函数
var obj = { p: 1 };
function f(o) {
o.p = 2;
}
f(obj);
obj.p // 2
传入函数f的是参数对象obj的地址。因此,在函数内部修改obj的属性p,会影响到原始值。
var obj = [1, 2, 3];
function f(o) {
o = [2, 3, 4]; }
f(obj);
obj // [1, 2, 3]
在函数f内部,参数对象obj被整个替换成另一个值。这时不会影响到原始值。这是因为,形式参数(o)的值实际是参数obj的地址,重新对o赋值导致o指向另一个地址,保存在原地址上的值当然不受影响。
同名参数:
function f(a, a) {
console.log(a); }
f(1, 2) // 2
function f(a, a) {
console.log(a); }
f(1) // undefined
function f(a, a){
console.log(arguments[0]); }
f(1) //