在任何一种编程语言中,字符串、数组、数值都是构建程序的基础,但JS中的这几个类型有一些特性是须要你掌握的,充分理解这些特性有助于你更好的使用JS。

数组(有序类型值的集合)

JS的数组元素很宽松,可以容纳任何类型的值做为元素,而且也不须要事先声明数组的大小。

['',1,true,null,undefined,{},[],Symbol('1'),function foo(){}];

可以使用 delete 操作符删除数组中的元素,但只会留下 undefined ,并不会改变数组长度 , delete 详见 第五章

PS: 可以通过 设置 length 属性改变数组,那这可以当成 slice 方法用吗??

构建空数组虽然没有什么用,但还是告诉你如何做

new Array(3); // [undefined × 3] 这并不是有3个空元素的数组,因此不能用 map、forEach 等方法遍历
Array.apply(null,{length:3}); // [undefined, undefined, undefined] 正确的方法

女子孑亥子讠青不要学习创建空数组,因为它实在没什么卵用。

数组是Object的子类,因此有个问题就是你可以把数组当成对象来用,可真是闲得蛋疼...

var a = [];
a.foo = 'foo';
a['12'] = 0; // [undefined × 12, 0]

类数组

有时你想将一些数组的特有方法用到其他类型的值上,比如要 indexOf() concat() forEach() 等用到像 DOM 元素这种类数组元素。另一种常见常见的用处就是获取函数的参数。

方法1 : Array.prototype.slice.call()

function foo() {console.log(Array.prototype.slice.call( arguments ))};
foo(1,2,3); // [1,2,3];
Array.prototype.slice.call( '123456').reverse().join('') // "654321" 这是我能想到的一个用法?

方法2 : Array.from() 这种方法 ES6 才支持,用法同上。

关于数组的小结

  1. delete 可以删除数组元素,但不会更新数组长度
  2. 数组可以当成对象来玩,添加非序号key不会改变数组的长度
  3. 不要创建空数组,年轻人不要总想搞出个大新闻
  4. 可以使用 Array.prototype.slice.call() 或 Array.from() 方法将类数组元素变成数组。

字符串(简易数组)

JS中的字符串有点类似一个简易版的数组,因为

'hello'.length; // 5
'the is 3'.indexOf('i'); // 4
'hello'.concat( ' world' ); // 'hello world'

这几个方法都让字符串看来像个数组,然而

'string'[2] = 'some'; //  只读

字符串是不能修改的,而数组则可以,还有用索引访问字符串并不是好方法,正规的方法是

'string'.charAt(1); // 't'

在JS里反转字符串是一件麻烦事

'1234'.split('').reverse().join(''); // '4321'

这个看起来比上面那个简单点,但依然不怎么样,我想可以直接改写 String()的prototype了...这主意...怎..么..样

String.prototype.reverse = function () { return this.split('').reverse().join('') };
'世界和平'.reverse(); // "平和界世"

其实这里我有点不解,为什么 this.split('') 能直接对 [[PrimitiveValue]] 取值呢?

string

数值(整数+浮点)

由于JS只有一种双精度浮点数,所以严格意义上来说JS中并没有真正意义上的整数

由于装箱 (第三章)的原因,JS中的数值也可以拥有一些方法比如

5000000000000 .toExponential(); // "5e+12"
4.23424 .toFixed(2); // "4.23"
33.332 .toPrecision(1); // "3e+1"

注意到空格了吗,这是JS的一个特点,JS会把数值中的第一 '.' 当成小数点,下面这几种方法都是可行的

(42).toFixed(1);
0.42.toFixed(1);
42..toFixed(1);
42 .toFixed(1);

当然这种写法让人十分困惑,在写代码时不要这么用。

... 二进制、八进制、十六进制...跳过

小数值

0.1 + 0.2 === 0.3 // false;    

这一点都不好玩,那我们怎么比较小数呢,chrome 和 ES6 都提供了一个误差值 Number.EPSILON 可以根据这个误差精度来判断两个小数值是不是近似相等;

(function (n1,n2) { return Math.abs(n1-n2) < Number.EPSILON;})(0.1+0.2,0.3);// true

特殊值(null undefined NaN +-0 void)

PASS

值和引用

在JS中,没有指针的概念,JS中的引用让所有变量共享一个类型值

简单值(又叫做标量)只能通过复制值传递,如null undefined string number boolean 以及ES6 中的symbol

复合值(包括 Object 的各种子类型)只会复制一个引用给新的变量,值确是共享的。

var a = [1,2,3];

var b = a;   

a[0] = 0;

b[0]; // 0 

如果你想复制一个数组,只能用一些其他的方法比如

var arrayCopy = [1,2,4].slice(); // 复制一个数组