变量的作用域
在js中闭包和函数都是独立的域,域和域之间可以嵌套,嵌套的域被成为子域。
在域中用var声明的变量只在当前域和当前的子域起作用
缺少var的声明以及在域之外声明的变量为全局变量。
当前域的变量会影藏上一级别域声明的变量
*在javascript中,没有块级别的作用域,也就是说在一个函数中声明的变量,在函数(闭包)中的任何地方都可以访问到,比如说,下面这段代码在javascript中是正确的:
For(var i=0;i<10;i++){
List[i]=I;
}
Document.write("最后一个值是"+List[i-1]);//外面也可以访问到I这个变量。
你可以理解为,除了闭包和函数之外的程序段落都不是域。
表达式相关的问题
用+来把数值转换成字符串
Var a = 1.78;
Var b = 3.44;
Alert(a+""+b);
这个返回的实际上是1.783.44不是一个计算的结果
减号可以用来将一个字符串快速转化为一个数值,这个在输入计算时候有用,而且比parseFloat效率更高,语法也更简练
比如:
Var a = "5.66";
Alert (a+1);//这个返回5.661
Alert(a-0+1);//这个返回4.66
//但是parseFloat和直接用减号也是有区别的看下面的
parseFloat("123456abd");//返回123456
"123456abd" -0;//返回NaN
乘法和除法的类似,与C#不同算法的异常不会导致系统的错误,而是返回一个NaN
Math.Float()用来处理数的精度问题
在比较运算符中,只要有一边的值为NaN,那么表达是就返回false,不解释
关于引用类型的相等性,只有引用同一个对象==才返回true。一个引用类型的深度相等比较
//判断一个对象是否和另一个对象相等
Object.prototype.equel = function (o) {
if (o == this) { return true; }
if (this.constructor && o instanceof this.constructor) {
for (var each in this) {
if (each in o) {
if (typeof (o[each]) == "function" && !o[each].equel(this[each])) {
return false;
} else if (o[each] != this[each]) {
return false;
}
return true
} else {
return false;
}
}
}
return false;
}
这里有2个知识点,一个是任何一个对象,可以通过索引的方式来访问其值o[each]
2.要比较2个对象是不是相同类型,用这个方法:o instanceof this.constructor
===这个比交符号,不会对2边的符号进行类型转换,完全相等,包括类型,双等号,会有类型转换的相等,同时注意,如果有一边是NaN,或者undefined其返回的类型将是false
注意短路的逻辑判断一个很好的代码风格:
If(a==b){ dosomething();}
a!=b||dosomething();
这2个是等价的
主要来讲讲对象运算符号:
In:
Var point ={x:1,y:2};
Var bel = "x" in point
这个表达式返回true,in将一个对象当作一个集合来运作,这是一个方便高效的设计方法。
同时继承的属性也能用in来访问到
"toString" in point 返回true的结果
instanceof:
"" instanceof Object
{} instanceof Object
[] instanceof Array
这些都返回true,注意右边要是类型,左边是对象。
new:
这个不解释
delete:
这个用来删除一个元素,属性,或者数组,不是所有的属性和变量都能被删除,内部核心属性,客户端属性,var声明的属性,都是不能被删除的
删除成功返回true否则返回false,删除一个不存在的属性也返回true
var aSet = new Object();
if ("Key1" in aSet) {
delete aSet["key1"];
}
aSet["key1"] = true;
if (delete aSet["key2"]) {
aSet["key2"] = true;
}
注意对象属性的2种写法都是可以的
var a = new Object();
a.x = 1;
alert(a['x']);
var b = [1, 2, 3 ];
alert(b[1]);
类型运算符
typeof:
数值返回 number
布尔返回Boolean
字符返回string
对象数组和null返回:Object
函数类和闭包返回:function
未定义未赋值返回:indefined
这个用来做运行时类型检查:
This.__arr = typeof(array)=="string"?array.split(","):array;
Void(0) 用来生成 undefined值,没什么用处
函数调用运算符号()