对象和数组
利用Object()
方法来判断一个变量是否为对象:
如果Object
方法的参数是一个对象,它总是返回该对象,即不用转换。这一点可以用来判断变量是都是对象。
var obj = {};
var isObject = obj === Object(obj);
利用Object.prototype.toString()
方法判断变量类型
toString
方法返回变量的类型字符串,可以用来判断变量类型。由于数组、字符串、函数、Date等对象(构造函数)都自定义了自己的toString
方法,所以要使用Object.prototype.toString()
:
Object.prototype.toString.call(2); // "[object Number]"
Object.prototype.toString.call(''); // "[object String]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(Math); // "[object Math]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"
这个方法比typeof
更准确,例如:
typeof []; //'object'
利用Array.isArray()
判断变量是否为数组
同样的,这个方法也可以弥补typeof
的不足:
typeof []; // 'object'
Array.isArray([]); // true
关于数组的实例方法concat()
“如果数组成员包括对象,concat方法返回当前数组的一个浅拷贝。所谓“浅拷贝”,指的是新数组拷贝的是对象的引用。”
https://wangdoc.com/javascript/stdlib/array.html
确切的意思是,如果数组成员包括对象,concat
方法返回的新数组中,对象成员是原数组对象成员的引用:
var arr = [1, 2, {a: 3}];
var arr1 = arr.concat(4); // [1, 2, {a: 3}, 4]
console.log(arr1[2]); // {a: 3}
arr1[2].a = 5;
console.log(arr[2]); // {a: 5}
会改变原数组的方法
pop
push
shift
unshift
reverse
splice
, sort
slice方法
1、不传参数时,会返回原数组的拷贝
[1, 2, 3].slice(); // 返回原数组的拷贝 [1, 2, 3]
同样的,对于包含对象成员的数组,返回的新数组中的对象仍然是原数组的浅拷贝,也就是引用。
2、可以将类数组对象转换成整整的数组
var arrLikeObj = { 0: 1, 1: 2, length: 2};
Array.prototype.slice.call(arrLikeObj); // [1, 2]
类数组对象,就是具有数字类型的键值,又具有length
属性的对象。
利用splice
方法插入新元素
splice
方法的第二个参数是0
时,表示只插入新元素,不删除任何元素:
var arr = [1, 2, 3];
arr.splice(0, 0, 0);
console.log(arr); // [0, 1, 2, 3]