`
123003473
  • 浏览: 1060270 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JavaScript陷阱浅谈

阅读更多
1、变量   
看下面一段代码   
var t = "global";   
function test() {   
a = "global too";   
var t = "local";   
alert(t);   //output:"local"   
alert(a);   //output:"global too"   
t = "also local";   
}   
test();   
alert(t);   //output:"global"   
alert(a);   //output:"global too"  
为什么输出结果是这样的呢?可能局部变量和全局变量t比较容易理解。但是a是怎么回事呢。   
/*因为在JavaScript中,即使在函数中,没有var声明的变量作为全局对象“Globle”的属性。这也说明了一个问题。在JavaScript中所有的属性必须有相应的对象。*/  
关于变量,我们再来看这样的一段代码   
var t = "globle";   
if(true) {   
var a = "also global";   
var t = "..."  
alert(t);   //output:"..."   
}   
alert(t);   //output:"..."   
alert(a);   //output:"also global" 
/*  
*这段代码证明了2件事  
*1、javascript中没有块级的局部变量。就是说if、while、for、switch等语句中声明的变量也是全局的变量  
*2、javascript中声明重复变量的后果是后者覆盖了前者  
*同时,全局变量的调用window.t == t  
*/  
2、类型   
JavaScript中有以下类型数字型、字符型、布尔型、Undefined、Null、对象.其中前5个是储存属于值类型   
typeof 运算符是用来返回变量、值的类型的,但是他只会返回以下类型   
undefined、bool、string、number、object。这其中/*null会返回object。*/  
这里有一个令人费解的东西:如果声明(有的书或资料称作定义)了而未赋值的,alert()出来就是undefined、如果没有声明alert()会报error但是typeof却并不如此。即使未声明也不会报error。而是返回undefined   
所以/*未声明的变量只能使用typeof运算符,不能使用其他的任何运算符和方法*/  
null 与 undefined 之间的关系   
/*  
*首先,undefined实际上是从null派生来的,所以两者相等  
*其次,null表示尚未存在的对象(null可以理解为对象的占位符)  
*undefined表示声明但未初始化(赋值)的变量  
*/  
Boolean 我们来先看代码   
var obool = new Boolean(false);   
alert(obool&&true); //output:true   
这个输出有些惊讶吗?这个其实并不难理解。因为obool != obool.valueOf() .其实就是说obool是对象本身,他不代表他的值。所以慎用Boolean可以减少错误   
3、数字   
我最不满意的可能就是JavaScript的这个东西,连最基本的+、-、*、/都无法做到精确。同时JavaScript的数字又比较复杂,经常让人欲哭无泪,让我们一个一个来看吧   
a)   
var t1 = 56;   
var t2 = 070;   
var t3 = 0x38;   
alert(t1==t2); //output:true   
alert(t2==t3); //output:true   
这说明无论是8进制、16进制,其变量都保存的是10进制的值。   
b)   
var t1 = 1.0    //JavaScript高级程序设计中说,在进行计算前,浮点字面量储存的是字符串,但是我不清楚这意味着什么,期待大牛的解释   
Mark一下: Number.MAX_VALUE/Number.MIN_VALUE/Number.POSITIVE_INFINITY/Number.NEGATIVE_INFINITY 对应方法 isFinite()   
c)   
NaN != NaN //这点其实不难理解,非数字那么多,怎么能相等呢对吧,哈哈~~但是要补充下"123"这样的可转换为数字的字符串不是NaN。   
d)   
拥有一个比较华丽的toString()方法。toString(2/8/16==)可以转换为相应进制的字符串.   
e)   
parseInt() parseFloat() 对字符串进行转换的。   
/*  
*parseInt()转换的时候从0位置开始检测,如果是数字,则一直检测到非数字字符。  
*parseInt()可以识别16进制和8进制的数字并返回10进制数字  
*parseInt()有基模式,可以按进制解析。比如parseInt("AF",16) ==>returns 175  
*parseFloat()不认识其他进制  
*/  
Number 的强制转换却又与这2个方法不同,如果不是合法的数字,那么就得到NaN,不过false和true又返回0和1,同时null也是0   
f)   
alert(NaN<5) //output:false   
alert(NaN>=5)    //output:false   
4、类型转换   
toString() 与 String()不同   
String(null)    //output:"null"   
null.toString() //error   
变量相等性的时候   
/*  
*Boolean类型转换成1或0。即数字型的  
*字符串与数字比较,字符串先转换为数字(哪怕是NaN)  
*对象与字符串比较,对象执行toString()  
*对象与数字比较,对象尝试转换为数字  
*/  
5、slice() 与 substring()的区别   
都是参数都是正数的时候相同   
但是当为负数的时候处理方式不同。   
看代码先:   
var test = "Hello world!";   
alert(test.slice(-5));   //output:" world"   
alert(test.substring(-5));  //output:"hello world"   
由此可见如果遇见负数,那么slice会拿length加上参数。而substring则直接当为0处理   
6、前段时间有一个童鞋在CSDN上提问以下代码为什么delete不起作用   
var t = 5;   
alert(t);   //output:5   
delete t;   
alert(t);   //output:5   
这里解释delete的作用/*运算符删除对以前定义的对象属性或方法的引用*/  
那么下面的这段代码呢?   
TRY:   
t = 5;   
alert(t);   
delete t;   
alert(t);   
7、关于void我也遇到过一个疑问。当时代码大致是这样的   
<a href="javascript:window.open('http://www.baidu.com')" mce_href="javascript:window.open('http://www.baidu.com')">test</a>   
令我当时疑惑的是在父窗口中竟然输出了null//chrome下并不这样。   
后来看javascript高级程序设计,解释void()的时候介绍了这个问题   
void()始终返回 undefined.   
8、一个数字和一个字符串相加。+是字符串连接符合   
一个数字和一个字符串相比较(字符串是数字)。字符串转换为数字,如果不能转换为数字,那么就是NaN。   
9、function无返回值或者return的时候不带参数,那么返回始终是undefined   
10、字符串做加减运算时会默认执行Number强制转换。而不是parseInt(parseFloat),例如   
    var a = "123abc";   
    alert(typeof(a++));//output:??   
    alert(a);//output NaN   
    与下面相比
    var a = "123abc";  
    a=a+1;
    alert(typeof(a));//output:string   
    alert(a);//output 123abc1    
11、new String()是object,并非是string。例如   
alert(new String("abc") === "abc")  //output:false   
12、对象和字符串字面量的区别。   
    var a = "123abc";   
    a.valueOf = function(){return parseInt(a);}   
    alert(++a);//output:NaN   
    alert(a-0);//output:NaN   
    var a = new Object();   
    a.toString = function(){return "123abc";}   
    a.valueOf = function(){return parseInt(a);}   
    alert(++a);//output:124   
    alert(a-0);//output:124。   


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cj205/archive/2010/10/31/5977876.aspx
分享到:
评论

相关推荐

    浅谈JavaScript 标准对象_.docx

    了解这些基础知识可以帮助避免常见的陷阱,提高代码的可读性和可靠性。在实际开发中,应谨慎使用包装对象,并确保对日期和时间的操作符合预期。对于类型检查,可以使用`instanceof`或`Object.prototype.toString....

    浅谈JavaScript对象与继承_.docx

    总的来说,JavaScript的对象和继承机制是其灵活性和强大性的体现,但同时也因为其独特的设计导致了一些误解和陷阱。理解这些概念对于深入学习和使用JavaScript至关重要。在实际开发中,开发者应根据需求选择合适的...

    浅谈Javascript数组(推举)_.docx

    然而,JavaScript数组在处理过程中可能存在一些陷阱。例如,不完全初始化的数组可能导致在不同浏览器上表现不一致: ```javascript var arr = [1, 2, ]; // 在某些浏览器中会产生[1, 2, undefined] var arr1 = [,,,,...

    浅谈JavaScript for循环 闭包

    JavaScript中的for循环是一个基础而强大的控制结构,它允许开发者执行重复性的任务。然而,在处理JavaScript中的闭包时,for循环...对for循环和闭包的理解能够帮助开发者避免常见的陷阱,编写出更加高效、清晰的代码。

    浅谈Javascript数组(推荐)

    JavaScript数组在处理时也会遇到一些边界情况和陷阱,例如通过索引直接赋值和使用`push`方法效果相同,但直接赋值可能导致属性而非数组元素的添加,这可能对数组的其他方法和操作造成影响。因此,在操作数组时应该...

    浅谈JavaScript数据类型及转换

    JavaScript是一种动态类型的编程语言,它的数据类型分为两大类:基本数据类型和引用数据类型。基本数据类型包括Boolean、Number、String、Undefined...理解这些基础概念将帮助你更好地理解和调试代码,避免常见的陷阱。

    浅谈JavaScript中变量和函数声明的提升

    理解提升机制可以帮助开发者避免一些常见的陷阱,例如: 1. 在JavaScript中应当尽量避免在同一作用域内用`var`多次声明同一个变量,即使后续赋值操作可能未执行。 2. 在编写函数时,要特别注意函数体内部使用`var`...

    ASP.NET编程之道.part1.rar

    陷阱18 编写JavaScript代码时的空格陷阱 陷阱19 使用可空符号??运算 陷阱20 获取错误信息并到指定页面 陷阱21 使用LINQ的First方法 陷阱22 文件格式与文件读取的陷阱 陷阱23 读写二进制文件的陷阱 陷阱24 母版页中...

    浅谈java对象转json,数字精确出现丢失问题

    在Java开发中,将对象转换成JSON格式是常见的操作,特别是在与前端交互时。然而,当我们处理包含大...在实际开发中,确保对大数字的处理方式有清晰的理解,能够避免这种常见的精度陷阱,提高前后端数据交换的准确性。

    浅谈js数组splice删除某个元素爬坑

    在JavaScript中,数组的`splice()`方法是一个非常强大的工具,可以用于添加、删除或替换数组中的元素。然而,如果不小心使用,它可能会...了解这些陷阱并正确使用`splice()`,可以帮助我们编写更健壮的JavaScript代码。

    浅谈使用mpvue开发小程序需要注意和了解的知识点

    【标题】:浅谈使用mpvue开发小程序需要注意和了解的知识点 【正文】: mpvue 是一个基于 Vue.js 的小程序框架,它允许开发者利用 Vue 的语法和生态系统来开发微信小程序。本文将深入探讨使用 mpvue 开发小程序时...

    浅谈使用splice函数对数组中的元素进行删除时的注意事项

    使用`for...in`循环的陷阱 需要注意的是,不建议使用`for...in`循环来处理数组的删除操作,因为它会遍历数组的索引而不是实际元素。当删除元素后,`for...in`循环仍然会继续检查已删除元素的下一个索引,导致跳过...

    浅谈jQuery绑定事件会叠加的解决方法和心得总结

    在JavaScript和jQuery的世界中,事件绑定是常见的交互...理解这些基本概念有助于避免类似的编程陷阱,提高代码的效率和可维护性。在日常开发中,我们应该养成良好的编程习惯,定期回顾和总结,以提升自己的技能水平。

Global site tag (gtag.js) - Google Analytics