注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

技术行者

时代的车轮在按照摩尔定律滚动。

 
 
 

日志

 
 

关于Javascript – length 怪谈  

2013-12-30 19:52:00|  分类: javascript |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

先来个最普通的例子:


Var str = “aaa”;

Alert(str.length);//output: 3

Var arr = [‘a’,’a’,’a’];

Alert(arr.length);//output:3

 

对于length都熟悉不过了,不就是获取字符串的长度或数组的个数,有什么好说的呢。好了,来个奇怪的:

 

Var a = “aaa”;

Alert(a.toString().length);

Alert(a.toString.length);


一看,都知道第一个输出个3,因为字符串toString()的行为就是返回他的值;

但第二个呢,少了个括号,分析一下 a.toString肯定是返回一个function,但function有length吗?

这是神马代码,肯定出错了吧?!

Function

其实原来是这样的,当调用functionlength时,他返回的是arguments.length

也即时是函数参数个数,所上面第二个结果就是返回0,没有参数,

var fn =function(a,b){},

Alert(fn.length); // output:2

Var fn =function(a,b,c){};

Alert(fn.length); //output :3;


再来一个正常点的,如


Var fn =function(){};

Alert(fn.toString().length);

Fn.toString()的结果为”function\s()\s{\r}”,其中2个空格1个换行,总共15字符。


Arguments.length


function fn(a,b,c){

   arguments[0] = 0;

   arguments[2] = 3;

   arguments[3] = 4;

   arguments[4] = 5;

   console.info(arguments.callee.length);

   arguments.callee.length = 4;

   console.info(arguments.callee.length);

   console.info(arguments.length);

   arguments.length = 10;

   console.info(arguments.length);

}

fn(1,2); //output :3,3,2,10

fn(1);//output :3,3,1,5 

arguments.length是可读写的,会随着后续手动改变arguments的值而变动。

Arguments.callee.length是只读的,声明多少个参数值就等于多少。


String

再看一下对字符串的length:


Var str = “aaa”;

Alert(str.length);//output:3,

Str.length = 1;

Alert(str);//output:aaa

Alert(str.length);//output:3


可见字符串的length属性是只读的(基础知识)


Array


现在都知道数组的length,但如下:

Var arr = [1,2,3];

Alert(arr.length);//output:3

Arr.length = 1;

Alert(arr.toString());//output:[1];

Arr.length = 2;

Alert(arr.toString());//output[1, undefined ],

可见数组的length是可读写的。改变length的大小时会直接影响数组本身


Number

对于数字的呢:


Alert((2).toString().length); //output: 1,


如果再少个括号呢?


Alert((2).toString.length); //output:0,

Alert(new Object(“2”).toString.length); //output:0

Alert(new Object(2).toString.length);//output: 1


为什么不是0呢,原来new Object(2)相当于new Number(2),而NumbertoString函数是有一个参数的,用来进制转换。

总结:

1.当调用function下length时,返回的是arguments.length的值

2.arguments.length是可读写的,会随着后续手动改变arguments的值而变动。

3.arguments.callee.length是只读的,声明多少个参数值就等于多少。

4.String的length属性是只读的(基础知识)

5.Array的length是可读写的。改变length的大小时会直接影响数组本身

6.Number的toString函数是有一个参数的,调用toString.length返回1


(ps纯属无机之谈,标题之所以怪,是觉得这些用法少见呢,无聊总结一下呵呵)

  评论这张
 
阅读(377)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017