JavaScript 编程实践

JavaScript安全编程实战:从XSS/CSRF防御到Node.js安全实践 在Web开发中,安全编程是保障应用稳定运行的基础。其核心原理在于对用户输入和外部数据采取零信任策略,通过验证、过滤和编码等技术手段防止恶意代码注入。这种纵深防御的技术价值在于构建多层次的安全体系,即使单一防线被突破,其他层仍能提供保护。在实际应用场景中,前端需要重点防范跨站脚本攻击和跨站请求伪造,而后端则需关注输入验证、依赖包安全及错误信息处理。本文聚焦JavaScript安全编程实践,详细解析了XSS攻击的三种形态及对应的编码与过滤方案,并介绍了如何通过CSP策略和CSRF Token等机制加固应用,为开 阅读详情
零、将javascript从HTML中抽离,
<script>
  function addListener(target, type, handler) {
    if (target.addEventListener) {
      target.addEventListener(type, handler, false);
    } else if (target.attachEvent) {
      target.attachEvent("on"+type, handler);
    } else {
      target["on" + type] = handler;
    }
  }

  function doSomething() {
    // 代码
  }

  var btn = document.getElementById("action-btn");
  addListener(btn, "click", doSomething);
</script>

一、数组去重
思路:检测新数组newArr里有没有包含Arr里的i项,如果没有则向newArr里添加Aii[i]项,如果有则跳过;

var Arr = [0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9];
function unArray (Arr) {
     var newArr = [];
     for (var i = 0; i < Arr.length; i++) {
         if (newArr.indexOf(Arr[i]) == -1){
             //检测newArr数组里是否包含Arr数组的内容,==-1检索的字符串没有出现则为-1
             newArr.push(Arr[i])//把Arr数组的第i项插入新数组
       }
     };
     return newArr;
}
//console.log(unArray(Arr));


二、字面量对象的使用
var json = { username:"feng", age:22 };
修改属性:json.age = 22;
添加属性:json.address = "北京";
删除属性:delete json.age;
删除对象:json = null;



三、使用 console 来记录代码执行时间 

console.time('aa')
var str = 's'
for(var i=0;i<1000;i++){
  for(var j=0;j<1000;j++){
    str +='b'
  }
}
console.timeEnd('aa')



四、合理利用二进制

如:对2取模,则偶数最低位是0,奇数最低位是1,与1进行位与操作的结果是0,奇数的最低位是1,与1进行位与操作的结果是1。

代码如下:

.odd{color:red}
.even{color:yellow}
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
var i = 0;
var lis = document.getElementsByTagName("li");
var len = lis.length;
for(;i<len;i++){
if(i&1){
    lis[i].className = "even";//奇数
} else{
    lis[i].className = "odd";//偶数
}
};



五、优化层叠的条件判断

如果你看到这堆条件判断代码,你会如何优化它?

if(color) {
     if(color ==='black') {
         printBlackBackground();
     }elseif(color ==='red') {
         printRedBackground();
     }elseif(color ==='blue') {
         printBlueBackground();
     }elseif(color ==='green') {
         printGreenBackground();
     }else{
         printYellowBackground();
     }
}

尽可能的避免使用switch,那么最高效的做法就是通过一个object了。

var colorObj = {
     'black': printBlackBackground,
     'red': printRedBackground,
     'blue': printBlueBackground,
     'green': printGreenBackground,
     'yellow': printYellowBackground
};

if(color && colorObj.hasOwnProperty(color)) {
     colorObj[color]();
}


六、使用同一个方法处理数组和单一元素

与其拆分成两个方法来处理,不如写一个方法能同时处理两种情况:只需要先将它们并成一个数组
下面用一个方法,实现对传入的所有参数转换成大写
function printUpperCase(words){
     var elements = [].concat(words);//字符串转换成数组,数组使用此方法则不发生改变
     for(vari =0; i < elements.length; i++) {
         console.log(elements[i].toUpperCase());
     }
}

printUpperCase("cactus");// => CACTUS
printUpperCase(["cactus","bear","potato"]);// => CACTUS,BEAR,POTOCO


七、in and hasOwnProperty

任何继承自Object的对象都有in,hasOwnProperty两个方法,你知道它们的区别吗?

var     myObject = {
     name:'feng'
};

myObject.hasOwnProperty('name');// true
'name' in myObject;// true

myObject.hasOwnProperty('valueOf');// false, valueOf is inherited from the prototype chain
'valueOf' in myObject;// true

只有属性是直接在对象上,hasOwnProperty 才会返回true,而 in 则是不三七二十一,把对象及其原型链都查找了一遍。

var     myFunc =function(){
     this.name = 'feng';
};
myFunc.prototype.age ='24';

var     user =new myFunc();

user.hasOwnProperty('name');// true
user.hasOwnProperty('age');// false, because age is from the prototype chain


八、用闭包保存状态

下面是一段常见的代码
var elements = document.getElementsByTagName('input');
var n = elements.length;
for (var i = 0; i < n; i++) {
    elements[i].onclick = function() {
    console.log("This is element #" + i);
};
}

运行以上代码,如果页面上有10个按钮的话,点击每一个按钮都会弹出 “This is element #10”! 。这和我们原先预期的并不一样。这是因为当点击事件被触发的时候,for循环早已执行完毕,i的值也已经从0变成了。

还有

var elems = document.getElementsByTagName('a');

for (var i = 0; i < elems.length; i++) {
     elems[i].addEventListener('click', function (e) {
           e.preventDefault();
          alert('I am link #' + i);
     }, 'false');
}

由于变量i从来就没背locked住。相反,当循环执行以后,我们在点击的时候i获得数值,所以说无论点击哪个连接,最终显示的都是I am link #10(如果有10个a元素的话)

闭包直接可以引用传入的这些参数,利用这些被锁住的传入参数,自执行函数表达式可以有效地保存状态。下面是正确的使用:

var elems = document.getElementsByTagName('a');

for (var i = 0; i < elems.length; i++) {
     (function (lockedInIndex) {
           elems[i].addEventListener('click', function (e) {
               e.preventDefault();
               alert('I am link #' + lockedInIndex);
           }, 'false');
     })(i);
}

由于在自执行函数表达式闭包内部i的值作为locked的索引存在,在循环执行结束以后,尽管最后i的值变成了a元素总数(例如10)但闭包内部的lockedInIndex值是没有改变,因为他已经执行完毕了所以当点击连接的时候,结果是正确的。

其实,前面两个例子里的lockedInIndex变量,也可以换成i,因为和外面的i不在一个作用于,所以不会出现问题,这也是匿名函数+闭包的威力。



九、判断数组的正确姿势

我们都知道,数组是特殊的对象,所以数组的 typeof 结果也是 object,而因为 null 的结果也是 object,所以如需用 typeof 运算符来判断数组,需要这么写:

var a = [0, 1, 2]; // 是 object 同时排除 null、排除纯对象
console.log(typeof a === 'object' && a !== null && Object.prototype.toString.call(a) !== '[object Object]'); // true

十、cookie使用
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    var cookie = {
        setCookie:function(name,value,iDay){
            var cookieStr = '';
            if(iDay == undefined){
                cookieStr += name+'='+value+';';
            }else{
                var oDate = new Date();
                oDate.setDate(oDate.getDate()+iDay);
                cookieStr += name+'='+value+';express='+oDate;
            }

            document.cookie = cookieStr;
        },
        getCookie:function(name){
            var arr = document.cookie.split(';');
            for(var i=0;i<arr.length;i++){
                var arr2 = arr[i].split('=');
                if(arr2[0] == name){
                    return arr2[1];
                }
            }
            return '';
        },
        removeCookie:function(name){
            this.setCookie(name,'1',-1);
        }
    }
    function ControlAlert(){
        var flag = cookie.getCookie('flag');
        if(!flag){
            alert("我是第一次加载的哟!");
            cookie.setCookie('flag',true);
            //cookie.setCookie('flag',true,1);//如果有第三个参数则保存cookie的天数,如果不设置,浏览器关闭时cookie过期
        }
    }
    (function(){
        ControlAlert();
    }());

</script>
</body>
</html>


十一、更快的取整(Math.floor())
  一个位操作符 ~ 将输入的32位的数字(input)转换为  -(input+1) . 两个位操作符将输入(input)转变为  -(-(input + 1)+1) 是一个使结果趋向于0的取整好工具. 对于数字, 负数就像使用 Math.ceil() 方法而正数就像使用 Math.floor() 方法. 转换失败时,返回 0 ,这在 Math.floor() 方法转换失败返回 NaN 时或许会派上用场。
<pre name="code" class="javascript">// 单个 ~<pre name="code" class="javascript">console.log(~1337)    // -1338
// 数字输入
console.log(~~47.11)  // -> 47
console.log(~~-12.88) // -> -12
console.log(~~1.9999) // -> 1
console.log(~~3)      // -> 3
 
// 转换失败
console.log(~~[]) // -> 0
console.log(~~NaN)  // -> 0
console.log(~~null) // -> 0
 
// 大于32位整数时转换失败
console.log(~~(2147483647 + 1) === (2147483647 + 1)) // -> 0



十二、方法的链式调用:方法内返回对象
function Person(name) {
this.name = name;

this.sayName = function() {
console.log("Hello my name is: ", this.name);
 return this;
};

this.changeName = function(name) {
    this.name = name;
    return this;
};
}
 
var person = new Person("John");
person.sayName().changeName("Timmy").sayName();


十三、.短路求值
短路求值是说, 只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值:当AND( && )的第一个运算数的值为false时,其结果必定为false;当OR( || )的第一个运算数为true时,最后结果必定为true。逻辑或可以用来给参数设置默认值。
function theSameOldFoo(name){
     name = name || 'Bar' ;
     console.log("My best friend's name is " + name);
 }
theSameOldFoo();  // My best friend'name is Bar
theSameOldFoo('Bhaskar');  // My best friend's name is Bhaskar

 var dog = {
  bark: function(){
      console.log('Woof Woof');
<span style="white-space:pre">	</span>}
};
// 调用 dog.bark();
dog.bark(); // Woof Woof.
// 但是当dog未定义时,dog.bark() 将会抛出"Cannot read property 'bark' of undefined." 错误
// 防止这种情况,我们可以使用 &&.
dog&&dog.bark();   // This will only call dog.bark(), if dog is defined.

十四、!! 的使用,只输出false和true
!!"" // false
!!0 // false
!!null // false
!!undefined // false
!!NaN // false
 
!!"hello" // true
!!1 // true
!!{} // true
!![] // true

十五、



JavaScript 异步编程:探索 JavaScript 技巧和最佳实践 异步编程JavaScript 中一个重要且常见的概念。在处理网络请求、文件操作、定时任务等场景中,异步编程能够有效地提高应用程序的性能和响应能力。本文将深入探讨 JavaScript 异步编程的技巧和最佳实践,并提供相应的源代码示例。 阅读详情

相关推荐

掌握JavaScript编程:深入探索与实践

本文将介绍一本关于JavaScript的权威指南书籍——《JavaScript在示例和习题中》。书籍详细讲解了JavaScript的基础知识、脚本编写、事件处理、函数定义、面向对象编程等核心概念。通过丰富的实例和详尽的解释,为读者提供了一个全面了解和掌握JavaScript的平台。

weixin_33814090的博客 327

javascript最佳实践

NULL 博文链接:https://xieyaxiong.iteye.com/blog/1560677

Javascript的24条实践

javascript开发规范介绍,一些注意事项

前端JavaScript篇之addEventListener()方法的参数和使用

addEventListener() 是 JavaScript 中用于向指定元素添加事件监听器的方法。这个方法通常用于处理用户交互,比如点击、鼠标悬停等操作。

星辰迷上大海的博客 5123

JavaScript--addEventListener()方法

在上述示例中,我们通过getElementById()方法获取到id为"myButton"的按钮元素,然后使用addEventListener()方法给按钮添加了一个点击事件的监听器。当按钮被点击时,匿名函数将会执行,并在控制台输出"按钮被点击了!对于addEventListener()方法,它用于向指定的元素添加事件监听器,并在该元素上触发指定的事件时执行相应的函数或代码。

m0_74293254的博客 1316

JavaScript 事件监听器 addEventListener() 方法 和一些基本的事件

addEventListener() 方法用于向指定元素添加事件句柄。当计算机属性检测到事件发生的时候,运行一些代码,通常是我们所制定的函数。

好好吃饭,好好睡觉 6309

javascript的addEventListener() 方法

...

qq_32666545的博客 4484

js addeventlistener

JavaScript是一种广泛应用于网页开发的脚本语言,具有灵活的语法和强大的功能。在网页中,我们经常需要处理用户的交互操作,例如点击按钮、输入文本等,而addEventListener方法就是用来处理这些事件的。

Charles1938229的博客 6150

Js编程实践

js编程实践思维导向图 ---欢迎收藏 ^ - ^ 转载于:https://www.cnblogs.com/jun-qi/p/11137262.html

weixin_30832983的博客 91

如何快速掌握JavaScript编程:idiomatic.js Proxy终极实践指南

在现代JavaScript开发中,元编程能力是提升代码质量与灵活性的关键技能。**idiomatic.js**作为一套编写一致、地道JavaScript代码的规范指南,为开发者提供了从基础语法到高级模式的全面最佳实践。本文将以初学者视角,通过Proxy API详解元编程的核心概念与实用技巧,帮助你轻松掌握这一强大工具。 ## 什么是JavaScript编程? 元编程(Metaprogramm

gitblog_00582的博客 308

js--编写可维护的JavaScript-2.编程实践

第五章:UI层的松耦合将css从JavaScript中抽离 js改变样式常会直接修改DOM元素的style属性,但是其实样式最好尽可能的保持在CSS中,最好操作CSS的className// 不好的写法 element.style.color = "red";// 好的写法-原生方法 element.className += "reveal"; // 好得写法-HTML5 element.clas

王欢的博客 689

探索JavaScript编程实践:js-example项目深度解析

探索JavaScript编程实践:js-example项目深度解析 项目简介 是一个面向JavaScript初学者和开发者的学习资源库,它包含了各种常见的编程示例,涵盖了从基础语法到高级特性的广泛主题。这个项目旨在帮助开发者巩固理解JavaScript的核心概念,并通过实例学习如何在实践中应用这些知识。 技术分析 该项目充分利用了GitHub的特性,以Markdown格式编写代码示例,易于阅读和分...

gitblog_00089的博客 394

JavaScript核心及实践

JavaScript 核心及 实践 第 0.9.9 版 alpha 版 作者:邱俊涛

JS编程最佳实践

最近花了一周时间把《编写可维护的js》 阅读了一遍, 现将全书提到的JS编程最佳实践总结如下, 已追来者!    1.return 之后不可直接换行, 否则会导致ASI(自动分号插入机制)会在return 后插入一个分号。    2.一行语句最多不超过80个字符, 如果超过则应该在运算符后换行,并且追加两个缩进。    3.采用驼峰式命名,变量前缀为名词如:myName 函数应该以动词开始如:...

weixin_30773135的博客 77

JavaScript的异步编程最佳实践是什么?

因此,在实际开发中,我们需要遵循最佳实践,不断学习和探索新的技术和方法,以提高异步编程的质量和效率。作为开发者,我们需要保持敏锐的洞察力和持续的学习态度,不断掌握新的技术和方法,以适应不断变化的前端开发环境。同时,我们也需要关注性能、可读性和可维护性等方面的问题,以确保我们的代码既高效又易于维护。在未来的开发中,随着新的JavaScript特性和工具的出现,我们可能会遇到更多的挑战和机遇。因此,我们需要保持开放的心态和创新的精神,勇于尝试新的技术和方法,为构建更加优秀的前端应用而努力。

NewmaEdward的博客 1854

JavaScript函数式编程实践指南

JavaScript函数式编程实践指南 本文深入探讨JavaScript函数式编程的核心概念与实践技巧,重点解析高阶函数(map、reduce、filter)、纯函数与副作用管理、函数组合技术(偏函数、柯里化)以及Memoization性能优化策略。通过丰富的代码示例和实际应用场景,帮助开发者掌握函数式编程的精髓,提升代码质量和性能表现。 高阶函数:map、reduce、filter的原理与应用 ...

gitblog_00287的博客 900

JavaScript语言精髓与编程实践》(第二版)相关资源汇总

JavaScript语言精髓与编程实践》已经陆续在网店开售,相关信息可以看这里: 绿皮书再版!ECMAScript 5th有讲呵! http://blog.csdn.net/aimingoo/article/details/7362552 主要的修改与更新的内容在这里: 《JavaScript语言精髓与编程实践》第二版的主要修改 http://blog.cs

aimingoo的专栏 1万+

javascript编程的最佳实践推荐

推荐的javascript编程的最佳实践,摘要记录在这里: 可维护的代码保证代码的性能部署代码 1 可维护的代码1.1什么是维护的代码:可理解性——其他人可以接手代码并理解它的意图和一般途径,而无需原开发人员的完整解释。直观性——代码中的东西一看就能明白,不管其操作过程多么复杂。可适应性——代码以一种数据上的变化不要求完全重写的方法撰写。可扩展性——在代码架构上已考虑到在未来允许对核心功能进行...

weixin_33989780的博客 79
上一篇: JavaScript Core -- 函数表达式面试题
阿懒先生
博客等级 码龄14年 12粉丝 34原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值