JS学习笔记

  1. 判true和false状况javascript

    true:已定义的空对象、“false”、非0数字、已定义的空数组。java

    false:数字0、NaN、null、undefined、空字符串。jquery

  2. 三种全局变量程序员

    全部函数外声明变量、window.test方式(window是全局对象)、不带var的变量。算法

    有个大坑:undefined和NaN居然也是全局变量,而且咱们能够修改其值。
    json

  3. 做用域问题数组

    其余语言都是一对花括号是一个做用域,此做用域中的变量对于外部是不可见的。js虽然也有做用域,也是用花括号包起来,可是:此做用域中声明的变量在包含此做用域的函数在任何位置都是可见的(闭包是典型的例子)。简单例子:浏览器

    var test = {安全

        a: "a",闭包

        b: function(){}  //在b函数中对啊是可见的,不管b函数出如今整个函数的任何地方都如此

    }

  4. 智能补充分号

    js有智能补充分号功能,倒是个鸡肋功能(做为程序员,写完一个语句顺手分号是必备技能吧~)。简单例子:

    return

    {

        a: "a"

    }

    会被识别为:

    return ;  //返回值变成了undefined

    {

        a: "a"

    }

    正确的应该这样写:

    return{

        a: "a"

    }

  5. 保留字用在其余地方

    保留字原本不该该用来做为键值的(做为变量和参数是绝对不能够的),可是非要用也何尝不可(建议不要这么用):

    var class;  //非法

    var test = {case: "hehe"};  //非法,在最新的几个浏览器中变得不非法了,仍是强烈建议避免这样用。

    var test = {"case": "hehe"};  //OK

    test.case = "xixi";  //非法

    test["case"] = "xixi";  //OK

  6. typeof问题

    不能识别null,typeof null 返回的居然是“object”而不是“null”。

  7. 要判null,建议使用if(a===null)。

    而且typeof /a/ 返回的也是“object”或者“function”而不是“regexp”。

    typeof还不能识别array,由于js没有真正的数组,所谓的数组实际上是一个键值为数字的键值对/对象/json。

    要检测一个变量(value)是否是数组能够这样:Object.prototype.toString.apple(value) === "[object Array]"






  8. NaN问题

    NaN不是一个具体的变量或者数值,它是“number”可是没有具体的值,每次生成的数值都不同。

    typeof NaN === "number"   //true

    NaN === NaN  //false

    NaN !== NaN  //true

    可能出现NaN的状况:试图把非数字形式的字符串转换为数字,例如:

    +"123"   //123

    +"test123"   //NaN

    isNaN函数:

    isNaN(NaN)    //true

    isNaN(0)        //false

    isNaN("test123") //true

    isNaN("123")    //false

    判断一个值(value)是不是number或者能够转为number的字符串,能够这样:typeof value === "number" && isFinite(value)

  9. parseInt安全用法

    众所周知这个函数是用来把字符串转换成整数,可是在遇到没法转换的字符时会中止转换而不报任何的错误,例如:parseInt("123")和parseInt("123 a")结果都是123。

    强烈建议如此使用:parseInt("value",10)  //10表示基数参数,十进制

  10. hasOwnProperty漏洞

    hasOwnProperty是对象的一个方法,而不是一个运算符,因此咱们能够修改这个方法,从而覆盖了默认的方法,再次调用hasOwnProperty时就中招了~~~

  11. 对象的隐藏属性

    例如:var test = {}

    别觉得test对象里没用任何东西哦~~~咱们每每会这样认为,从而忽略了Object.prototype这个原型链上包含着一个名为constructor的成员对象属性~~~

    so,遍历对象必定要加倍当心(尽可能避免遍历对象,能用array代替最好),结合typeof和hasOwnProperty能够避免隐含危险。

  12. ==和===

    强烈建议:使用===和!== 代替 == 和 !=

    由于不一样类型比较,==在判断时会试图强制转换类型后比较,在转换类型过程当中隐藏危险太多太复杂了。例如:

    "" == "0"     //false

    "" == 0        //true

    0 == ""        //true

    0 == "0"      //true

    false == "false"    //false

    false == "0"    //true

    false == 0    //true

    false == undefined    //false

    false == null      //false

    null == undefined   //true

    "\t\n\r" == 0      //true

    "\t\n\r" == ""      //false

    "\t\n\r" == null     //false

    以上例子若是改用===,所有为false。

    在程序员的世界,x==y,y==z,那么x==z。可是,js却违背了这种传递性,改成===则遵循。

  13. 不应存在的with语句

    强烈建议:任什么时候候都不要使用js的with语句。

    虽然with语句简短,可是with语句可读性及其差,检查bug时会让你发而且疯,阻断了变量名的词法做用域绑定致使处严重影响js处理器的速度。

  14. continue语句

    都知道,用来跳出循环~~~网友测试,经过重构移除continue语句以后,性能会获得必定的改善。so,尽可能避免使用continue语句吧~~~

  15. function语句和表达式

    第一种:function test(){}

    第二种:var test = function(){}

    第三种:var test = function test(){}

    建议使用第二种,由于第一种function不管放在哪,都会并定义到所在做用域的顶层,没有了先声明后定义/使用的规范了。旧版的浏览器在if语句中不容许使用function语句,新版的不少居然容许了,我擦~~~具体哪一个浏览器哪一个版本没去详细测试。

  16. new的利弊

    new是其余语言(如java)用于实例化类对象的关键字,感受高大上~~~可是js里最好避免使用,请看:

    var test = new String("hehe");           

    var test = new Array("a","b")

    这些大能够用

    var test = “hehe”;

    var test = ['a','b'];

    代替,何须用new呢。相似的Boolean、Number和Object都是。

    可是在实例化咱们本身写的类的时候,又必须使用new(把新对象绑定给this),不然this会被绑定到全局对象,对象的属性就是全局的,污染全局变量。这种状况不是语法错误也不是逻辑错误,在编译已经运行时都不会报错,查bug就是一个无底洞~~~

    建议:须要new的类名都使用大写开头,毕竟业内习惯类名都是以大写字母开头。

  17. void为什么物

    void在其余语言中是一种类型,表示值为空。可是,在js里void是一个运算符,接受一个运算数并返回undefined,典型用法是:javascript:void(0),在href中阻断跳转。可是这个不是标准的用法,没有什么意义,应该避免去使用它。

  18. 避免使用位运算

    位运算速度很是之快,可是个人理解是依靠硬件直接处理,可是js的执行环境接触不到硬件,也没法控制硬件,因此最好避免使用。而且位运算中的 & 和 | 等符号和 && 和 || 符号较为类似,容易误写以及减低可读性,特别是查bug的时候会有想死的感受。

  19. 万恶的小数(任什么时候候都要想办法去避免处理小数

    js对于小数的处理存在无数的bug,因此咱们任什么时候候须要处理小数的话最好都要转化为整数来处理,不然会出现意想不到的结果。目前我亲测发现是有如下这些:

    0.1+0.2               //不是等于0.3,而是0.30000000000000004

    0.07*100            //不是等于7,而是7.000000000000001

    a = 3;b = 3.000000000000001;a == b为true,由于计算机自己没法存储小数,都是以模拟的形式存储的。

  20. js对象的拷贝,java有clone方法,而js却没有须要本身写代码实现(代码参照《Node.js开发指南》一书第163页),其中分为浅拷贝和深拷贝,浅拷贝原理就是循环遍历全部属性中的基本类型(不包括对象类型)属性,假如属性是一个对象类型就须要用深拷贝了。深拷贝的原理就是用递归来遍历,遇到复杂的对象类型同样能够胜任,可是遇到互相引用的对象就连浅拷贝和深拷贝都没辙了。遇到互相引用的对象,须要拷贝时,就必须设计一套图论算法,分析对象之间的依赖关系,创建一个拓扑结构图,而后分别依次复制每一个顶点,并从新构建它们之间的依赖关系。

  21. jquery的attr和prop的区别

    对于HTML元素自己就带有的固有属性,在处理时,使用prop方法。

    对于HTML元素咱们本身自定义的DOM属性,在处理时,使用attr方法。

    例如:在写全选和取消全选时,写法以下

$("thead input").click(function(){
            if ($(this).is(':checked')) {
              $("tbody input").prop("checked",true);  //假如用attr,则点击全选→取消小全选→再点击全选就无效了。
            }else{
              $("tbody input").prop("checked",false);
            }
          });
相关文章
相关标签/搜索