天气越发炎热,中午搞个小测试给大家提神还是不错的。这次是 玉伯 兄弟出的题目:
请确认下述语句
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--
留言测试一下,用于记录当前留言代理地址的 IP
对于Object.length,IE下的各个版本都为0,而其他浏览器则为1。对于Error.length,Firefox为3,IE和其他浏览器则为1。并且Firefox支持的RangeError同样也为3。