JavaScript 对象的属性键(Key)可以为空吗?
1、JavaScript 对象的属性(Key)可以为空吗?比如:
var obj = {
"": "Zhangshan"
}
答案是肯定的。
2、那么JS对象的属性KEY 能为null吗?
var obj = {
null: "Zhangshan"
}
答案是否定的。
3、那么JS对象的属性KEY能为数字吗(非字符串)?
var obj = {
1: "Zhangshan"
}
答案是可以,但是数字型仍然会被当做字符串看待。使用obj[1]可以访问KEY(1),当然也可以使用obj['1']访问KEY(1)。
4、JS对象的属性KEY能为undefined吗(非字符串)?
var obj = {
undefined: "Zhangshan"
}
答案是可以,undefined会被当做字符串看待。可以使用obj['undefined']访问KEY(undefined),也可以使用obj[undefined]访问KEY (undefined),同理NaN也可以作为JS对象的属性KEY。
5、JS对象的属性KEY能为对象吗?
var myObj = {
department: 'R&D'
};
var obj = {
myObj: 'Wangmazhi'
}
答案是不可以,该例子中myObj会被当做字符串“myObj”,跟前面定义的对象myObj不再有关系。
如果换种方式,不是直接使用对象做KEY,而是通过赋值的方式来将对象设置为KEY:
<script lang="javascript">
//打印输出
function println(str){
document.writeln(str + "<br/>");
}
var obj1 = {
name: 'Zhangshan'
}
var obj2 = {
department: 'R&D'
}
var obj3 = {
age:30
}
var myObj = {};
myObj[obj1] = 'test is ok!';
myObj[obj2] = 'wahaha'
myObj[obj3] = 'Chinese people are great!';
for(var item in myObj){
println("typeof item is:" + typeof(item) + ",value:" + item );
if(typeof item == 'object'){
pintln('item is object');
}
println(item + "=" + myObj[item]);
}
</script>
输出:
typeof item is:string,value:[object Object]
[object Object]=Chinese people are great!
可以看到对象最终被转换为字符串"[object object]",不再是object类型,如果使用使用多个不同的对象作为KEY,则它们会相互覆盖,最终只有一个属性KEY ------"[object object]",所以将对象用作属性KEY是没有意义的。
测试示例:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Empty key test</title>
</head>
<body>
<script lang="javascript">
//打印输出
function println(str){
document.writeln(str + "<br/>");
}
//打印错误消息
function logerror(e){
var str = '<span style="color:red;">'
+ 'errorCode:' + e.number
+',errorType:' + e.name
+ ',errorMessage:' + e.message
+ '</span>'
println(str);
}
//测试数据
var myObj = {
department: 'R&D'
};
//测试数据
var config = {
views:{
'': {
controller: 'ReplicationControllerListController',
controllerAs: '$ctrl',
templateUrl: 'replicationcontroller/list/list.html'
},
'1':{
name:'Zhangshan'
},
1:{
name:'Lishi'
},
undefined:{
name:'Zhaoliu'
},
myObj: {
name:'Wangmazhi'
},
NaN : {
name: 'Sunwuming'
}
// ,null:{
// name:'Wangwu'
// }
}
};
/*
*打印KEY类型
*/
function test1(){
println("-------------------------");
var i=0;
for(var item in config.views){
println(i + ':' + item + ',type:' + typeof(item));
if(item == undefined){
println("undefined here!");
} else if(item == 'undefined') {
println("'undefined' is string!");
}
i++;
}
println("-------------------------");
}
//测试KEY取值
function test2(){
println(config.views[''].templateUrl);
println(config.views['1'].name);
println(config.views[1].name);
//println(config.views[2].name);
println(config.views[undefined].name);
println(config.views['undefined'].name);
println(config.views['myObj'].name);
println('config.views[myObj]:' + typeof(config.views[myObj]));
try{
println(config.views[myObj].name);
}catch(e){
logerror(e);
}
println(config.views[NaN].name);
println(config.views['NaN'].name);
}
test1();
test2();
</script>
</body>
</html>
输出:
-------------------------
0:1,type:string
1:,type:string
2:undefined,type:string
'undefined' is string!
3:myObj,type:string
4:NaN,type:string
-------------------------
replicationcontroller/list/list.html
Lishi
Lishi
Zhaoliu
Zhaoliu
Wangmazhi
config.views[myObj]:undefined
errorCode:-2146823281,errorType:TypeError,errorMessage:无法获取未定义或 null 引用的属性“name”
Sunwuming
Sunwuming