也谈谈Javascript中的几个"怪异"特性(上)

Andy Croxall在Ten Oddities And Secrets About JavaScript罗列了他认为的10个javascript怪异特性。纵观全文,其实有些特性也并不那么“怪异”。对于原文我不做翻译,就顺着文章谈一下本身的理解吧,但愿对读者有所帮助。javascript


也谈谈Javascript中的几个怪异特性(上) - nomospace(挪墨) - Nomospacehtml

 


1. Null is an Object(Null是一个Object)java


1正则表达式

alert(typeof null); //'object'数组


undefined表明无值的基本类型,null表明无值的引用类型。基本数据类型(number string boolean等等)是引用数据类型的子类(undefined是null的子类)。建议深刻阅读理解Javascript_02_理解undefined和null。函数


1学习

alert(null instanceof Object); //falsespa


instanceof检测对象a是否是对象b的实例的原理是:检测对象b的prototype指向的对象是否在对象a的[[prototype]]链上,若在则返回true。因为null无值,不属于任何对象,故返回false,具体可参考Javascript Object Layout关系图。prototype



2. NaN is a Number(NaN是一个Number)翻译


1

alert(typeof NaN); //'Number'

2

alert(NaN === NaN); //false


根据MDC:The value of Number.NaN is Not-A-Number, same as the value of global object's NaN property. 也就是说NaN是Number的一个属性,也是全局对象中的一个属性,Number.NaN与NaN是同样的。NaN与任何一个数字不相等,而且与NaN自己也不相等。



3. An Array With No Keys == False (空数组等于false)


1

alert(new Array() == false); //true


new Array()的返回值为[],原表达式至关于[]==false,这个值为true,具体演变过程见圆心的类型转换的小乐趣。若是可以理解其中转化的奥妙,如下几段代码的执行结果也都不难解释。


1

var someVar = 0;

2

alert(someVar == false); //true


1

var someVar = []; //空数组

2

alert(someVar == false); //true

3

if (someVar) alert('hello'); //alert会执行, someVar会被计算为true值


1

var someVar = 0;

2

alert(someVar == false); //true

3

alert(someVar === false); //false


顺便说一句,Array长度的最大值为4,294,967,295即2^32-1(The maximum length allowed for an array is 4,294,967,295.)

关于类型转化,推荐扩展阅读:Twisted logic: understanding truthy & falsy



4. replace() Can Accept a Callback Function(replace函数可接受一个回调函数)


通常咱们会这么使用replace函数:

1

alert('10 13 21 48 52'.replace(/\d+/g, '*')); //用*来replace全部的数字

实际上,正如标题所言,replace后面接受一个Callback来进行一些额外的操做:


1

alert('10 13 21 48 52'.replace(/\d+/g, function(match) {

2

    return parseInt(match) < 30 ? '*' : match;

3

}))//* * * 48 52


对于每一个匹配的数字进行一次三元表达式的操做。



5. Regular Expressions: More Than Just Match and Replace(关于正则表达式,不单单只有match和replace函数)


除了match和replace函数之外,还可使用test函数,调用方式以下:


1

alert(/\w{3,}/.test('Hello')); //alerts 'true'


以及RegExp对象,具体用法见文档。


关于正则的学习资料我推荐精通正则表达式。若是不是做科研,熟读前半本就好了。正则表达式30分钟入门教程也不错,常备案头温故知新。

相关文章
相关标签/搜索