一、伪数组转数组:
- 具有length属性;
- 按索引方式存储数据;
- 不具有数组的push()、pop()等方法;
伪数组无法直接调用数组方法或期望length属性有什么特殊的行为,不具有数组的push()、pop()等方法,但仍可以对真正数组遍历方法来遍历它们。常见的伪数组:function内的arguments对象,还有像调用getElementsByTagName, getElementsByClassName,document.childNodes之类的,它们都返回的NodeList对象都属于伪数组,也称为类数组,还有自定义的对象,也属于伪数组。
<script>
var arrayLike = {
0: "a",
1: "b",
2: "c",
3: "d",
length: 4
};
// 方法1:借用数组的slice方法
var newarr = Array.prototype.slice.call(arrayLike);
// 方法2
// 和方法一性质一样且方法一效率更高
var newarr = [].slice.call(arrayLike);
// 方法3:使用ES6的Array.from()
var newarr = Array.from(arrayLike)
console.log(arrayLike);
console.log(newarr);
</script>
二、检测是不是数组:
var arr = [1, 2, 3, 4, 5];
//方法1: instanceof操作符
var a= arr instanceof Array //true
//方法2: Array.isArray( )
var b = Array.isArray(arr) //true
//方法3:Object.prototype.toString.call( )
var c = Object.prototype.toString.call(arr) // [Object Array]
方法1:instanceof 操作符的问题在于,假设它只有一个全局作用域,使用instanceof就可以得到满意的结果。如果网页中包含很多框架,那么实际上就存在两个或两个以上不同的全局作用域,从而存在两个以上不同版本的Array构造函数,如果从一个框架像另一个框架传入一个数组,那么传入的数组与第二个框架中原生创建的数组分别具有不同的构造函数。
为了解决这个问题,就有了方法2
方法2:这个方法的目的的是最终确定某个值是不是数组,而不管它是在哪个全局环境中创建的。
缺点是存在兼容性问题。支持Array.isArray() 方法的浏览器有 IE9+、Firefox 4+,Safari 5+ 和 Chrome
方法3:比较好用,很好用