### 值
#### 一、数组
数组本身就是对象
```
var a = [0];
a.length; //1
a["name"] = "qc";
a.length; //1
a["name"]; //qc
a.name; //qc
var b = [0];
b.length; //1
//如果属性能被强制转换为十进制数字时,将会被当做数组索引使用
b["10"] = 42;
b.length; //11
```
伪数组使用数组的api
```
function foo() {
var arr = Array.prototype.slice.call(arguments);
arr.push('bam');
console.log(arr);
}
foo('bar', 'baz'); // ['bar', 'baz', 'bam']
```
#### 二、字符串
字符串如何借用数组的api
```
var a = "foo";
var c = Array.prototype.join.call(a, "-"); //f-o-o
var d = Array.prototype.map.call(a, function(v) {
return v.toUpperCase() + "."
}).join(""); //F.O.O.
```
#### 三、数字
js使用的是双精度格式的浮点数(即64位二进制)
```
var a = 42\42.5\.5\42.\42.0
var b = 5E10 //50000000000
b.toExponential(); //"5e+10"
//特别大和特别小的数字默认使用指数格式
var c = b * b; //2.5e+21
```
小数点非0数字后面的所有0都会被忽略掉
toFixed和toPrecision
```
var a = 42.59
a.toFixed(0); //"43"
a.toFixed(1); //"42.6"
a.toFixed(2); //"42.59"
a.toFixed(3); //"42.590"
a.toFixed(4); //"42.5900"
a.toPrecision(1); //"4e+1"
a.toPrecision(2); //"43"
a.toPrecision(3); //"42.6"
a.toPrecision(4); //"42.59"
a.toPrecision(5); //"42.590"
a.toPrecision(6); //"42.5900"
```
```
var a = 42;
a.toFixed(3); //"42.000"
//.被视为42的一部分
42.toFixed(3); //SyntaxError
(42).toFixed(3); //"42.000"
//相当于(42.).toFixed(3),第一个.被视为42的一部分,第二个.调用toFixed
42..toFixed(3); //"42.000"
```
小数的运算
```
0.1 + 0.2 != 0.3 //相加的结果可能是0.30000000000004
//常见的解决方案是指定一个误差范围
if(!Number.EPSILON) Number.EPSILON = Math.pow(2, -52);
function isEqual(n1, n2) {
return Math.abs(n1, n2) < Number.EPSILON;
}
isEqual(0.1 + 0.2, 0.3) ; //true
```
整数的安全值范围是-2^53 + 1到2^53 - 1,超过这个范围就会产生精度丢失,变为无穷数Infinity
检测一个变量是否是整数
```
//es6
Number.isInteger(n);
//es5
//typeof NaN 一样是number
//NaN % 1 -> NaN
typeof n == "number" && n % 1 == 0
```
检测一个数字是否安全
```
//es6
Number.isSafeInteger(n);
//es5
typeof n == "number" && n % 1 ==0 && Math.abs(n) <= Number.MAX_SAFE_INTEGER
```
#### 四、特殊数值
null和undefined的区别
null指空值,undefined指没有值;null指曾赋过值,现在没有值,undefined值从未赋过值;null是特殊关键字,不是标识符,不能当做变量来使用,而undefined是标识符,可以当做变量使用。
void:让表达式不返回值,但变量本身没有被更改
```
var a = 2;
console.log(void a, a); //undefined 2
```
任何与NaN所做的比较均为false
```
var a = 2 / "foo";
a; //NaN
a == NaN; //false
a === NaN; //false
NaN !=(!===) NaN; //true
```
比较两个值是否相等(适用于所有情况)
```
//es6
Object.is(a, b)
//es5
Object.is = function(a, b) {
if(a === 0 && b === 0) {
return 1 / a === 1 / b //-0的情况,因为1/-为-Infinity, 0===-0为true
}
if(a !== a){
return b !== b //NaN的情况
}
else {
return a === b
}
}
```
#### 五、值和引用
单值:number、string、null、undefined、boolean
复合值:object(包括array)、function
```
var a = [1, 2, 3];
var b = a;
b.push(4);
a; //[1, 2, 3, 4];
//改变了b的引用
b = [7, 8, 9];
b.push(10);
b; //[7, 8, 9, 10]
a; //[1, 2, 3, 4]
//只是清空数组,并没有更改引用
b = a;
b.length = 0;
b; //[]
a; //[]
```
- 你不知道的JS上
- 第一部分 第三章 函数作用域和块作用域
- 第一部分 第四章 提升
- 第一部分 第五章 闭包
- 第二部分 第一章 关于this
- 第二部分 第二章 this全面解析
- 第二部分 第三章 对象
- 第二部分 第五章 原型
- 第二部分 第六章 行为委托
- 你不知道的JS中
- 第一部分 第二章 值
- 第一部分 第三章 原生函数
- 第一部分 第四章 强制类型转换
- 第一部分 第五章 语法
- 第二部分 第一章 异步
- 第二部分 第三章 Promise
- 第二部分 第四章 生成器
- 第二部分 第五章 性能
- 你不知道的JS下
- 第一部分 总结
- 第二部分 第二章 语法
- 第二部分 第三章 代码组织
- 第二部分 第四章 Promise
- 第二部分 第五章 集合
- 第二部分 第六章 新增API
- 第二部分 第七章 元编程
- 第二部分 第八章 ES6之后