简介
任何一门语言,其最重要的基础莫过于这门语言对于数据的处理方式,语法只是用法,我们更需要深入了解一门语言关于地址,变量,传值,回收,顺序等等性质,这对于我们构建健硕的代码具有重要的作用。也能大大增加语言的安全性。
JS的数据类型
上述内容来自权威指南
其中对象的范围很广,函数,数组均是一种特殊的对象,又由于class(类)是又构造函数带来的
基础数据类型
Number
JS中,数字是一个很重要的数据类型,它涵盖了浮点数,整数等等。
js不区分浮点数和整数,使用IEEE 754标准定义的64位浮点数(实际操作是基于32位的),和其他语言一样,js浮点数也是不精准的,存在误差,毕竟是二进制表达法,而且实数是无限的,自然不可能用64位就轻松表示出来。(连0.1都表达不精准)
由于number是64位的,因此表示范围如下:
1.79 E+308, 5 E-304
-2^53 , 2^53,安全整数,意味着要one by one
数字的高级算术运算可以通过调用Math实现,而且要注意,溢出了也不会报错,有一个无穷大的值:正负infinity,无限接近于0则返回负零,如果不是数字,那就变成NaN。
String
字符串是一组由16位字符组成的不可变有序序列,每个字符都来自于Unicode字符集。
有些字符不能够用16位表示的需要2个16位值表示,这种论外,特殊情况特殊处理。
string是不可变的,这意味着string是不能够修改值的,其修改,本质上其实是重新创建。
常用方法:charAt,substring(substr功能一样,但是参数不一样,前者是两个下标,后者是下标+长度,slice功能也一样,但是slice可以取负数),indexOf,split,replace
正则表达式比较难,建议单独学习。
Boolean
布尔值
包装方法:toString
null
这个用来代表空值,typeof为“object”,是一个特殊对象,含义是非对象
undefined
这个更深层次的空值,typeof为“undefined”,代表这个值就没有给出过值。与null不一样的是,null是有值,只不过这个值是空的。他不是一个对象。
对象类型
数组,函数均是特殊对象类型,而且普通数据类型也有对应的对象包装。这也是为什么这些数据类型可以调用方法的原因。
比如说string调用substr时,本质上系统是new了一个string对象,这个对象会调用substr方法,然后调用完就销毁掉这个对象。
由于null和undefined没有包装对象,所以没有方法,判断类型要用Object原生方法,当然,typeof也可以判断一些类型(可以判断undefined),instanceof也可以判断类型。
下面给个有趣的,理解透了应该就熟悉了:(关于null和undefined的,可以自己实验)
var a = new Number(1);
console.log(a instanceof Object);//true
var b = Number(1);
console.log(b instanceof Object);//false
var c = [1,2];
console.log(Object.prototype.toString.call(c));//[object Array]
Array
js中的数组是一种特殊的对象,无声明的值为undefined(例如[1,2,2]),js中数组元素没有类型限制,比较方便。
数组判断类型可以用isArray函数。
如上,类似的结构,有一种叫伪数组的东西,区别是没有原生方法,foreach不能遍历伪数组。
还有一点比较有趣,对于一个数组,我们可以忽略其长度,对超过长度的索引赋值,结果就是数组被强行扩充了,多出来的空位甚至连索引都没有(不是undefined)
常用方法:sort() splice() slice() push() pop() unshift() shift()等
ES5: foreach() map() filter() 等
Function
function说实话应该从对象那里独立出来,比较js给了那么多特定的语法和功能了。所以千万不要把对象那一套搬在function上使用。有些思路倒是可以靠着函数与对象之间的关系进行分析,特别是原型链,这个在我前面的文章有讲过。简单来说,就是所有对象都有其__proto__所在,它指向产生这个对象的原型,而所有函数都有prototype,它们也有一个__proto__存在,它指向产生这个函数的原型。你会发现,函数的原型居然是Object()!可以说,在js里,对象就是万物起源。
先说说区别,普通对象是没有prototype的,只有函数有。普通对象有__proto__,但是函数没有,函数的原型才有。(换句话说,函数的原型就是一个普通对象),函数通过这个原型获得了很多便利。
new操作符,其实就是一个简写,把创建空对象,原型链指向,this定向,返回对象的操作一并给做了。
型才有。(换句话说,函数的原型就是一个普通对象),函数通过这个原型获得了很多便利。
new操作符,其实就是一个简写,把创建空对象,原型链指向,this定向,返回对象的操作一并给做了。
总结
很多东西挖细了都挺难的,js是一门非常特殊的语言,和c++等语言差距十分巨大,特别是类型上,js的可操作性极强,十分灵活(这也是为什么js框架那么多的原因)