你不知道的JavaScript之对象篇一

1.可计算属性名
ES6新增了关于可计算属性名的相关内容,它使得我们可以利用[]包裹一个表达式来当做属性名:

var prefix = "key";
var obj = {
  [prefix+"1"]: "one",
  [prefix+"2"]: "two"
};
with(obj){
  console.log(key1);
  console.log(key2);
}

但是如果像下面这样使用的话那么就是不正确的:

var key1 = "one",
    key2 = "two",
    prefix = "key";
var obj = {
  [prefix+"1"],
  [prefix+"2"]
};//error
with(obj){
  console.log(key1);
  console.log(key2);
}

对于这种情况下,你不能够使用可计算属性名,你必须像下面这样做:

var obj  = {
  key1,
  key2
};

2.数组
数组也是对象,这点相信大家都知道,但是这带来的是怎么一个容易使人产生误解的地方:对象可以动态添加属性,所以说我们的数组也能够动态添加属性,但是这些动态添加的属性又是否一定是存储在数组里面的元素项呢?答案是并不一定,看下面举一个例子:

var arr = ["one", 2, "three"]
arr["name"] = "hahaArray"
console.log(arr.length);//3=>说明这个动态添加属性并不是数组元素项
arr["3"] = 4
console.log(arr.length);//4=>说明这个动态添加的属性是一个数组元素项

总结:如果你试图向数组添加一个属性,但是这个属性名“看起来”像是一个数字的话,那么这个添加进来的属性就将是数组的元素项。
关于数组还有一点需要注意的就是:关于数组的元素项,他们只能通过[]语法访问,不能够通过.语法访问。当然,对于数组的属性的话,两者都行。举个例子:

var arr = ["one", 2, "three"]
arr[arr.length] = 4
with(arr){
  var key = 3
  console.log(length)
  console.log(key)//3
}
console.log(arr.key)//undefined

仔细看上面这个例子,其实它显现出了两个问题。问题1:对于数组来说,我们不能够使用.语法来访问数组的元素项内容;问题2:with代码块真的是一个矛盾体,首先对于一个LHS查询,如果with关联的那个对象中没有的话,那么则会将这个变量泄露到全局作用域中;而且,with代码块也不是一个代码块:在这个块里面,利用var定义的变量并不能够被隐藏起来,他会泄露到with所属的那个作用域里面。因此在JavaScript里面,能够达到块作用域的相关内容只有函数块,let语法,const语法,catch块?WTF

var obj = {"one": 1}
function fun(obj){
  with(obj){
    var two = 2;
  }
  console.log(two);
}
fun(obj)//2
console.log(two)//reference error

END

你可能感兴趣的:(你不知道的JavaScript之对象篇一)