内容要点:

一.数组类型

判断它是否为数组通常非常有用。在ES5中,可以使用Array.isArray()函数来做这件事情:

Array.isArray([]); //=>true

Array.isArray({}); //=>false

二.类数组对象

JS数组的有一些特性是其他对象所没有的:

1.当有新的元素添加到列表中时,自动更新length属性。

2.设置length为一个较小值将截断数组。

3.从Array.prototype中继承一些有用的方法。

4.其类属性为"Array".

这些特性让JS数组和常规的对象有明显的区别。但是它们不是定义数组的本质特性。

一种常常完全合理的看法把拥有一个数值length属性和对应非负整数属性的对象看做一种类型的数组。

实践中这些"类数组"对象实际上偶尔出现,虽然不能在它们之上直接调用数组方法或者期望length属性有什么特殊的行为,但仍然可以用针对真正数组遍历的代码来遍历它们。

结论就是很多数组算法针对类数组对象工作得很好,就像针对真正的数组一样。

下面一个函数可以用来检测类数组对象:

//判定o是否是一个类数组对象

//字符串和函数有length属性,但是它们可以用typeof检测将其排除。在客户端JS中,DOM文本节点也可以有length属性,需要用额外判断o.nodeType!=3将其排除

function isArrayLike(o){

if(o &&            //o非null、undefined等

typeof o === "object" &&  //o是对象

isFinite(o.length) &&  //o.length是有限数组

o.length>=0 &&       //o.length为非负数

o.length===Math.floor(o.length) &&  //o.length是整数

o.length<4294967296)       //o.length< 2^23

return true;              // o是类数组对象

else

return false;       //否则它不是

}

三.作为数组的字符串

在ES5中,字符串的行为类似于只读的数组。可以使用charAt()方法来访问单个的字符,还可以使用方括号:

var s = test;

s.charAt(0) //=> "t"

s[1]    //=> "e"   当然,针对字符串的typeof操作符仍然返回 "string",但是如果给Array.isArray()传递字符串,它将返回false。

可索引的字符串的最大的好处就是简单,用方括号代替了charAt()调用,这样更加简洁、可读并且可能更高效。

不仅如此,字符串的行为类似于数组的事实使得通用的数组方法可以应用到字符串上,

例如:

s = "Javascript"

Array.prototype.join.call(s,"")  //=> "J a v a s c r i p t"

Array.prototype.filter.call(s,                     //过滤字符串中的字符

function(x){

return x.match(/[^aeiou]/);            //只匹配非元音字母

}).join("")                                             //=> "Jvsrpt"

《JS权威指南学习总结--7.10 数组类型》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Web VLC 设置 tcp 协议播放

    前言 web 端播放rtsp 流,一般都是采用vlc插件,默认是用 UDP 协议播放,这就会存在丢包的可能性,导致界面会变花,要想不花,需要使用更可靠的TCP协议.关于这两种协议的区别,大家可以自行查 ...

  2. Mac + nginx + lua + luasocket + cjson

    1. Lua // 官方网站 http://www.lua.org/ 下载源码包// 由于配合 nginx 使用, 所以使用 5.1.X 版本 $ .tar.gz $ cd lua- $ make m ...

  3. hdu 5996 dingyeye loves stone(博弈)

    题目链接:hdu 5996 dingyeye loves stone 题意: 给你一棵树,树的每一个节点有a[i]个石子,每个人可以将这个节点的石子移向它的父亲,如果没有合法操作,那么就算输,现在给你 ...

  4. Racket中使用Y组合子

    关于Y组合子,网上已经介绍很多了,其作用主要是解决匿名lambda的递归调用自己. 首先我们来看直观的递归lambda定义, 假设要定义阶乘的lambda表达,C#中需要这么定义 Func<in ...

  5. hdu 1564 Play a game(博弈找规律)

    题目:一个n*n的棋盘,每一次从角落出发,每次移动到相邻的,而且没有经过的格子上. 谁不能操作了谁输. 思路:看起来就跟奇偶性有关 走两步就知道了 #include <iostream> ...

  6. jdk 多版本安装 for mac

    2016年mac上已经安装有jdk1.6的版本  目录在/Library/Java/JavaVirtualMachines/1.6.0.jdk 有时候mac版本跟新会自动删除jdk1.6 所以要去ma ...

  7. 克隆git仓库中的一个分支

    克隆git仓库中的某一个分支,可用如下命令: git clone -b <branch_name> <repo> 如:git clone -b hdcp_ree_tee_dev ...

  8. 阿里云Linux服务器挂载硬盘分区

    查看所有硬盘与分区 fdisk -l 运行命令 fdisk /dev/xvdb 根据提示,依次输入 n p 1    (数字一 不是 L) 回车 回车 w 提示 Syncing disks.时,表示已 ...

  9. 每天学习一点点...css...

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. C#中“类似GridView等控件”的前台显示与后台数据变化之间的关系

    最近用dev的treelist,gridcontrol等控件,这些控件显示数据都需要进行DataTable等数据源的绑定,而经理又要求可以随时更改其中的内容,刚开始总是不断的刷新控件.更新控件的数据源 ...