参考
<script>
function listArg2() {
alert(arguments.constructor); // Object
alert(Array.prototype.slice.call(arguments).constructor); // Array
}listArg2("a", "b", "cd");</script>
<script>
function listArg2() {
alert(arguments.constructor); // Object
alert(Array.prototype.slice.call(arguments).constructor); // Array
}listArg2("a", "b", "cd");</script>
function listArg2() {
var str="1,2,3";
for(var arg in str) {
document.write(arg + ", ");
}
}listArg2()
</script> 很简单的一个就不能用
for(var i in Array){
alert(Array[i]);
}
但用户自定义属性可以被列举
//demo1
Array.a=1;
Array.b=2
Array.c=3;
for(var i in Array){
alert(Array[i]);
}//demo 2
var obj={};
obj.name="obj";
obj.a=function(){alert("here")};for(var i in obj){
alert(obj[i]);
}//demo 3 除了1,2,3你不能列举出join,push,pop这些系统方法
var a=[1,2,3];
for(var i in a){
alert(a[i]);
}
所以想先写个不能被for in的对象不可能实现能被列举是因为调用Array.prototype.slice后将arguments的值赋值给了一普通数组
两者不是以回事
function listArg2() {
//a与arguments 不是同一个对象
var a=Array.prototype.slice.call(arguments)
alert(arguments);
alert(a);
}listArg2("a", "b", "cd");
用数组的都报错.
arguments是数组
Array.prototype.slice.call(arguments)只是把数给变成对象而已,没什么复杂的.
function listArg2() {
var arr = Array.prototype.slice.call(arguments);//把arguments转成数组
for(var arg in arr) {
document.write(arr[arg] + ", ");
}
}listArg2("a", "b", "cd");不过这里巧合arguments[arg] == arr[arg]而已
function b(){
document.write(Array.prototype.slice.call(arguments))
}
b(a); ff和ie都显示a,v,d,a,e
var a="a,v,d,a,e"
function b(){
document.write(Array.prototype.slice.call(a))
}
b(); ie显示为,,,,,,,, ff显示为a,,,v,,,d,,,a,,,e
这样有点好奇怪
function b(){
document.write(Array.prototype.slice.call(arguments))
}
b(a);这个是直接输出a传递过来的值至于用在字符串的情况还真不清楚
更正一下,以免误人啊
for in 又能用于对象,又能用于数组
Array.prototype.slice.call(arguments)只是把对象数给变成数组而已;
不能用
aa = arguments;这个也会报错,因为你用的还是同一个对象,
系统对象不能被列举.xingqiliudehuanghun是对的..
弄清楚一点了由于字符串有length所以Array.prototype.slice.call(a)确实能返回length个元素的数组
但由于在ie中字符串不能用a[0]这种方法取值所以返回的是“length个值为空的元素的数组”
而ff是可以a[0]这样取值的所以元素就有值了
其实是数组
["a",",","v",",","d",",","a",",","e"]
var a = {}a[0] = "a";
a[1] = "b";
a[2] = "c";a.length = 3;var arr=Array.prototype.slice.call(a);document.write(arr);我想
可以用length属性来说明元素个数
[索引]来说明元素值
的结构就可以用Array.prototype.slice转换成数组
我给你的例子能用for in??
汗!那你运行看看能出结果不
Prototype有自己的$A 不过没有用这个方法, 不知道为什么?
function $A(iterable) {
if (!iterable) return [];
if (iterable.toArray) return iterable.toArray();
var length = iterable.length, results = new Array(length);
while (length--) results[length] = iterable[length];
return results;
}
我想
1是写Prototype那时候还不知道或不清楚这个方法所以没使用
2是这个方法本身有什么缺陷我没发现
var a = {}a[0] = "a";
a[1] = "b";
a[2] = "c";a.length = 3;var arr=Array.prototype.join.call(a);
document.write(arr);
这个确实能运行
不过是在ff引用winter别不相信,下面的代码在ie系列中会导致内存泄露var s=”lalala”;
alert(s.length);
s本身是一个string而非object,它没有length属性,所以当访问length时,JS引擎会自动创建一个临时String对象封装s,而这个对象一定会泄露。
这个bug匪夷所思,所幸解决起来相当容易,记得所有值类型做.运算之前先显式转换一下:
var s="lalala";
alert(new String(s).length);
join返回的是字符串不是数组了
var a={name:"蓝色",age:10}; a[0] = "a";
a[1] = "b";
a[2] = "c";
a[7]="aqq"
a.length =88;var arr=Array.prototype.slice.call(a);alert(arr);这样就不行了