数组(array)
JavaScript 中,数组能够包容任何类型的值
- 多维数组
var a = [1, '2', [3]]a.length // 3a[0] // 1a[2][0] // 3
留神:应用 delete 能够删除数组中的元素,但不会扭转数组的 length 属性。
- 稠密数组
- 数组的索引能够是数字,能够是字符串
var a = []a[0] = 1;a['demo'] = 2a.length // 思考一下:这里为什么是1,不是2a['demo'] // 2a.demo // 2
留神:数组中的字符串键值和属性不会计算在数组的长度中。
var a = []a['11'] = 23 // 11会被当成索引,不会存储为keya.length // 12
留神:如果数组的索引是可能被转为数字的话,它会被当成数字索引。
- 类数组
一组通过数字索引的值(如 arguments,DOM 元素列表...)
类数组转换为数组(slice)
function demo() { var args = arguments var arr = Array.prototype.slice.call(args) arr.push('zbw') console.log(arr)}demo('kyrie', 'wen') // ['kyrie', 'wen', 'zbw']
ES6 的 Array.from(...)也能够实现转换
var arr = Array.from(arguments)
字符串(string)
字符串常常被当成字符串数组。
var a = 'wen'var b = ['w', 'e', 'n']
字符串也是类数组,也有 length 属性,也能够调用数组的办法(indexof,concat...)
var a = 'wen'var b = ['w', 'e', 'n']a.indexof('e') // 1b.indexof('e') // 1var c = a.concat('wen') // 'wenwen'var d = b.concat(['w', 'e', 'n']) // ['w', 'e', 'n', 'w', 'e', 'n']
- 字符串和数组的区别
字符串是不可变的,而数组是可变的。
字符串不可变是指它的成员函数不会扭转原始值,而是创立一个新的字符串。
数组的成员函数是在原始值上进行操作。
var a = 'wen'b = a.toUpperCase()a // 'wen'b // 'WEN'a === b // false
另一个不同点是字符串反转(面试题)。数组有一个成员函数 reverse(字符串没有)
// 字符串反转var a = 'kyrie'var res = a.split().reverse().join()console.log(res) // 'eiryk'
字符串反转:先将字符串转为数组(spilit),而后将数组反转(reverse),最初再转回字符串(join)。
数字(number)
number:惟一的数值类型(整数和小数)
其实,JavaScript 没有真正意义上的整数,怎么了解?
整数就是没有小数的十进制数,JavaScript 中,11.0 等同于 11
var num1 = 11var num2 = 11.23// 数字前、后的0都可省略var num3 = 0.11var num4 = .11var num5 = 11.00var num6 = 11. // 个别不这么写,代码可读性间接 42
- 指定小数局部的显示位数(toFixed)
var num = 11.23num.toFixed(0) // 11num.toFixed(1) // 11.2num.toFixed(2) // 11.23num.toFixed(3) // 11.230
留神:如果指定的小数局部的显示位数大于理论位数,会用 0 补齐。
- toFixed 也实用于数字常量
// 报错11.toFixed(2)// 不会报错 失常(11).toFixed(2) // 11.000.11.toFixed(1) // 0.111 .toFixed(3) // 11.000 不倡议 多个空格很奇怪11..toFixed(3) // 11.000 不倡议 2个.也很奇怪
留神:42.toFixed(2)是有效语法,因为.会被当作常量 42.的一部分,所以没有属性拜访运算符来调用 toFixed 办法。(所以再加一个.就好了)
- 较小的数值
二进制浮点数最大的问题(经典面试题)
0.1 + 0.2 === 0.3 // false what???
从数学角度来说,下面的条件判断应该为 true,可后果为什么是 false 呢?
简略来说,**二进制浮点数中的 0.1 和 0.2 并不是非常准确,它们相加的后果并不是刚好等于
0.3,而是一个比拟靠近的数字 0.30000000000000004**,所以条件判断后果为 false。
怎么判断 0.1 + 0.2 和 0.3 是否相等?
最常见的办法是设置一个误差范畴值,通常称为“机器精度”。对于 JavaScript 来说,这个值通常为 2^-52
从 ES6 开始,该值定义在 Number.EPSILON 中,间接应用:
function numToEqual(num1, num2) { return Math.abs(num1 - num2) < Number.EPSILON;}var a = 0.1 + 0.2;var b = 0.3;numToEqual(a, b) // true
非凡数值
- 不是值的值
undefined 类型只有一个值,undefined,null 类型也是只有一个值,null,它们的名称既是类型也是值。
nul 和 undefined 的区别
- null 已经赋过值,但目前没有值
- undefined 从未赋值
null 是一个关键字,不是标识符,不能用作变量名称。
undefined 是标识符,可当作变量来应用
var null = 11 // 非法var undefined = 11 // 非法,但千万别这样做
留神:永远不要从新定义 undefined
- void 运算符
undefined 是一个内置标识符(除非被从新定义),它的值为 undefined,
通过 void 运算符即可失去该值。
var a = 11console.log(void a, a) // undefined 11
void 并不扭转表达式的后果,只是让表达式不返回值,能够用 void 0 来取得 undefined,void 0 和 void 1, void ...并没有本质上的区别,都是 undefined。
function demo() { if (error) { console.log(error) return void dosomething(error) }}
为了让 if 语句进行向下运行,所以应用 void 表达式,下面例子是等同于:
if (error) { dosomething(error) return}
- 非凡的数字(NaN)(not a number)
通过数学运算符(+、-、x、/)失去的如果不是一个有效数字,就会返回 NaN。
var a = 11 / 'kyrie' // NaNtypeof a // 'number'
能够看到,NaN 也是数字类型。
NaN 是一个“戒备值”,用于指出数字类型的谬误状况,即“执行数学运算没有胜利”。
- 检测 NaN
var a = 11 / 'kyrie'a == NaN // falsea === NaN // false
留神:NaN 是一个非凡值,它不等于本身,惟一一个非自反(自反,x === x 不成立)的值。
所以,咱们能够利用 NaN 不等于本身的个性来检测一个变量的值是否为 NaN
function isNaN(n) { return n !== n;}var a = 11 / 'kyrie'isNaN(a) // true
- 无穷数
var a = 11 / 0 // Infinity(正无穷大)var a = -11 / 0 // -Infinity(负无穷大)
留神:Infinity / Infinity 后果为 NaN, 正整数除以 Infinity 后果为 0
- 零值
JavaScript 中有一个惯例的 0 和一个-0
var a = 0 / -11 // -0var b = 0 * 11 // 0
加减法不会失去-0
留神:依据标准,对-0 进行字符串化(stringify)会返回'0',对'-0'转换为数字(Number/parse)是 -0
var a = 0 / -11JSON.stringify(a) // '0'var b = '-0'JSON.parse(b) // -0
JSON.stringify(-0)返回 0,JSON.parse('-0')返回-0。
- 如何辨别 0 和-0
0 === -0 // truefunction isNegZero(n) { n = Number(n); return (n === 0) && (1 / n === -Infinity);}isNegZero(-0) // trueisNegZero(0) // false
- 为什么须要-0
有些时候,咱们须要用数字的符号位(+ / -)来代表某些信息(比方挪动方向),如果一个值为 0 的变量没有符号位(即+ / -),那么会失落方向信息。所以这也是为什么须要-0 的起因。
- ES6 的工具函数:Object.is()
var a = 11 / 'kyrie';var b = -11 / 0;Object.is(a, NaN) // trueObject.is(b, -0) // trueObject.is(b, 0) // false
总结
- JavaScript 中的数组是通过数字索引的一组任意类型的值。
- null 类型只有一个值 null,undefined 类型也只有一个值 undefined。所有变量在未赋值前默认都是 undefined,void 运算符返回 undefined。
- 数字类型有几个非凡值,包含 NaN(not a number)、Ifinity、-Infinity 和-0。