您的位置:首页 > 移动开发 > Objective-C

Object.prototype.toString.call() 进行类型判断

2014-03-17 09:59 701 查看
首先看一段ECMA中对Object.prototype.toString的解释:
Object.prototype.toString( )
When the toString method is called, the following steps are taken:1. Get the [[Class]] property of this object.
2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.

3. Return Result (2)

我们知道,Javascript中,一切皆为对象。所以如下代码,应当会输出对应字符:

view source

print?

01
var

oP = Object.prototype,
02
toString = oP.toString;
03
 
 
04
console.log(toString.call([123]));
//[object Array]
05
console.log(toString.call(
'123'
));
//[object
String]
06
console.log(toString.call({a:
'123'
}));
//[object Object]
07
console.log(toString.call(/123/));
//[object RegExp]
08
console.log(toString.call(123));
//[object Number]
09
console.log(toString.call(undefined));
//[object Undefined]
10
console.log(toString.call(
null
));
//[object
Null]
11
//....
标准浏览器中完美的作到,但是(为什么要说但是呢)IE6中,却会出现以下问题:
通过Object.prototype.toString.call获取的 字符串,undefined,null均为Object

所以,我们又要悲剧的先对以上类型进行判断,完整代码:

view source

print?

01
var

oP = Object.prototype,
02
toString = oP.toString;
03
 
 
04
function

typeOf(value) {
05
    
if

(
null

=== value) {
06
        
return

'null'
;
07
    
}
08
 
 
09
    
var

type =
typeof

value;
10
    
if

(
'undefined'

=== type ||
'string'
=== type) {
11
        
return

type;
12
    
}
13
 
 
14
    
var

typeString = toString.call(value);
15
    
switch

(typeString) {
16
    
case

'[object Array]'
:
17
        
return

'array'
;
18
    
case

'[object Date]'
:
19
        
return

'date'
;
20
    
case

'[object Boolean]'
:
21
        
return

'boolean'
;
22
    
case

'[object Number]'
:
23
        
return

'number'
;
24
    
case

'[object Function]'
:
25
        
return

'function'
;
26
    
case

'[object RegExp]'
:
27
        
return

'regexp'
;
28
    
case

'[object Object]'
:
29
        
if

(undefined !== value.nodeType) {
30
            
if

(3 == value.nodeType) {
<
b97c
code>31
                
return

(/\S/).test(value.nodeValue) ?
'textnode'
:
'whitespace'
;
32
            
}
else
{
33
                
return

'element'
;
34
            
}
35
        
}
else
{
36
            
return

'object'
;
37
        
}
38
    
default
:
39
        
return

'unknow'
;
40
    
}
41
}
 
http://my.oschina.net/sfm/blog/33197
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: