这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
1,真正的数组的判断方法 javascript 中最简单的声明数组方法为: var a = []; 判断是否为数组的最直接的方法为:
这篇文章主要介绍了从 javascript 判断一个对象是否为数组中学习 js 语法, 需要的朋友可以参考下
- a instanceof Array //true
- a .constructor == Array //true
这里涉及到一个 instanceof 语法,instanceof 是一个云算符,与 "+-*/" 一样,它的语法如下: result = obj intanceof class 是用来判断一个对象是否是某个 class 的一个实例,运算结果返回 true 或者 false。javascript 中 class 的定义又是通过构造函数进行初始化的,所以 instanceof 语法的右操作符 class 一定是 Function 的实例,即 class instanceof Function 一定为 true,而且如果使用 instanceof 时右操作符不是 Function,就会抛出 TypeError 异常。所有对象都是 Object 的实例,所以任何对象 instanceof Object 都返回 true。虽然我们说对象都是通过构造函数进行初始化的,但是 instanceof 却不是通过检查对象是否由该函数构造的,而是通过是否由构造函数的 prototype 继承来的,下面这个例子可以说明这个问题:
- function Range(low, high) {
- this.low = low;
- this.high = high;
- }
- Range.prototype.constructor == Range; //true
- Range.prototype = {
- include: function(x) {
- return (x >= this.low && x <= this.high);
- },
- exclude: function(x) {
- return (x < this.low && x > this.high);
- }
- }
- var r = new Range(0, 100);
- r instanceof Range; //false
- r instanceof Object; //true
- Range.prototype.constructor == Objecct; //true
这里虽然 r 是通过 new Range 构造的,但是 r 却并不是 Range 的实例,这就是问题所在,Range.prototype 赋值语句覆盖了默认的构造函数,没对 prototype 赋值之前 Range.prototype.constructor 为 Range,赋值之后变成了 Object,这也好理解,因为
- Range.prototype = {
- include: function(x) {
- return (x >= this.low && x <= this.high);
- },
- exclude: function(x) {
- return (x < this.low && x > this.high);
- }
- }
其实等价于:
- Range.prototype = new Object({
- include: function(x) {
- return (x >= this.low && x <= this.high);
- },
- exclude: function(x) {
- return (x < this.low && x > this.high);
- }
- });
所以 Range.prototype.constructor == Object,那么通过 new Range 创建出来的实例当然就是 Object 的一个实例了。 看官方解释更直接些: The instanceof operator does not actually check whether r was initialized by the Range constructor. It checks whether it inherits from Range.prototype. javascript 中还有一个函数 typeof 具有与 instanceof 类似的功能,但是它返回的是具体的基本数据类型:number,string,function,object,undefined,boolean,只有这六种,不在这六种范围内的都返回 object,也就是说 typeof([]) 返回的是 object,而不是 array。 另一个涉及到的语法是 constructor,constructor 返回对象的构造函数:
- var a = [];
- a.constructor; //Array
构造函数是一个对象的初始化函数,采用 new 调用,如果对象是一个 Array,那么其 constructor 应该就是 Array,自己写的类就不一定了,因为可能会吧 prototype 中的 constructor 更改掉。 2,伪数组的判断方法 javascript 中有一种伪数组,它可以使用类似于 Array 的遍历方法进行遍历,有 length 属性获取元素的长度,可以使用 [] 下标来获取指定的元素,这种对象我们称之为伪数组,JQuery 中的对象就是典型的伪数组,如下图:
所以判断是否是伪数组的关键就是判断是否有 length 属性,是否存在基本的数组操作函数 splice,下面就是判断方法:
- var is_array = function(value) {
- return value &&
- typeof value === 'object' &&
- typeof value.length === 'number' &&
- typeof value.splice === 'function' &&
- !(value.propertyIsEnumerable('length'));
- };
这里 propertyIsEnumerable 就是用来判断 length 属性是否可列举,其实原生的 String 对象也是有类似 Array 的效果,但是我们不能把它当作 Array 对象,所以这里需要判断 typeof value == "object",因为 typeof 一个 String 对象,返回的是 string。
来源: http://www.phperz.com/article/17/0627/275981.html