/**
*
* @authors Benjamin(http://blog.csdn.net/cuew1987)
* @date 2013-11-29 14:04:00
* @content 总结javascript的那些怪癖(trick)
*/
/**
* trick01:NaN是个数值
* NaN:表示某个值不是数值,但其本身又是数值,且不等于其自身
*/
console.log(typeof NaN);//number
console.log(NaN == NaN);//false
console.log(NaN === NaN);//false
/**
* trick02:Null是个对象
* Null:javascript中的五大基本类型之一,它有个唯一的值null, 即它的字面量,定义为完全没有任何意义的值。null 不是任何对象的实例:
*/
console.log(typeof null);//Object
console.log(null instanceof Object);//false
/**
* trick03:undefined
* undefined:undefined并不是JavaScript中的保留字,尽管它有特殊的意义,并且是唯一的方法确定变量是否未定义,但是它可以定义为变量
*/
var Benjamin;
console.log(typeof Benjamin);//undefined
undefined = "My name is Benjamin";
console.log(undefined == Benjamin);//true
/**
* trick04:函数可以执行自身
* 情况一:jQuery代码的封装
* 情况二:延迟函数中的应用
*/
//1.0
(function($){
})(jQuery);
//2.0
var 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);//true
console.log(1 == true );//true
console.log(2 == true );//false
console.log("0" == false);//true
console.log("1" == true );//true
console.log("2" == true );//false
console.log("" == 0 );//true
console.log("" == false);//true
console.log(" " == 0 ); //true
console.log(" " == false); //true
console.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);
后续补充...