如下代码,想把此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);
}
}
前面几位说的很好了,我补充一个:
当你的属性名包含了空格时,必须采用中括号的写法。
我来告诉你答案吧
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值
再仔细解释我不知道怎么解释,只可意会不可言传,你自己想一下。
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]);
访问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中,key是字符串,需要用双引号"key"括住,然而js中的对象的属性,必须满足js的标识符命名规范,以$_A-Za-z开头。但是标准json中,可以用双引号阔住,不受js语法的影响,甚至可以使用特殊字符。
比如{"1":2},这是合法的。但是如果你用.号语法来定义一个属性,这是做不到的。如obj.1=2;这是语法错误。这时候,如果你要获取key为1或者"1"的值,只能用obj[1]或者obj["1"],而不能用obj.1。
data.key
代表 data里面name = "key"
的valuedata[key]
代表data里面name = key
的value
http://es6.ruanyifeng.com/#docs/class 阅读ES6的Class规范会有答案的。
动态取字段
特殊字符
区别还有:
var obj = {};
obj['first name'] = 'mike';
以上情形,只有通过[]语法才能获取'first name',因为其中有空格,用.语法怎么也取不到。。。
json.data.key
这里的key
必须是引用值json.data[key]
这里的key
必须是字面量
// 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"]
,其他情况下不能乱来。
可以理解为:
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,即使知道了,也不会去这么写,这也就是[]存在的价值
,此时只能采用数组形式获取。
效率方便,没有深入研究,没有发言权。
for(var i in data){
console.log(i); // 打印出data里的所有键
console.log(data[i]); //打印出data[i]所有键里的值
console.log(data.i) // 打印data.i的值,没有的话,当然返回undefined喽~
}
object.key
里面的key
为标识符,应符合标识符(比如变量)的命名规范。object[key]
里面的key
为表达式,可以是字符串或复合表达式,比如object['your name']
或object['your' + ' name']
或object[dict.nameKey]
。