1. 程式人生 > >JavaScript 物件的屬性鍵(Key)可以為空嗎?

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