JavaScript 基础
一、概念简介
二、基本类型
2.1 数值类型
2.2 字符类型
2.3 基本类型检测
三、引用类型
3.1 Object 类型
3.2 Array 类型
3.3 Date 类型
3.4 Funcation 类型
3.5 引用类型检测
四、内置对象
4.1 Global 对象
4.2 window 对象
五、作用域与闭包
5.1 作用域
5.2 作用域链
5.3 闭包
六、对象设计
6.1 数据属性
6.2 访问器属性
6.3 读取属性
6.4 创建对象
一、概念简介
JavaScript 是一种专为与网页交互而设计的脚本语言,由以下三个部分组成:
- ECMAScript:由 ECMA-262 定义,提供核心语言功能;
- 文档对象模型 (DOM):提供访问和操作网页内容的方法和接口;
- 浏览器对象模型 (BOM):提供与浏览器交互的方法和接口。
ECMAScript 提供了语言的核心功能,它定义了以下七种数据类型:
- 六种基本数据类型:
Undefined
,Null
,Boolean
,Number
,String
,Symbol
( ES 6新增 ); - 一种引用数据类型:统称为 Object 类型;具体又细分为
Object
,Array
,Date
,RegExp
,Function
等类型。另外和 Java 语言类似,对于布尔,数值,字符串等基本类型,分别存在其对应的包装类型 Boolean,Number,String,但通常我们并不会使用到这些包装类型,只需要使用其基本类型即可。
二、基本类型
2.1 数值类型
1. 进制数值
ECMAScript 中的 Number 支持以下三种常用进制:
- 十进制:正常数值就是十进制;
- 八进制:八进制字面值的第一位必须是零(0),然后是八进制数字序列(0~7);
- 十六进制:十六进制字面值的前两位必须是 0x,后跟任意的十六进制数字(0~9 及 A~F)。
console.log(56); // 56
console.log(070); // 56
console.log(0x38); // 56
2. 浮点数值
ECMAScript 的数值类型同样支持浮点数,但是由于保存浮点数值需要的内存空间是保存整数值的两倍,因此 ECMAScript 会尽量将浮点数值转换为整数值存储:
var a = 10.0;
console.log(a); // 10
和其他语言类似,浮点数中的数值也是不精准的,示例如下:
var a = 0.1; var b = 0.2;
a + b ; // 0.30000000000000004
a+b === 0.3 ; // false
如果想要对浮点数进行精确计算,可以使用 decimal.js , math.js 等第三方库。
3. 科学计数法
ECMAScript 支持使用科学计数法来表达数值:
8e-2 // 0.08
8e2 // 800
4. parseInt() parseFloat()
parseInt 可以用于解析字符串并返回整数,parseFloat 用于解析字符串并返回浮点数:
parseInt("56"); // 56
parseInt("0x38", 16); // 56 支持使用第二个参数来表示转换的进制
parseInt("56.6"); // 56
parseFloat("12.2"); // 12.2
parseInt("blue"); // NaN NaN用于表示一个本来要返回数值的操作却未返回数值的情况
5. toFixed()
toFixed 用于保留指定位数的小数,但需要注意的是其四舍五入的行为是不确定的:
1.35.toFixed(1) // 1.4 正确
1.335.toFixed(2) // 1.33 错误
1.3335.toFixed(3) // 1.333 错误
1.33335.toFixed(4) // 1.3334 正确
1.333335.toFixed(5) // 1.33333 错误
1.3333335.toFixed(6) // 1.333333 错误
想要解决这个问题,需要重写 toFixed 方法并通过判断最后一位是否大于或等于5来决定是否需要进位,具体代码如下:
// toFixed兼容方法
Number.prototype.toFixed = function(len){
if(len>20 || len<0){
throw new RangeError('toFixed() digits argument must be between 0 and 20');
}
// .123转为0.123
var number = Number(this);
if (isNaN(number) || number >= Math.pow(10, 21)) {
return number.toString();
}
if (typeof (len) == 'undefined' || len == 0) {
return (Math.round(number)).toString();
}
var result = number.toString(),
numberArr = result.split('.');
if(numberArr.length<2){
//整数的情况
return padNum(result);
}
var intNum = numberArr[0], //整数部分
deciNum = numberArr[1],//小数部分
lastNum = deciNum.substr(len, 1);//最后一个数字
if(deciNum.length == len){
//需要截取的长度等于当前长度
return result;
}
if(deciNum.length < len){
//需要截取的长度大于当前长度 1.3.toFixed(2)
return padNum(result)
}
//需要截取的长度小于当前长度,需要判断最后一位数字
result = intNum + '.' + deciNum.substr(0, len);
if(parseInt(lastNum, 10)>=5){
//最后一位数字大于5,要进位
var times = Math