/**
*
* @authors Benjamin(http://blog.csdn.net/cuew1987)
* @date 2013-11-29 14:04:00
* @content 总结javascript的那些怪癖(trick)
*/
/**
* trick01:NaN是个数值
* NaN:表示某个值不是数值,但其本身又是数值,且不等于其自身
*/
console.log(typeof NaN);//numberconsole.log(NaN == NaN);//falseconsole.log(NaN === NaN);//false
/**
* trick02:Null是个对象
* Null:javascript中的五大基本类型之一,它有个唯一的值null, 即它的字面量,定义为完全没有任何意义的值。null 不是任何对象的实例:
*/
console.log(typeof null);//Objectconsole.log(null instanceof Object);//false
/**
* trick03:undefined
* undefined:undefined并不是
Script中的保留字,尽管它有特殊的意义,并且是唯一的方法确定变量是否未定义,但是它可以定义为变量
*/
var Benjamin;console.log(typeof Benjamin);//undefinedundefined = "My name is Benjamin";console.log(undefined == Benjamin);//true
/**
* trick04:函数可以执行自身
* 情况一:jQuery代码的封装
* 情况二:延迟函数中的应用
*/
//1.0(function($){})(jQuery);//2.0var name = "Benjamin";setTimeout((function(name){ return function(){ console.log(name);//Benjamin }})(name),1000);var name = "Benjamin01";//2.1,此种也是初学者和面试经常遇见的问题var name = "Benjamin";setTimeout(function(){ console.log(name);//Benjamin01},1000);var name = "Benjamin01";
/**
* trick05:隐似类型转换,如:{}+{} = ? or [] + [] = ?
*/
console.log({} + {});//[object Object][object Object]console.log({ "name":"Benjamin"}+{ "age":20});//[object Object][object Object]console.log([] + {}); //[object Object]console.log({} + []); //[object Object]console.log([] + []); //空字符串
说到类型转换,下面来看看那些最根本的东东,ECMASCRIPT 5.1中的类型转换和测试:
详细见博文:javascript中的那些类型转换
/**
* trick06:等号(==)和不等号(!=)
*/
console.log(0 == false);//trueconsole.log(1 == true );//trueconsole.log(2 == true );//falseconsole.log("0" == false);//trueconsole.log("1" == true );//trueconsole.log("2" == true );//falseconsole.log("" == 0 );//trueconsole.log("" == false);//trueconsole.log(" " == 0 ); //trueconsole.log(" " == false); //trueconsole.log("n 123 t" == 123 ); //true
/**
* trick07:没有使用var定义的变量名会自动创建全集变量
*/
function Benjamin(){ Ben = "Benjamin";}Benjamin();console.log(Ben);//"Benjamin"function Benjamin(){ var Ben = "Benjamin";}Benjamin();console.log(Ben);//ReferenceError: Ben is not defined
/**
* trick08:变量的作用范围
*/
参考链接:javascript引擎处理脚本的过程
/**
* trick09:类数组对象
*/
类数组对象:
1)具有 :下标索引访问、length属性
2)不具有:诸如push、forEach 以及 indexOf 等数组对象具有的方法
3)常见的类数组对象:
a)一些DOM方法,例如
document.getElementsByClassName()
document.getElementsByName()
document.getElementsByTagName()
b)特殊变量arguments
4)类数组对象转换为数组对象
5)类数组对象借用数组对象的方法
fn:数组对象中的方法,indexOf,slice,concat,push,pop,etc.
Array.prototype.fn.call(arguments, arg0, arg1, ...)
6)实例:
function Benjamin(){ var args = arguments; console.log(args[0]);//1 console.log(args.length);//5 console.log(Array.prototype.slice.call(args,1));//[2, 3, 4, 5] console.log(args.slice(1));//TypeError: args.slice is not a function}Benjamin(1,2,3,4,5);
后续补充...