obeject.key与object[key]有什么区别

如下代码,想把此object的data部分遍历赋予给 input标签,可是当用json.data.key时取值都为undefined。用json.data.[key]则显示正常。不知道是为什么。这两者有什么区别

 var json =  {
    statusCode:1,
    data: {
     userName:"Wilson",
     userCode:"U201313759",
     password:"88888888",
     academy:"电信学院",
     major:"通信工程",
     grade:"2013",
     class:"5班",
     email:"wilsonliuxyz@gmail.com",    },  
     };  
      for (var key in json.data) {
    if (json.data.hasOwnProperty(key)) {
    // 如果吧json.data[key],则输出全部为undefined
      document.getElementsByClassName(key)[0].value = json.data[key];
      console.log(json.data);
    }
      }
阅读 30.8k
16 个回答

访问json的时候,obj["key"]与obj.key都是可以的,不过,如果key值并不确定,而是一个变量的时候,则只能通过obj[someKey]的方式访问。

var obj = {
    name: 'tom', age: 22
},
someKey = 'name';

obj.name   // 可以访问,返回 'tom'
obj['name']  // 可以访问,返回 'tom'
obj.someKey // 出错
obj[someKey] // 可以访问,返回 'tom'

我来告诉你答案吧

json.data.key

是对象访问方式;
所以json.data.key访问的是json对象下的data对象下的key;
那么json.data[key]访问的是json对象下的data数组的下标为key的值(对象是可以以数组形式来访问的),
因为这个key是变量,假设key为1,那么则

json.data[1]; //访问的是json.data下的第二个数据

如果是:

json.data['key']则访问的是json对象下的data数据中一key来下标的数据,比如
var json = {
    data : {
        key : 'value';
    }
}
// 那么:
json.data['key']得到的是value

好了,来对比以下代码:

var json =  {
    statusCode:1,
    data: {
     userName:"Wilson",
     userCode:"U201313759",
     password:"88888888",
     academy:"电信学院",
     major:"通信工程",
     grade:"2013",
     class:"5班",
     key : "这里是我定义的key值", // 为了有个好的示例,我定义了一个key
     email:"wilsonliuxyz@gmail.com",
         },  
     }; 
// 1.获取key值
var a = json.data.key; 
console.log(a); // 这里输出的a为:这里是我定义的key值
// 2.数组方式:
var key = 0;
var b = json.data[key]; 
console.log(b); // 这里输出b为:Wilson 
// 也就是说这里输出的是userName的值
// 3.继续数组方式获取
var c = json.data['key'];
console.log(c); // 这里输出c为:这里是我定义的key值

再仔细解释我不知道怎么解释,只可意会不可言传,你自己想一下。

区别还有:

var obj = {}; 
obj['first name'] = 'mike';

以上情形,只有通过[]语法才能获取'first name',因为其中有空格,用.语法怎么也取不到。。。

1.首先JS对象的key默认是字符串的(key的类型也是不可以改变的,如果想让key值拥有多种类型,建议使用map),对应的JS的key的取值也有两种方式

  • 数组的方式
  • 指针的方式(C语言中的名词,具体这个.的语法我也不知怎么命名)

2.假设你单纯的取对象中的key,那么这两种写法应该是

  • obj['key']
  • obj.key

3.不得不使用数组的方式取对象的key值

  • 对象中的key值,被以任意方式如Object.keys(obj)的方式取出并赋值给了一个变量,使用obj[key],这里的key就是一个变量(楼主问的问题就是这点,for循环中key属于变量,所以只用指针的方式存在问题)
  • 对象的key中含有特殊字符,如空格obj['ace bind']

4.总结

  • 对象的数组取值,具有多样性,功能性很强!
  • 指针的方式,写法适用于一般对象的取值,功能单一。
// magic
var key = "key";
var obj1 = {};
obj1.key = "value1";
console.log(obj1[key]); //value1
var obj2 = {};
obj2[key] = "value2";
console.log(obj2.key); //value2

// no magic
key = "_key";
var obj3 = {};
obj3.key = "value3";
console.log(obj3[key]); //undefined

var obj4 = {};
obj4[key] = "value4"; 
console.log(obj4.key); //undefined

做了一个简单的实验。
意思就是
obj.key一般可以看作是obj["key"],其他情况下不能乱来。

  • json.data.key 这里的key必须是引用值

  • json.data[key] 这里的key必须是字面量

前面几位说的很好了,我补充一个:
当你的属性名包含了空格时,必须采用中括号的写法。

object.key里面的key为标识符,应符合标识符(比如变量)的命名规范。
object[key]里面的key为表达式,可以是字符串或复合表达式,比如object['your name']object['your' + ' name']object[dict.nameKey]

  • data.key 代表 data里面name = "key"的value

  • data[key] 代表data里面name = key 的value

for(var i in data){

console.log(i); // 打印出data里的所有键
console.log(data[i]); //打印出data[i]所有键里的值
console.log(data.i)  // 打印data.i的值,没有的话,当然返回undefined喽~

}

可以理解为:

  • obeject.key 是json对象的方式获取数据;

  • object[key] 是json数组的方式获取数据;

具体区别和使用场景举个栗子你就知道了

var json =  {
    '这个key我知道哟':"对应的数据",
    '这个key是可变的,你不知道': '对应的不知道key的数据',
}

此时问题来了,知道key的情况下

json.这个key我知道哟 

但是,当你不知道key的情况下,想获取数据,就只能[]数组形式

var key = Object.keys(json)[1];
console.log(json[key]);
#输出: 对应的不知道key的数据

console.log(json.key);
# 会报错

这个场景还挺多,例如:你要展示,别人发送给你的一组key-value,你不可能知道所有的key,即使知道了,也不会去这么写,这也就是[]存在的价值,此时只能采用数组形式获取。

效率方便,没有深入研究,没有发言权。

区别就是,标准的json中,key是字符串,需要用双引号"key"括住,然而js中的对象的属性,必须满足js的标识符命名规范,以$_A-Za-z开头。但是标准json中,可以用双引号阔住,不受js语法的影响,甚至可以使用特殊字符。

比如{"1":2},这是合法的。但是如果你用.号语法来定义一个属性,这是做不到的。如obj.1=2;这是语法错误。这时候,如果你要获取key为1或者"1"的值,只能用obj[1]或者obj["1"],而不能用obj.1。

  • 动态取字段

  • 特殊字符

obeject.key 是对象形式访问变量
对象声明:

var obeject = {
    key: 'hello world!',
    key1: 'asdfg'
}
console.log(typeof obeject);
console.log(obeject.key);

object[key] 是数组形式访问变量
数组声明:

var obeject = [
    'hello world!', 'asdfg'
];
console.log(typeof obeject);
console.log(obeject[0]);

这应该就是楼主的疑惑:

var json = {a: 1};
for(var key in json){
    console.log(key);  //a
    console.log(json.key);  //undefined
    console.log(json[key]);  //1     
}

下面是我的解释:

var json = {a: 1};
for(var key in json){
    typeof key;  //"string"   
}
console.log(json.a);  //1
console.log(json."a");  //报错
1 篇内容引用
推荐问题
宣传栏