类数组
类数组的特点:
1.可以利用属性名来模拟数组的特性
2.可以动态的执行length的属性
3.如果强行让类数组调用push方法,则会根据length属性值的位置进行属性的扩充
在函数中实参列表—arguments,就是一个类数组。类数组的三个组成部分:
1.属性要为索引(数字)属性
2.必须有length属性
3.最好加上push方法
示例:
var obj = {
"0" : "a", //属性为索引(数字)属性
"1" : "b",
"2" : "c",
"length" : 3, //有length属性(yi'di)
push :Array.prototype.push, //加上push方法
}
此时打印结果由{}包裹,仍为一个对象,现在我们加上splice属性将其变成类数组:
var obj = {
"0" : "a",
"1" : "b",
"2" : "c",
"length" : 3,
push : Array.prototype.push,
splice : Array.prototype.splice,
}
此时打印结果由[]包裹,形式上和数组是一样的。
- 类数组的内部原理:
Array.prototype.push = function(target){
this[this.length] = target;
this.length ++;
}
例题:
var执行后的打印结果是什么?
var obj = {
"2" : "a",
"3" : "b",
"length" : 2,
push :Array.prototype.push,
}
obj.push('c');
obj.push('d');
结果;
//var obj = {
2 : "c",
3 : "d",
length : 4
}
解析:
Array.prototype.push = function(target){
obj[obj.length] = target;
obj.length ++;
}
//首先length = 2,给"2"位添加"c"
//其次length ++
//再length = 3,给"3"位添加"d"
//而length++了两次,从2变成了4
例题:
var执行后的打印结果是什么?
var obj = {
"1" : "a",
"2" : "c",
"3" : "d",
"length" : 3,
push :Array.prototype.push,
}
obj.push('b');
结果:
//var obj = {
"1" : "a",
"2" : "c",
"3" : "b",
length : 4
}
解析:
Array.prototype.push = function(target){
obj[obj.length] = target;
obj.length ++;
}
练习题:
给你一个数值,请你判断它是什么类型的?
代码:
<script type = "text/javascript">
function type{
var template = {
"[object Array]" : "array",
"[object Object]" : "object",
"[object Number]" : "number-object",
"[object Boolean]" : 'boolean-object',
"[object String]" : 'string-object',
}
if(target === null) {
return "null";
}
if(typeof(target) == 'function') {
return 'function';
}else if(typeof(target) == 'object') {
var str = Object.prototype.toString.call(target); //调用了Object.prototype.toString()的方法,这个方法的本意是转换成字符串,对于一个对象使用时,可以转换成对象对应的类型
return template[str];
}else{
return typeof(target);
}
}
</script>