1)toFixed与toPrecision
toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
toPrecision() 方法用来指定有效数位的显示位数,可在对象的值超出指定位数时将其转换为指数计数法。
var a = 42.59;
a.toFixed( 0 ); // "43"
a.toFixed( 1 ); // "42.6"
a.toFixed( 3 ); // "42.590"
a.toPrecision( 1 ); // "4e+1" 大于10的会自动转指数计数
a.toPrecision( 2 ); // "43"
a.toPrecision( 3 ); // "42.6"
a.toPrecision( 5 ); // "42.590"
// 无效语法:
42.toFixed( 3 ); // SyntaxError 因为'.'被视为常量 42. 的一部分
//(var a=42.;是合法的声明,等价于var a=42.0;),所以没有'.'属性访问运算符来调用 tofixed 方法。
// 下面的语法都有效:
(42).toFixed( 3 ); // "42.000"
0.42.toFixed( 3 ); // "0.420"
42..toFixed( 3 ); // "42.000"
42 .toFixed(3); // "42.000" 42后有空格
2)进制表示
0xf3; // 243的十六进制
0Xf3; // 同上
0363; // 243的八进制 从 ES6 开始,严格模式(strict mode)不再支持 0363 八进制格式
0o363;//取而代之的是0o363表示8进制
0b11110011; // 243的二进制
3)void
function doSomething() {
// 注: APP.ready 由程序自己定义
if (!APP.ready) {
// void加在延时函数前代表立即返回undefined,
return void setTimeout( doSomething,100 );
}
var result;
// 其他
return result;
}
//void可以确保if不会错误判断
if (doSomething()) {
// 立即执行下一个任务
}
4)NaN
不是数字的数字。
var a = 2 / "foo"; // NaN
typeof a === "number"; // true
NaN == NaN;//false
//NaN 是一个特殊值,它和自身不相等,是唯一一个非自反的值。
//isNaN() NaN和非数字(字符串等)都会返回true;
var a = 2 / "foo";
var b = "foo";
a; // NaN
b; "foo"
window.isNaN( a ); // true
window.isNaN( b ); // true
//ES6之后可以用Number.isNaN()判断NaN
Number.isNaN(a);//true
Number.isNaN(b);//false
//Es6之前我们可以根据NaN的特点自己判断
typeof n === "number" && isNaN( n );//方式一
n !== n;//方式二 利用了NaN是唯一不等于自身的特性
5)-0
javascript中是存在-0的。也许有的是用来表示画面位移方向的。
-0 == 0; // true
-0 === 0; // true
0 > -0; // false
//ES6加入 Object.is(..) 来判断两个值是否绝对相等
var a = 2 / "foo";
var b = -3 * 0;
Object.is( a, NaN ); // true
Object.is( b, -0 ); // true
Object.is( b, 0 ); // false
//但效率不及==和===,可以用==替代时不建议使用
6)值与引用
var a = 2;
var b = a; // b是a的值的一个副本
b++;
a; // 2
b; // 3
var c = [1,2,3];
var d = c; // d是[1,2,3]的一个引用,同指一块内存区域
d.push( 4 );
c; // [1,2,3,4]
d; // [1,2,3,4]
d.length = 0;
d.push(1);
d.push(2);
console.log(c);//[1,2] 修改同指的那片内存区域,因此c也跟着变化了
d = [4,5,6];//[4,5,6] d指向一片新的内存区域[4,5,6],不会改变c的指向,因此c还是[1,2,3,4]
6.1)传入形参不改变的方式:
function foo(x) {
x.push( 4 );
x; // [1,2,3,4]
// 然后
x.length = 0; // 清空数组
x.push( 4, 5, 6, 7 );
x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // 是[4,5,6,7],不是[1,2,3,4]
a=[1,2,3,4];
foo( a.slice() );//a.slice()传入的是a的浅复制副本,因此不会改变a的那块内存区域
a;//还是[1,2,3,4]