以下是JavaScript容易犯错的九个陷阱。

2024-02-17 09:48

本文主要是介绍以下是JavaScript容易犯错的九个陷阱。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自网络,可能是微信当时保存下来了,原地址不记得了,如果有侵权请联系我,361260796@qq.com


虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些,即所谓make life easier,qpsh.com现对某些陷阱会混杂一些评点。 


 1.   最后一个逗号 



    如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此)。IE会报语法错误,但语焉不详,你只能用人眼从几千行代码中扫描。 


<script> 
  var theObj = { 
        city : "Boston", 
        state : "MA", 
  } 
</script> 

2,this的引用会改变 

如这段代码: 


<input type="button" value="Gotcha!" id="MyButton" > 
<script> 
var MyObject = function () { 
    this.alertMessage = "Javascript rules"; 
    this.ClickHandler = function() { 
        alert(this.alertMessage ); 
  } 
}(); 
document.getElementById(”theText”).onclick =  MyObject.ClickHandler
</script>
并不如你所愿,答案并不是”JavaScript rules”。在执行MyObject.ClickHandler时,代码中红色这行,this的引用实际上指向的是document.getElementById("theText")的引用。可以这么解决: 


<input type="button" value="Gotcha!" id="theText" > 
<script> 
var MyObject = function () { 
    var self = this; 
    this.alertMessage = “Javascript rules”; 
    this.OnClick = function() { 
        alert(self.value); 
    } 
}(); 
document.getElementById(”theText”).onclick =  MyObject.OnClick 
</script>
实质上,这就是JavaScript作用域的问题。如果你看过,你会发现解决方案不止一种。 


3 ,标识盗贼



在JavaScript中不要使用跟HTML的id一样的变量名。如下代码: 


<input type="button" id="TheButton"> 
<script> 
    TheButton = get("TheButton"); 
</script>IE会报对象未定义的错误。我只能说:IE sucks. 


4,字符串只替换第一个匹配 



如下代码: 


<script> 
    var fileName = "This is a title".replace(" ","_"); 
</script>而实际上,结果是”This_is a title“. 在JavaScript中,String.replace的第一个参数应该是正则表达式。所以,正确的做法是这样: 


var fileName = "This is a title".replace(/ /g,"_");mouseout意味着mousein 
事实上,这是由于事件冒泡导致的。IE中有mouseenter和mouseleave,但不是标准的。作者在此建议大家使用库比如YU I(其他的库也可以)来解决问题。 


5,parseInt是基于进制体系的 

这个是常识,可是很多人给忽略了parseInt还有第二个参数,用以指明进制。比如,parseInt("09"),如果你认为答案是9,那就错了。
因为,在此,字符串以0开头,parseInt以八进制来处理它,
在八进制中,09是非法,返回false,布尔值false转化成数值就是0. 因此,正确的做法是parseInt("09", 10).  


6, for...in...会遍历所有的东西 



有一段这样的代码: 


var arr = [5,10,15] 
var total = 1; 
for ( var x in arr) { 
    total = total * arr[x]; 
}运行得好好的,不是吗?但是有一天它不干了,给我返回的值变成了NaN, 晕。我只不过引入了一个库而已啊。原来是这个库改写了 
Array的prototype,这样,我们的arr平白无过多出了一个属性(方法),而for...in...会把它给遍历出来。所以这样做才是比较安全的: 


for ( var x = 0; x < arr.length; x++) { 
    total = total * arr[x]; 
}


其实,这也是污染基本类的prototype会带来危害的一个例证。 


7,事件处理器的陷阱 



这其实只会存在使用作为对象属性的事件处理器才会存在的问题。比如window.onclick = MyOnClickMethod这样的代码,
这会复写掉之前的window.onclick事件,还可能导致IE的内容泄露(sucks again)。在IE还没有支持DOM 2的事件注册之前,
作者建议使用库来解决问题,比如使用YUI: 


YAHOO.util.Event.addListener(window, "click", MyOnClickMethod);这应该也属于常识问题,但新手可能容易犯错。 


8,Focus Pocus 

新建一个input文本元素,然后把焦点挪到它上面,按理说,这样的代码应该很自然: 


var newInput = document.createElement("input"); 
document.body.appendChild(newInput); 
newInput.focus(); 
newInput.select();但是IE会报错(sucks again and again)。
理由可能是当你执行fouce()的时候,元素尚未可用。因此,我们可以延迟执行: 


var newInput = document.createElement("input"); 
newInput.id = "TheNewInput"; 
document.body.appendChild(newInput); 
setTimeout(function(){ //这里我使用闭包改写过,若有兴趣可以对比原文 
document.getElementById('TheNewInput').focus(); 
document.getElementById('TheNewInput').select();}, 10);

在实践中,JavaScript的陷阱还有很多很多,
大多是由于解析器的实现不到位而引起。这些东西一般都不会在教科书中出现,只能靠开发者之间的经验分享。
谢天谢地,我们生活在网络时代,很多碰到的问题,一般都可以在Google中找到答案。 

这篇关于以下是JavaScript容易犯错的九个陷阱。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717403

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.