第1章 类型
检测null值类型
1
2var a=null;
(!a && typeof a==="object");变量没有类型,只有值才有类型。变量可以随时持有任何类型的值。
在对变量执行typeof操作时,得到的结果并不是该变量的类型,而是该变量持有的值的类型
ReferenceError:b is not defined
是指变量undeclared应对多个脚本文件在共享命名空间中加载变量的情况,有两种方法:
- 使用typeof Undeclared安全防范机制
- 检查全局变量,访问不存在的对象属性不会产生ReferenceError错误
第2章 值
数组
使用delete运算符可以将单元从数组中删除,但是单元删除后,数组的length不会发生变化
数组也是对象,可以包含字符串键值和属性
1
2
3
4
5
6var a=[];
a[0]=1;
a["footer"]=2;
a.length; //1
a["footer"]; //2
a.footer; //2如果字符串键值能够被强制类型转换成十进制数字的话,它就会被当做数字索引来处理
1
2
3var a=[];
a["13"]=42;
a.length; //14将arguments对象(类数组)将函数的参数当做列表来访问
1
2
3var arr=Array.prototype.slice.call(arguments);
// 以上在ES6中已经废除,在ES6中使用如下形式
var arr=Array.from(arguments);
字符串
字符串不可变是指字符串的成员函数不会改变其原始值,而是创建并返回一个新的字符串,而数组的承运函数都是在其原始值上进行操作。
虽然字符串没有这些函数,但是可以通过“借用”数组的非变更方法来处理字符串
字符串反转,
split
会把字符串转成字符数组,join
会把字符数组变成字符串1
2var a="foo";
var c=a.split("").reverse().join(""); // "oof"
数字
JavaScript使用64位二进制存储数字
toExponential():科学计数法
tofixed():指定小数部分的显示位数
toPrecision():指定有效数位的显示位数
42.toFixed(3)
无效,但是42..toFixed(3)
有效,因为.
运算符会被优先识别为数字常量的一部分,然后才是对象属性访问运算符0.1+0.2===0.3//false
处理误差范围值,通常称为“机器精度”1
2
3function numbersCloseEnoughtToEqual(n1,n2){
return Math.abs(n1-n2)<Number.EPSILON
}最大浮点数 Number.MAX_VALUE
最小浮点数 Number.MIN_VALUE
安全呈现的最大整数 Number.MAX_SAFE_INTEGER
安全呈现的最小整数 Number.MIN_SAFE_INTEGER
void ___返回结果是undefined
特殊的数字
NaN
- 不是数字的数字
唯一的非自反值
ES6开始使用
Number.isNaN(…)
ES6之前使用如下代码
1
2
3
4
5
6
7
8if(!Number.isNaN){
Number.isNaN=function(n){
return(
typeof n==="number"&&
window.isNaN(n)
)
}
}
无穷数
- 可以从有穷走向无穷,但无法从无穷回到有穷
- Infinity/Infinity结果是NaN
负零
区分0和-0
1
2
3
4function isNegZero(n){
n=Number(n);
return (n===0)&&(1/n===-Infinity);
}ES6中Object.is(..)处理特殊值的相等比较
值和引用
引用无法改变另外一个引用的指向
1
2
3
4
5
6
7
8
9
10function foo(x){
x.push(4);
x; //[1,2,3,4]
x=[4,5,6];
x.push[7];
x; //[4,5,6,7]
}
var a=[1,2,3];
foo(a);
a; // [1,2,3,4]函数传递a的时候,将引用a的复本赋值给x,但a仍然指向[1,2,3]。x=[4,5,6]并不影响a的指向
有两种方式:值复制、引用复制。基本数据类型是值复制,引用数据类型是引用复制。如果要让基本数据类型使用引用复制,可以写在一个对象中,相对的,也可以将引用类型进行一次浅复制。
标量基本类型值是不可更改的
1
2
3
4
5
6
7function foo(x){
x=x+1;
}
var a=2;
var b=new Number(a);
foo(b);
console.log(b); //Number {2}