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
分享到:
相关推荐
了解这些基础知识可以帮助避免常见的陷阱,提高代码的可读性和可靠性。在实际开发中,应谨慎使用包装对象,并确保对日期和时间的操作符合预期。对于类型检查,可以使用`instanceof`或`Object.prototype.toString....
总的来说,JavaScript的对象和继承机制是其灵活性和强大性的体现,但同时也因为其独特的设计导致了一些误解和陷阱。理解这些概念对于深入学习和使用JavaScript至关重要。在实际开发中,开发者应根据需求选择合适的...
然而,JavaScript数组在处理过程中可能存在一些陷阱。例如,不完全初始化的数组可能导致在不同浏览器上表现不一致: ```javascript var arr = [1, 2, ]; // 在某些浏览器中会产生[1, 2, undefined] var arr1 = [,,,,...
JavaScript中的for循环是一个基础而强大的控制结构,它允许开发者执行重复性的任务。然而,在处理JavaScript中的闭包时,for循环...对for循环和闭包的理解能够帮助开发者避免常见的陷阱,编写出更加高效、清晰的代码。
JavaScript数组在处理时也会遇到一些边界情况和陷阱,例如通过索引直接赋值和使用`push`方法效果相同,但直接赋值可能导致属性而非数组元素的添加,这可能对数组的其他方法和操作造成影响。因此,在操作数组时应该...
JavaScript是一种动态类型的编程语言,它的数据类型分为两大类:基本数据类型和引用数据类型。基本数据类型包括Boolean、Number、String、Undefined...理解这些基础概念将帮助你更好地理解和调试代码,避免常见的陷阱。
理解提升机制可以帮助开发者避免一些常见的陷阱,例如: 1. 在JavaScript中应当尽量避免在同一作用域内用`var`多次声明同一个变量,即使后续赋值操作可能未执行。 2. 在编写函数时,要特别注意函数体内部使用`var`...
陷阱18 编写JavaScript代码时的空格陷阱 陷阱19 使用可空符号??运算 陷阱20 获取错误信息并到指定页面 陷阱21 使用LINQ的First方法 陷阱22 文件格式与文件读取的陷阱 陷阱23 读写二进制文件的陷阱 陷阱24 母版页中...
在Java开发中,将对象转换成JSON格式是常见的操作,特别是在与前端交互时。然而,当我们处理包含大...在实际开发中,确保对大数字的处理方式有清晰的理解,能够避免这种常见的精度陷阱,提高前后端数据交换的准确性。
在JavaScript中,数组的`splice()`方法是一个非常强大的工具,可以用于添加、删除或替换数组中的元素。然而,如果不小心使用,它可能会...了解这些陷阱并正确使用`splice()`,可以帮助我们编写更健壮的JavaScript代码。
【标题】:浅谈使用mpvue开发小程序需要注意和了解的知识点 【正文】: mpvue 是一个基于 Vue.js 的小程序框架,它允许开发者利用 Vue 的语法和生态系统来开发微信小程序。本文将深入探讨使用 mpvue 开发小程序时...
使用`for...in`循环的陷阱 需要注意的是,不建议使用`for...in`循环来处理数组的删除操作,因为它会遍历数组的索引而不是实际元素。当删除元素后,`for...in`循环仍然会继续检查已删除元素的下一个索引,导致跳过...
在JavaScript和jQuery的世界中,事件绑定是常见的交互...理解这些基本概念有助于避免类似的编程陷阱,提高代码的效率和可维护性。在日常开发中,我们应该养成良好的编程习惯,定期回顾和总结,以提升自己的技能水平。