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

posted @ 2018-03-14 09:58  hongweigg  阅读(134)  评论(0编辑  收藏  举报