Javascript Javascript 每日测试 - 第一期 2

天气越发炎热,中午搞个小测试给大家提神还是不错的。这次是 玉伯 兄弟出的题目:

请确认下述语句

alert(String.indexOf);
delete String.indexOf;
alert(String.indexOf);     
alert(String.length);    
String.prototype = null;
delete String.split;
delete String.prototype;
alert(String.prototype.split);
alert(String.split);

每个 alert 都会输出什么?

粗看这道题目考的是 prototype 原型以及 delete 操作符的用法,于是很快就写出了答案

alert(String.indexOf);  => function () {...}
...
alert(String.indexOf);   => undefined
...
alert(String.prototype.split); => function () {...}
alert(String.split); => undeinfed

有关 delete 操作符的描述,可以参见 Mozilla 的相关文档

ECMAScript 为元素的属性定义了 4 种特性,它们分别是 ReadOnly、DontEnum、DontDelete、Internal ,这在平时用户级别的 Javascript 是无法更改的(来源)。(但 undefined 和 NaN 却是可读写的,这个是有点莫名其妙 -- form 小马)。

回到上面的问题,对于

alert(String.length);

输出 1 (不好意思作弊了)这个现象非常难以理解。小马 同学(再次感谢)做出了如下的解释,整理如下:

String 事实上是一个 function,是个所谓的构造器函数,可
用 typeof String 来验证。那么 function 的 length 属性,
它的值就是这个构造器函数在声明时的参数的数量。

详细可以参考这里。那么这样就很容易理解 alert(String.length) 为什么是 1 了 -- 因为它就提供了一个参数(来源)。

--EOF--

这里是《Javascript 每日测试 - 第一期》的 永久连接(Permalink),欢迎您 留言 或发送 Trackback。您也可以查看此篇文章的 Wap 版本(适用于移动设备)。 最后,如果您对本站的内容感兴趣,欢迎您 订阅本站
欢迎您留言

请输入您的称呼

请输入您的电子邮件

请您输入留言内容