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.pow(