编写可维护的 JavaScript

发布于 2024-02-18 13:00:09 字数 3711 浏览 29 评论 0

一、事件处理


1.1 规则 1:隔离应用层

好的写法,拆分应用逻辑

var myApp = {
    handleClick: function(e){
      this.showPopup(e);  
    },
    showPopup: function(e){
        var popup = document.getElementById("popup");
        popup.style.left = e.clientX + "px";
        popup.style.top = e.clientY + "px";
    }
};

addEventListener(element,"click",function(e){
    MyApp.handleClick(e);
});

1.2 规则 2:不要分发事件对象

var myApp = {
    handleClick: function(e){
     // 假设事件支持 DOMlevel2
     
     e.preventDefault();
     e.stopPropagation();
     
     //传入应用逻辑
      this.showPopup(e.clientX,e.clientY);  
    },
    showPopup: function(x,y){
        var popup = document.getElementById("popup");
        popup.style.left = x + "px";
        popup.style.top = y + "px";
    }
};

addEventListener(element,"click",function(e){
    MyApp.handleClick(e);
});

二、JavaScript 中的检测方法


2.1 检测原始值


JavaScript 中有五种原始类型:字符串、数字、布尔值、 nullundefined 。如果你希望一个值是字符串、数字、布尔值或 undefined ,最佳选择是使用 typeof 运算符。typeof 运算符会返回一个表示值 饿类型的字符串

  • 对于字符串, typeof 返回 string
  • 对于数字, typeof 返回 number
  • 对于布尔值, typeof 返回 boolean
  • 对于 undefined ,typeof 返回 undefined
//检测字符串
if ( typeof name === "string"){}

//检测数字
if ( typeof count === "number"){}

//检测布尔值
if ( typeof found === "boolean" && found){}


//检测 undefined
if ( typeof myApp === "undefined"){}

//检测 null
var ele = document.getElementById("app");
if ( ele !== null){
    ele.className = "found";
}

2.2 检测引用值


有几种内置的引用类型 ObjectArrayDateErrortypeof 运算符在判断这些引用类型时显得力不从心,因为所有对象都会返回 undefined

console.log(typeof {}); //object
console.log(typeof []); //object
console.log(typeof new Date()); //object
console.log(typeof new RegExp()); //object
  • 检测某个引用类型的最好方法使用 instanceof 运算符。
  • 语法 value instanceof constructor
// 检测日期
if( value instanceof Date){
    console.log(value.getFullYear());
}

//检测正则表达式
if (value instanceof RegExp) {
    if (value.test(antherValue)) {
        console.log("poetries");
    }
}

2.3 检测函数


typeof 运算符可以检测函数

function myFunc(){

}

if (typeof myFunc === "function"){

}

2.4 检测数组


  • 优雅的方法
function isArray(value){
    return Object.prototype.toString.call(value) === "[object Array]";
}

2.5 检测属性


  • 判断属性是否存在的最好方法是使用 in 运算符, in 运算符仅仅是判断属性是否存在,而不会去读属性的值
var object = {
    count: 0,
    related: null
};

//好的写法

if ("count" in object){
    
}
  • 如果只是想检查实例对象的某个属性是否存在,则使用 hasOwnProperty() 方法。所有继承 Object 的对象都有这个方法,如果实例存在则返回 true
  • 需要注意的是在 IE8 以及更早的版本中, DOM 对象并非继承 Object ,因此也不包含这个方法
//对于所有非 DOM 对象来说,这是好的做法
if(object.hasOwnProperty("related")) {

}

// 如果你不确定是否为 DOM 对象 则需要这样写

if("hasOwnProperty" in object && object.hasOwnProperty("related")) {

}

在判断实例是否存在时,更倾向使用 in 运算符,只有在需要判断实例属性时才用 hasOwnProperty

三、将配置数据从代码中分离


//将配置数据抽离出来

var config = {
    MSG_INVALID_VALUE: "invalid value",
    URL_INVALID: "errors/invalid.php",
    CSS_SELECTED: "selected"
};

function validate(value){
    if (!value){
        alert(config.MSG_INVALID_VALUE);
        location.href = config.URL_INVALID;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

反目相谮

暂无简介

0 文章
0 评论
740 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文