Javascript中的类型和语法(二) -- 数字

博客介绍了JavaScript中数字的相关特性和方法。包括toFixed()和toPrecision()方法对数字的处理,进制表示,void、NaN、-0的概念,还提及了值与引用中传入形参不改变的方式,有助于了解JavaScript数字操作细节。

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Funnee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值