有关JavaScript的10个怪癖和秘密分享

原文作者:Andy Croxall
原文链接:Ten Oddities And Secrets About JavaScript
翻译编辑:张鑫旭 

数据类型和定义

  1. Null是个对象
  JavaScript众多类型中有个Null类型,它有个唯一的值null, 即它的字面量,定义为完全没有任何意义的值。其表现得像个对象,如下检测代码:

复制代码 代码如下:

alert(typeof null); //弹出 'object'

如下截图:

  尽管typeof值显示是"object",但null并不认为是一个对象实例。要知道,JavaScript中的值都是对象实例,每个数值都是Number对象,每个对象都是Object对象。因为null是没有值的,所以,很明显,null不是任何东西的实例。因此,下面的值等于false。

复制代码 代码如下:

alert(null instanceof Object); //为 false

  译者注:null还有被理解为对象占位符一说

2. NaN是个数值
  NaN本意是表示某个值不是数值,但是其本身却又是数值,且不等于其自身,很奇怪吧,看下面的代码:
复制代码 代码如下:

alert(typeof NaN); //弹出 'Number'
alert(NaN === NaN); //为 false

结果如下截图:

实际上NaN不等于任何东西。要确认某玩意是不是NaN只能使用isNaN.
3. 无关键字的数组等同于false(关于Truthy和Falsy)
  下面是JavaScript另一个极品怪癖:

复制代码 代码如下:

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

结果如下截图:

  想要知道这里发生了什么,你需要理解truthy和falsy这个概念。它们是一种true/flase字面量。在JavaScript中,所有的非Boolean型值都会内置一个boolean标志,当这个值被要求有boolean行为的时候,这个内置布尔值就会出现,例如当你要跟Boolean型值比对的时候。

  因为苹果不能和梨做比较,所以当JavaScript两个不同类型的值要求做比较的时候,它首先会将其弱化成相同的类型。false, undefined, null, 0, "", NaN都弱化成false。这种强制转化并不是一直存在的,只有当作为表达式使用的时候。看下面这个简单的例子:

复制代码 代码如下:

var someVar =0;
alert(someVar == false); //显示 true

结果如下截图:

  上面测试中,我们试图将数值0和boolean值false做比较,因两者的数据类型不兼容,JavaScript自动强制转换成统一的等同的truthy和falsy,其中0等同于false(正如上面所提及的)。

  你可能注意到了,上面一些等同false的值中并没有空数组。只因空数组是个怪胚子:其本身实际上属于truthy,但是当空数组与Boolean型做比较的时候,其行为表现又属于falsy。不解?这是由原因的。先举个例子验证下空数组的奇怪脾气:

复制代码 代码如下:

var someVar = []; //空数组
alert(someVar == false); //结果 true
if (someVar) alert('hello'); //alert语句执行, 所以someVar当作true

结果如下截图,连续弹出两个框框:

  译者注:之所以会有这种差异,根据作者的说法,数组内置toString()方法,例如直接alert的时候,会以join(“,”)的形式弹出字符串,空数组自然就是空字符串,于是等同false。具体可参见作者另外一篇文章,《Twisted logic: understanding truthy & falsy》。不过我个人奇怪的是,像空对象,空函数,弱等于true或者false的时候都显示false,为何?真的因为数组是个怪胎,需要特殊考虑吗?

  为避免强制转换在比较方面的问题,你可以使用强等于(===)代替弱等于(==)。

复制代码 代码如下:

var someVar = 0;
alert(someVar == false); //结果 true

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
一个合作伙伴的页面效果,鼠标放到 图片上要变成彩色,本来就是一个简单的换色效果,但问题是,图片的高度和宽度不是一样大的。 这就比较麻烦了。如果把图片放到背景里就要一个一个的去定义图片外面的容器a/a,要多写很多层叠样式,太麻烦,最后我决定,把图片的高度的一一半,和图片的宽度赋值给它外面的容器a/a 然后把图片做了如下处理: 当鼠标移动到图片上让他向上移动30个像素,移开则回到原位。 html代码如下: 复制代码 代码如下: !--partner_box-- div class="partner_box"
方法说明: 结束响应,告诉客户端所有消息已经发送。当所有要返回的内容发送完毕时,该函数必须被调用一次。 如何不调用该函数,客户端将永远处于等待状态。 语法: 复制代码 代码如下: response.end([data], [encoding]) 接收参数: data end()执行完毕后要输出的字符,如果指定了 data 的值,那就意味着在执行完 response.end() 之后,会接着执行一条 response.write(data , encoding); encoding 对应data的字符编码
我们大多数人都使用过JavaScript,近年来随着各种JavaScript框架的流行使得JavaScript变得更加神奇和容易。"Anonymous (匿名)函数?不知道那是什么但是看起来和自己所写的差不多。” 你可能并不知道可以传给 new Function() 一个字符串作为函数的body来构造一个 JavaScript函数。编程中并不经常用到,但有时候应该是很有用的. 下面是 new Function 的基本用法: 复制代码 代码如下: // 最后一个参数是函数的 body(函数体),类型为 st
setAdminTabs.js代码中添加如下: 复制代码 代码如下: $("#adminTabs li").mouseover(function(){$(this).addClass("selectedTab")}); 始终不起作用,原因如下: 复制代码 代码如下: .selectedTab{background-color:White; border-bottom:1px} 定义两个属性,在admin.css的文件中存在,如下: 复制代码 代码如下: #adminTabs ul li{ float:lef
前台: 复制代码 代码如下: function SelectProject() { var a = new Array; var r = window.showModalDialog('SelProject.aspx', a, "dialogWidth=1000px; dialogHeight=600px; resizable: yes"); if (typeof (r) != 'undefined') { var arr = r.split(";"); $("#hidProjectInnerID").va
HTML处理 stripTags | escapeHTML | unescapeHTML JSON处理 unfilterJSON | isJSON | evalJSON | parseJSON 脚本处理 stripScripts | extractScripts | evalScripts 现在,String部分转入具体的关联应用,分别对应 HTML字符串,JSON字符串和HTML中的脚本字符串。 【乱入一句,有关JSON的一点东西,可以看看http://www.cnblogs.com/TomXu/arc
本文实例讲述了使用jQueryMobile实现滑动翻页效果的方法。分享给大家供大家参考。具体分析如下: jQuery Mobile是jQuery 在手机上和平板设备上的版本。jQuery Mobile 不仅会给主流移动平台带来jQuery核心库,而且会发布一个完整统一的jQuery移动UI框架。支持全球主流的移动平台。就是能够迅速能把页面写成APP的界面,让用户浏览网页,相当于在使用布局好的app一样。 首先要在jQueryMobile( 点击此处本站下载 )下载一个压缩包,然后把这个压缩包的所有内容拉到
随机抽取,简单代码。 复制代码 代码如下: html title随机抽奖程序/title headmeta http-equiv=Content-Type content="text/html; charset=gb2312" /head body script type="text/javascript" var alldata = "a,b,c,d,e" var alldataarr = alldata.split(","); var num = alldataarr.length-1 ; var t
解决方法: 网上的答案经我验证都是不靠谱的,以后大家就知道了,Flexigrid在IE下不显示数据的处理方法是:指定一下Ajax请求数据的方式为Get方式 另外,flexigrid不是不可以使用“post”方式发送数据,而是“post”方式在IE下必须要有供post的数据,比如在分页的时候可以使用post方式,而在你没有什么数据要发送的话,一定要使用“get”方式,其它浏览器可能对这个要求不严格,而IE要求较严:

javascript整除实现代码 - 2015-05-01 11:05:03

复制代码 代码如下: //整除 function Div(exp1, exp2) { var n1 = Math.round(exp1); //四舍五入 var n2 = Math.round(exp2); //四舍五入 var rslt = n1 / n2; //除 if (rslt = 0) { rslt = Math.floor(rslt); //返回值为小于等于其数值参数的最大整数值。 } else { rslt = Math.ceil(rslt); //返回值为大于等于其数字参数的最小整数。 }