记录一些学习Javasrcipt中要注意的地方
关于NAN
NaN这个特殊的Number与所有其他值都不相等,包括它自己:
NaN === NaN; // false
唯一能判断NaN的方法是通过isNaN()函数:
isNaN(NaN); // true
浮点数的比较
1 / 3 == (1 - 2 / 3); // false
1 / 3 === (1 - 2 / 3); // false
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
关于空
- 0是一个数值;
- ‘’表示长度为0的字符串;
- null表示“空”;
- undefined表示值未定义。
关于最后两者,大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
字符串
需要特别注意的是,字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:
var s = 'Test';
s[0] = 'X';
alert(s); // s仍然为'Test'
JavaScript为字符串提供了一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串
。
总结:string有其不可变的原始值。
数组
数组的赋值
Array可以通过索引把对应的元素修改为新的值,因此,对Array的索引进行赋值会直接修改这个Array:
var arr = ['A', 'B', 'C'];
arr[1] = 99;
arr; // arr现在变为['A', 99, 'C']
总结:数组为object,对象中的值是可改变的。
数组中的逗号问题
数组直接量的语法允许有可选的结尾的逗号:
var arr1 = [1,2,3, ];
alert(arr1.length); // 3,而不是4;
左值
变量、对象属性和数组元素均是左值。
ECMAScript规范允许内置函数返回一个左值,但自定义函数则不能返回左值。
“ + ” 运算符
运算结果是依赖于运算符的运算顺序的,比如:
1 + true + "string"; → "2string";
1 + (true + "string"); → "1truestring"
&& and || 短路现象
&& 逻辑与运算
var obj = { a:1 };
var p = null;
o && obj.a; // 1: obj 是真值,因此返回值为 obj.a ;
p && p.a; // null: p 是假值,因此将其返回,而并不去计算 p.a,所以没有报错;
例如:
if(a == b) stop(); //只有在a == b 的时候才调用 stop();
(a == b) && stop(); //同上;
|| 逻辑或运算
通常喜欢使用逻辑或的短路运算给参数默认值
function getSum(a,b,c){
//通常喜欢使用逻辑或的短路运算给参数默认值
a = a || 0;
b = b || 0;
c = c || 0;
return a + b + c;
}
console.log(getSum(1,2,3));
console.log(getSum(1,2));
Date 日期对象
日期的声明
var d1 = new Date(2016,8,22); //2016,9,22
var d2 = new Date("2016,8,22"); //2016,8,22
获取时间
var d3 = new Date("2016,10,15");
d3.getDate(); // 获取星期数 0~6
d3.getDay(); // 获取一个月中的天数
d3.date.getMonth(); //9 获取月份数,0-11,