- 浏览: 886655 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
在日常开发中,我们经常需要判断某个对象是否是数组类型的,在js中检测对象类型的常见的方法有几种:
1、typeof操作符。对于Function、String、Number、Undefined这几种类型的对象来说,不会有什么问题,但是针对Array的对象就没什么用途了:
alert(typeof null); // "object" alert(typeof []); // "object"
2、instanceof操作符。此操作符检测对象的原型链是否指向构造函数的prototype对象,恩,听起来不错,应该可以解决我们的数组检测问题:
var arr = []; alert(arr instanceof Array); // true
3、对象的constructor属性。除了instanceof,我们还可以利用每个对象都具有constructor的属性来判断其类型,于是乎我们可以这样做:
var arr = []; alert(arr.constructor == Array); // true
貌似后两个解决方案是无懈可击的,但真的是这样么?天有不测风云,当你在多个frame中来回穿梭的时候,令人沮丧的问题出现了:
var iframe = document.createElement('iframe'); document.body.appendChild(iframe); xArray = window.frames[window.frames.length-1].Array; var arr = new xArray(1,2,3); // [1,2,3] // 哎呀! arr instanceof Array; // false // 哎呀呀! arr.constructor === Array; // false
由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效!怎么办怎么办??嗯,javascript是动态语言,或许万金油“鸭式辨型”(duck type)可以助我们一臂之力“如果它走起路来像鸭子,叫起来也像鸭子,那就当他是鸭子吧”,同理,可以检测某些数组对象特有的能力来做判断,这个法子已经有人用了,比如Prototype框架,来看看它实现的Object.isArray方法:
isArray: function(object) { return object != null && typeof object == "object" && 'splice' in object && 'join' in object; }
isArray:”object,你有splice、join这两个数组特有的方法吗?”
object:“嗯,没错我有!”
isArray:“好吧,那你就是个数组了,哪怕你是冒充的,囧……”
var trickster = { splice: 1, join: 2 }; Object.isArray(trickster); // 假冒成功,耶
没错,这个解决方案给人的感觉有点别扭,任何一个具有'splice'和'join'属性的对象都能通过这个检测!怎么办怎么办怎么办??别着急,仔细想想,其实我们需要的是一个能取得对象实际类型,而且又能跨frame使用的方法即可。这不,细心的老外在翻阅ECMA262标准的时候发现了这个(btw,我也看了,怎么就没发现这个用途呢,囧):
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)
上面的规范定义了Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。还是先来看看在ECMA标准中Array的描述吧:
new Array([ item0[, item1 [,…]]])
The [[Class]] property of the newly constructed object is set to “Array”.
于是乎,可以改写之前的isArray函数以利用这个特性,如下:
function isArray(o) { return Object.prototype.toString.call(o) === '[object Array]'; }
call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)
与前面几个方案不同,这个方法很好的解决了跨frame对象构建的问题,经过测试,各大浏览器兼容性也很好,可以放心使用。一个好消息是,很多框架,比如jQuery、Base2等等,都计划借鉴此方法以实现某些特殊的,比如数组、正则表达式等对象的类型判定,不用我们自己写了。
转自http://www.iteye.com/topic/318821
发表评论
-
HTML特殊字符显示
2011-08-16 21:45 1005有些字符在HTML里有特别的含义,比如小于号<就表示HT ... -
html标签a的target属性的用法
2011-08-02 00:40 10871:如果使用标签<a>来链接到一个页面的话,tar ... -
JavaScript中的函数:函数的apply、call方法和length属性
2011-06-03 13:39 818转:http://www.smallrain.net/stud ... -
JS arguments 属性
2011-06-03 13:38 901arguments 属性 为当前执行的 function 对象 ... -
JS数组方法汇总
2011-03-31 12:18 1038js数组元素的添加和删除一直比较迷惑,抽个时间总结如下:var ... -
选择,分组和引用
2011-03-17 12:59 817正则表达式的语法还包 ... -
javascript 中定义private 方法
2011-03-15 09:49 953出处:http://aoqi1883.blog.163.com ... -
event.returnValue和return false的区别
2011-03-15 09:48 1235<!DOCTYPE html PUBLIC " ... -
JavaScript--execCommand指令集
2011-03-15 09:23 964<HTML> <HEAD> ... -
个性博客-七款超靓天气预报免费代码
2011-03-15 09:12 1012第一种: <iframe src="http: ... -
js判断对象是否是某一类型
2011-03-15 09:05 946<!DOCTYPE html PUBLIC " ... -
常用的DOCUMENT.EXECCOMMAND
2011-03-15 09:04 1043<input type=button value=剪切 ... -
解决IE6中 Div层挡不住Select组件
2011-03-14 09:39 1098/** * 通过使用Ifram,解 ... -
配置文件(fckconfig.js)中主要配置项目如下
2011-02-18 10:59 886FCKConfig.CustomConfigurationsP ... -
[转]疯狂的跨域技术
2011-01-30 15:36 1074JavaScript是一种在Web开发中经常使用的前端动态脚本 ... -
JAVASCRIPT中RegExp.$1是什么意思
2011-01-28 15:02 2194RegExp 是javascript中的一个内置对象。为正则表 ... -
js监听WEB页面关闭事件
2010-12-31 10:54 6393javascript捕获窗口关闭事件有两种方法 onbefor ... -
天气数据调用代码,总结了一下收藏
2010-12-14 12:41 1100转载于:http://blog.csdn.net/ ... -
自动跳转
2010-12-13 15:43 929<meta http-equiv="refre ... -
JavaScript面向对象编程
2010-12-07 23:27 892创建自己的对象 要创 ...
相关推荐
"JavaScript数组用法详解" JavaScript 数组是一种非常重要的数据结构,它是一种可以存储多个元素的集合。 JavaScript 数组的元素可以是任何类型,包括数字、字符串、对象、函数等。数组的长度可以动态地变化,可以...
首先,创建JavaScript数组有两种主要方式:字面量语法和`Array()`构造函数。字面量语法是最简洁的,只需在方括号中用逗号分隔值即可创建数组。例如: ```javascript var empty = []; // 空数组 var primes = [2, 3, ...
1 JavaScript速览:进入JavaScript的世界 阅读 2 编写代码:更进一步 3 函数简介:养成函数思维 4 让数据排排坐:数组 5 理解对象:对象镇之旅 6 与网页交互:了解DOM 7 类型、相等、转换等:系统...
+ 对象类型:包括数组、对象、函数等。 * 数据类型检测:使用 typeof 运算符检测变量的数据类型。 * 数据类型转换:包括转换为字符串类型、数字类型、布尔类型等。 运算符 *比較运算符:包括 ==、!=、===、!== 等...
首先,需要了解的是,JavaScript数组的所有方法都定义在Array.prototype上,这意味着所有数组的实例都可以使用这些方法。Array.prototype本身也是一个数组,它包含了数组的原型方法。 1. concat方法 concat方法用于...
《Effective JavaScript:编写高质量JavaScript代码的68个有效方法》是David Herman撰写的一本JavaScript编程指南,该书基于作者在Ecma的JavaScript标准化委员会的工作经验,深入探讨了JavaScript的内部工作机制、...
3. **数组和集合**:学习JavaScript中的数组操作,如map、filter、reduce等高阶函数的运用,以及Set和Map等ES6新增集合类型的使用。 4. **函数**:理解闭包、作用域和this的关键概念,学习箭头函数的语法和特性。 5....
首先,创建JavaScript数组有两种主要方式:数组构造函数和数组字面量。例如: ```javascript var arr = new Array(20); // 创建一个长度为20的数组,但不包含任何元素 var arr1 = ["小伞", 1, true, undefined, [2, ...
JavaScript数组的一个显著特点是其成员可以是任何类型。这意味着同一个数组可以包含数字、字符串、对象甚至是其他数组。例如: ```javascript var o = [42, "Sample Text", {x:88}]; ``` 在这个例子中,数组`o`...
3. 函数:函数是JavaScript中可重用的代码块,可以接受参数并返回值。理解函数声明、函数表达式、箭头函数的区别及其用法,对于编写高效代码至关重要。 4. 对象与属性:JavaScript的对象是由键值对组成的,可以用来...
本资料《JavaScript对象与数组参考大全》将深入探讨这两个重要的数据结构,帮助开发者更好地理解和运用它们。 对象在JavaScript中是一种复杂的数据结构,它们是键值对的集合,键可以是字符串或者符号,而值可以是...
二、JavaScript数组 1. 数组定义:数组是有序的数据集合,使用方括号 `[]` 定义,元素之间用逗号 `,` 分隔,如:`[element1, element2, ...]`。 2. 长度:数组的长度可通过 `.length` 属性获取,如 `array.length`。...
1. **模块化和可复用的代码**:通过将函数作为值,可以创建可重用的函数库,比如用于排序数组的自定义比较函数: ```javascript var myarray = [6, 7, 9, 1, -1]; myarray.sort(function(a, b) { return a - b; })...
编写一个函数,将数组 `arrs` 中的所有数字乘以 5,并返回新的数组。 **示例**: ```javascript let arrs = ['a', 'c', 6, 'e', 5, 3, 'd']; console.log(multiplyByFive(arrs)); // 输出 [30, 25, 15] ``` **实现...
总的来说,理解和熟练运用这些数据类型检测方法,能够帮助开发者编写更可靠的JavaScript代码,避免因类型错误导致的程序异常。在进行类型检查时,应根据具体情况选择合适的方法,以确保代码的稳定性和可维护性。
在实际项目中,根据需求选择合适的数组类型是非常重要的。 总的来说,理解并熟练使用Unity3D中的Array数组类对于编写高效、灵活的游戏脚本至关重要。无论是存储游戏对象、管理玩家分数还是处理其他游戏逻辑,数组都...
例如,你可能需要编写一个函数来计算两个数的加法,或者创建一个循环来遍历数组并进行特定操作。通过这些实践,你能更好地理解JavaScript的运行机制。 总的来说,"JavaScript第四章的答案"涵盖了从基本语法到高级...
Array对象可以用来创建各种类型的数组,无论是空数组、预设长度的数组还是包含特定元素的数组。以下是对Array对象的详细说明: 1. 创建Array对象: - 空数组:`var arr1 = new Array();` 或 `var arr1 = [];` - ...
这种方法基于`indexOf()`函数来检测数组中的元素是否已经存在。`indexOf()`返回指定元素在数组中首次出现的位置,如果未找到则返回-1。以下是具体步骤: 1. 创建一个新的空数组`new_arr`,用于存放去重后的元素。 2...