// @param s为字符串,n为数字 function fn(obj){ //转换为String类型 var s = obj +""; //转换为number类型 var n = +obj; }
分享一个面试例子:
//加会将其后面自动转换成字符串 "64"+4="644" //减会将其自动转换成数字 "64"-4=60
2.bool类型转换
!!obj,将其强制转换为bool类型
alert(!!0) //结果为false alert(!!"33dd") //结果为true
!obj,取相反的bool类型
alert(!0) //结果为true alert(!"222333") //结果为false
3.=== 与 ==区别
=== 是严格相等,不会进行类型转换,而 == 是不严格相等,会进行类型转换。
有些js的书中,建议开发人员永远不要用 == 或者 != 。
但是jquery源码中,有用到“==”或者“!=”的情况 —— 判断 undefined 和 null 的时候(undefined == null为true)。
//这里的判断,将obj是null,obj是undefined都排除在外了 if(obj != null){ }
4.检测obj是否为window对象
//null == window.null为true function isWindow(obj){ return obj != null && obj == window.obj; }
5.|| 与 && 用法技巧
//例 var aa=5; name = aa || {} ; alert(name) 则name为55 this.name = name || {} //如果name值存在,则值为name,反之为{} //例 var aa=5; name = aa && {} ; alert(name) 则name为{}, 因为aa为5,不为0则为真 this.name = bool && [] //如果bool为true,则值为[],反之则为bool
经典实例:
( window.foo || ( window.foo = "bar" ) ); alert(window.foo); //弹出 bar // 为什么最后的结果是bar呢,其实可以看成是 undefined || bar 出来的结果肯定是bar
6.setTimeout(fn,0)与setTimeout(fn)区别(此处有问题,没有考虑单线程的问题,请比较了解的大神,帮忙指点)
setTimeout(fn,0)与setTimeout(fn)都是延迟执行,但是setTimeout(fn)比setTimeout(fn,0)延迟时间还要长,例
function fn(){ var data = new Date(); for(var i=0;i<=1000;i++){ if(i==1000){ console.log("fn="+data.getTime()); } } } function fn1(){ var data = new Date(); for(var i=0;i<=1000;i++){ if(i==1000){ console.log("fn1="+data.getTime()); } } } setTimeout(fn,0), setTimeout(fn1);
结果:
7.判断是否为数值
function isNumeric(obj){ return !isNaN(parseFloat(obj)) && isFinite(obj); }
8.判断是否为空对象
function isEmptyObject(){ var name; //遍历不是空对象返回 for (name in obj) { return false; } return true; }
9.检测对象类型
检 测obj对象类型,返回类型,通过Object.prototype.toString()来判断类型,但是ie低版本兼容性有问题,
因此采用 {}.toString来监测,返回为[object Array],[object Object],[object Function]
// 类型判断 function isType(type){ return function(o){ return Object.prototype.toString.call(o) === '[object ' + type + ']'; } } var isString = isType(“String”); var isObject = isType("Object"); var isArray = isType("Array"); isString("I'm Barret Lee."); isArray([1,2,3]); isObject({});
10.jquery里的去除空格trim妙用
//相当于if (String.prototype.trim && “\uFEFF\xA0″.trim() !== “”) 高级的浏览器已经支持原生的String的trim方法,但是pFan还为了避免它没法解析全角空白, 所以加多了一个判断:”\uFEFF\xA0″.trim() !== “” vart core_version = "1.0",core_trim = core_version.trim; function trim(){ core_trim && !core_trim.call("\uFEFF\xA0") ? function (text) { return text == null ? "" : core_trim.call(text); //这里按我的理解应该为" ".trim.call(text),有点不明白转换为"1.1.0".trim.call(text) } : // 高级的浏览器已经支持原生的String的trim方法,如果浏览器不支持则采用 function (text) { var whitespace = "[\\x20\\t\\r\\n\\f]", rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"); return text == null ? "" : (text + "").replace(rtrim, ""); }, //nodeName函数是获取dom节点的节点名字或者判断其名字跟传入参数是否匹配 nodeName: function(elem,name){ //IE下,DOM节点的nodeName是大写的,例如DIV return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); } }
11.jquery中检测数组或者类数组中是否含存在传入的值
/** 检查数组中是否存在传入的值,如果存在就返回值所在的位置,如果不存在就返回-1。 *elem 规定需检索的值。 *arr 数组 *i 可选的整数参数。规定在数组中开始检索的位置。它的合法取值是 0 到 arr.length - 1。 如省略该参数,则将从数组首元素开始检索。 */ function inArray(elem, arr, i){ var len; if (arr) { //如果浏览器支持Array拥有indexOf方法 if ([].indexOf) { return [].indexOf.call(arr, elem, i); } len = arr.length; //当i为负数的时候,从数组后边len+i的位置开始索引 //理解这个分成两个部分i = i ? (i < 0 ? Math.max(0, len + i) : i) : 0;,i=i为true ,执行(i < 0 ? Math.max(0, len + i) : i),反正执行i=0 i = i ? i < 0 ? Math.max(0, len + i) : i : 0; for (; i < len; i++) { //双重检测防止类似这样的数组ar=[];ar[1]=1;ar[0]=undefined;0 in ar =false;a[0]===undefined; // 0 in arr => arr[0]是否存在 'nme' in arr => arr['nme']是否存在 if (i in arr && arr[i] === elem) { return i; } } } return -1; }