判断是否为IE的几种方法

前几天在网上看到一个技术牛人写的世界上判断是否IE浏览器之最短的js代码,如下:

<script> 
if(!+[1,])alert("这是ie浏览器"); 
   else alert("这不是ie浏览器"); 
</script>

怎么样,强悍吧。今天在博客园又看到一位朋友总结了其它一些判断方法(实例代码),于是烈火把这些教程转载给大家,期待对您有所帮助:

其实有很多判断的方法,大都是根据浏览器的特性来的。

比如库prototype的方法是:!!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1) 。就是根据ie支持window.attachEvent添加侦听事件,非ie用window.addEventListener添加侦听事件来判断的。navigator.userAgent.indexOf('Opera') === -1是因为opara浏览器能伪装成ie.如果!!(window.attachEvent )为真,就是ie;反之,如果!window.addEventListener为真,也可以判断为ie.

Ext使用的是!"1"[0],他利用IE无法使用数组下标访问字符串的特性来判断。在ie8下好像有问题。

在!+[1,]还未被发现前,判断ie最短的表达式是 !+"\v1".它利用的是ie不支持垂直制表符的特性。

以前还有一个常用方法是document.all,由于opera浏览器能伪装成ie。可以这样写:!!(document.all && navigator.userAgent.indexOf('Opera') === -1).

还有很多,先记这几条,便于工作时查阅。下面在不是IE中返回true

1.+[1,]

2.+"\v1"

3.!!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1)

4.!!(!window.addEventListener&& navigator.userAgent.indexOf('Opera') === -1)

5.!!(document.all && navigator.userAgent.indexOf('Opera') === -1)



转载于:http://www.xker.com/page/e2010/0527/96514.html

<think> 我们正在回答用户关于“前端判断数据类型方法”的问题。需要总结五种主要方法,并参考提供的引用内容。 引用分析: 引用[1]列举了五种方法:1.typeof 2.instanceof 3.Array.isArray 4.constructor 5.Object.prototype.toString.call 引用[2]和[5]展示了typeof对基本数据类型的判断,但指出typeof判断引用类型(除函数外)都为"object" 引用[3]通过代码示例说明typeof的局限性(数组、对象、null都返回"object") 引用[4]给出了一个自定义判断数组类型的方法(结合Array.isArray和特征判断) 因此,我们可以按照五种方法分类,详细说明每种方法的使用和注意事项。 回答结构: 1. 介绍数据类型判断的重要性 2. 分别介绍五种方法(包括原理、代码示例、优缺点) 3. 总结(给出选择建议) 注意:有些方法(如Array.isArray)是特定类型的判断,而有些是通用的。 我们将使用以下方式引用: [^1] -> 引用1 [^2] -> 引用2 [^3] -> 引用3 [^4] -> 引用4 [^5] -> 引用5 由于引用中提供了具体的方法,我们在介绍每种方法时,可以对应引用。 </think> ### 前端数据类型判断方法详解 在前端开发中,准确判断数据类型是基础且关键的操作。以下是五种主流判断方法及其原理和应用场景: #### 1. typeof 运算符 ```javascript typeof 123 // "number" [^2] typeof "abc" // "string" typeof true // "boolean" typeof undefined // "undefined" typeof Symbol() // "symbol" typeof function(){} // "function" typeof null // "object"(历史遗留问题)[^3] typeof [] // "object"(无法区分数组)[^5] typeof {} // "object" ``` **特点**: - 适用于基本数据类型判断 - 函数返回"function" - 无法区分null、数组和普通对象(都返回"object")[^3] #### 2. instanceof 运算符 ```javascript [] instanceof Array // true {} instanceof Object // true new Date() instanceof Date // true 123 instanceof Number // false(基本类型无效) "abc" instanceof String // false ``` **特点**: - 检测对象原型链是否包含构造函数 - 只能判断引用类型(数组、对象等) - 跨iframe时会失效[^1] #### 3. Array.isArray() ```javascript Array.isArray([1,2,3]) // true Array.isArray({}) // false Array.isArray("abc") // false ``` **特点**: - ES5新增的专用数组检测方法 - 替代 `instanceof Array` 的可靠方案 - 兼容IE9+[^4] #### 4. constructor 属性 ```javascript (123).constructor === Number // true "abc".constructor === String // true [].constructor === Array // true // 注意:null和undefined无此属性 null.constructor // TypeError ``` **特点**: - 通过构造函数判断类型 - 可被修改导致误判(`[].constructor = Object`) - 基本类型需用括号包裹[^1] #### 5. Object.prototype.toString.call() ```javascript Object.prototype.toString.call(123) // "[object Number]" Object.prototype.toString.call([]) // "[object Array]" Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(JSON) // "[object JSON]" ``` **特点**: - 最全面的判断方法(ES5+) - 精确区分所有内置类型 - 唯一能识别null的方法[^1] - 自定义对象返回"[object Object]" --- ### 方法对比总结 | **方法** | 基本类型 | 引用类型 | null/undefined | 跨iframe | 推荐指数 | |---------------------------|----------|----------|----------------|----------|----------| | `typeof` | ✅ | ❌ | ❌ | ✅ | ⭐⭐ | | `instanceof` | ❌ | ✅ | ❌ | ❌ | ⭐⭐⭐ | | `Array.isArray()` | ❌ | 仅数组 | ❌ | ✅ | ⭐⭐⭐⭐ | | `constructor` | ✅ | ✅ | ❌ | ✅ | ⭐⭐⭐ | | `Object.prototype.toString`| ✅ | ✅ | ✅ | ✅ | ⭐⭐⭐⭐⭐ | > **最佳实践**:常规判断用`typeof` + `Array.isArray()`组合,精确判断使用`Object.prototype.toString.call()`[^1][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值