zoukankan      html  css  js  c++  java
  • JavaScript 容易被忽视的细节(一)

    1.减少全局变量污染
      定义全局变量的三种方式

        a.在任何函数外面直接执行var语句。

        b.直接添加一个属性到 全局对象上。 window.f="value":

        c.直接使用未经声明的变量。 f="value";

      避免全局变量的两种方式
      a.在应用程序中创建全局变量做位变量容器,将多个全局变量追加再次容器中。
        例:
          var MySpace={};
          MySpace.name={
          firstName:"zhang",
            lastName:"san"
          };
          MySpace.work={
            number:134998768679
          };
      b.使用闭包将信息隐藏。
        var foo=function(){
          var a=1,b=2;
          var bar=function(){
            var b=3,c=4;
            a+=b+c;
          }
          bar();
        }
    2.注意javaScript数据类型的特殊性
      防止浮点数溢出
        二进制的浮点数不能正确处理十进制的小数,因此js 计算结果  
        例 0.1+0.2=0.30000000000000004       23.87/1000=0.023870000000000002
         解决方法   1.按精度取值      2.先转换为整数后进行计算然后,再还原小数位。
      慎用JavaScript类型自动转换
        在JavaScript中能够自动转换变量的数据类型,这种转换是一种隐性行为。
        JavaScript一般遵循:某个类型的值被用于需要其他类型的值的环境中,js
        就会自动将这个值转换成所需要的类型。
      数据类型自动转换
    值(value) 字符串操作环境 数字运算环境 逻辑运算环境 对象操作环境
    undefined ”undefined“ NaN false Error
    null “null” 0 false Error
    非空字符串 不转换 字符串对应的数字值 false String
    NaN "NaN" 不转换 false Number
    空字符串 不转换 0 false String
    0 "0" 不转换 false Number
    Infinity "Infinity" 不转换 true Number
    Number "infinity" 不转换 true Number
    true "true" 1 不转换 Boolean
    false “false” 0 不转换 Boolean
    对象 toString() valueOf()或toString()或NaN true 不转换
     
        a.如果把非空对象用在逻辑运算环境中,则对象被转换未true.此时的对象包括
        所有类型的对象,即使是职位false的包装对象也被转换为true。
        b.如果把对象用在数值运算环境中,则对象会被自动转化那位数字,如果转化
        失败,则返回值为NaN.
        c.当数组被用在数值运算环境中时,数组将根据包含的元素来决定转换的值。
        如果数组为空数组,则被转换为数值0.如果数组仅包含一个数字元素,则被
        转换 为该数字的数值。如果数组包含多个元素,或者仅包含一个非数字元素,
        则返回NaN。
        d. 当对象用于字符串环境中时,JavaScript能够调用toString()方法把对象转化
        为字符串再进行相关计算。当对象与数值进行加号运算是,则会尝试将对象
        转换为数值,然后参与求和运算。如果不能将对象转换为有效值,则执行字
        符串连接操作。
        e. 在进行逻辑运算环境中切记0的值也为false。
      正确检测数据类型
        数据类型检测
    值(value) typeof value(表达式返回值) value.constructor()构造函数的属性值
    var value=1 “number” Number
    var value ="a" "string" String
    var value =true "boolean" Boolean
    var value={} "object" Object
    var value=new Object() "object" Object
    var value=[] "object" Array
    var value =new Array() "object" Array
    var value=function(){} "function" Function
    function className(){} "object" className
        不幸的是,在typeof检测null值时,返回的时“object”,而不是“null”。
        更好的检测null的方式是先判断是否为null,然后做检测
        function type(o){
          return (o===null)?"null":(typeof o)
        }
        undefined和null特殊值,就不能使用constructor属性,因为使用JavaScript
        解释器会抛出异常。此时可以先把值转换为布尔值,如果为true,则说明不是
        undefined和null值,然后再调用constructor属性
        var value = undefined;
        alert(typeof value); //"undefined"
        alert(value && value.constructor); //undefined
        var value =null;
        alert(typeof value); //"object"
        alert(value && value.construtcor); //null
        对于数值直接量,也不能使用constructor属性,需要加上一个小括号,这是
        因为小括号运算符能把数值转换为对象,
        alert((10).constructor);
        使用toString()方法检测对象类型是最安全、最准确的。调用toString()方法把
        对象转换为字符串,然后通过检测字符串中是否包含数组所特有的标识符可以
        确定对象的类型。
          function typeOf(0){
          var _toString = Object.prototype.toString;
            var _type ={
              "undefined" : "undefined",
              "number" : "number",
              "boolean" : "boolean",
              "string" : "string",
              "[object Function]" : "function",
              "[object RegExp]" : "regexp",
              "[object Array]" : "array",
              "[object Date]" : "date",
              "[object Error]" :“error”
            }
            retutn _type[typeof o] || _type[_toString.call(o)] ||
            (o?"object": "null");
         }
        上述方法适用于JavaScript基本数据类型和内置对象,而对于自定义对象是
        无效的。这是因为自定义对象被转换为字符串后,返回的值是没有规律的,
        因此,要检测非内置对象,只能够使用constructor属性和instaceof运算符
        来实现。
      避免使用parseInt
        a. parseInt会先看位置0处的字符,如果不是有效数字,则将返回NaN,不再
        深入分析。如果位置0处的字符是数字,则看下一位,直到发现非数字字符
        为止,此时parseInt()函数将把前面分析合法的数字字符转换为数值并返回
        parseInt("123abc"); //123
        parseInt("1.73"); //1
        parseInt(".123"); //NaN
        b. 对于以0开头的数字字符串,parseInt()函数会把它做位八进制数字处理,
        先把它转换为数值,然后再转换为十进制数字返回。对于0x开头的数字
        字符串,parseInt()函数会把它做位十六进制数字处理,然后转为十进制
        返回。
        parseInt("010"); //8 八进制
        parseInt("0x10"); //16 十六进制
        通过在parseInt中提供技术参数,可以把二进制、八进制、十六进制等
        转换。
        parseInt("10",2);
        parseInt("10",8);
        parseInt("10",10);
    3.防止JavaScript自动插入分号
      JavaScript语言有一个机制:在解析时,能够在一句话后面自动插入一个
      分号,用来修改语句末尾一楼的分号分隔符。然而,由于这个自动插入的
      分号与JavaScript语言的另一个机制发生了冲突,即所有空格符都被忽略,
      因此程序可以利用空格格式化代码。
    4.正确使用JavaScript特殊值
      a.NaN
        1) 判断一个值是否可用作数字的最佳方法是使用isFinite函数,因为他会
        筛除掉NaN和Infinity(表示无穷大)。不幸的是isFinite会试图把他的运
        算数转换为一个数字。因此,如果值不是一个数字,可自定义函数实
        现检测数字。
        var isNumber=function isNumber(value){
          return typeof value==='number' && isFinite(value);
        }
      b.null和undefined
        null == undefined,null !== undefined;
        可以用typeof运算符来检测某个变量是否为undefined。
      c.使用假值
        0、NaN、''、false、null、undefined、布尔值都是false。
    5.小心保留字误用

     

  • 相关阅读:
    python项目打包成exe
    sql同比环比计算
    七款好看文字样式纯css
    一站式智能芯片定制技术
    实战清除电脑上恶意弹出广告窗口
    GAAFET与FinFET架构
    MIPI多媒体接口
    Intel GPU实现游戏与数据中心
    芯片倒爷赚钱术
    Cache Memory技术示例
  • 原文地址:https://www.cnblogs.com/xiaoma-ge/p/6343678.html
Copyright © 2011-2022 走看看