梁小新blog

Javascript中注意之处

记录一些学习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,