Javascript基础总结(一)

Javascript数据类型

五种基本类型 Undefined , Null,Number,Boolean,String 。
引用类型均为对象 ,包括 Object,Function, Array, Error,RegExp,Date,,Math,JSON。
typeof 关键字用来区分原始值和对象,并确定原始值。

typeof undefined
"undefined"
typeof 12
"number"
typeof ''
"string"
typeof true
"boolean"
typeof null
"object"
typeof {}
"object"
var fun = function (){};typeof fun
"function"

typeof null 返回object 是一个不能修正的bug,因为这会破坏现有的代码。其原因在《深入理解Javascript》一书中这样解释:

第一代Javascript 引擎中的JavaScript值表示为32位的字符。最低3位作为一种标识,表示值是对象,整数,浮点数或者布尔值。对象的标识是000。而为了表现null值,引擎使用了机器语言的NULL指针,该字符的所有位都是0。而typeof就是检测值的标志位,所以typeof认为null是一个对象。

判断是否为对象,可以使用如下方法:

function isObject(obj){
    return obj === null && (typeof obj === 'object' || typeof obj ==='function');
}

instanceof 运算符检测对象是否是给定的构造函数的实例。instanceof 对五种基本类型的值总是false。

value instanceof Constr

判断value 是由构造函数Constr 还是子构造函数(subconstructor)创建的。所以它是检测Constr 是否在value 的原型链上。下面两个表达式是等价的:

value instanceof Constr
Constr.prototype.isPrototypeOf(value)

对象的类型可以通过调用内置对象Object的toString方法来进行判断。当然,基本类型也可以这样判断,判断基本类型时实际是将其包装成对应的包装对象(后面会说到包装对象),然后调用对象的方法。一般不需要这样做,typeof就可以判断基本类型。基本类型的值是没有属性和方法的。

Object.prototype.toString.call(null);
"[object Null]"
Object.prototype.toString.call('abc');
"[object String]"
Object.prototype.toString.call(12);
"[object Number]"
Object.prototype.toString.call(true);
"[object Boolean]"
Object.prototype.toString.call(undefined);
"[object Undefined]"
Object.prototype.toString.call(function(){});
"[object Function]"
Object.prototype.toString.call({});
"[object Object]"
Object.prototype.toString.call([]);
"[object Array]"
Object.prototype.toString.call(/abc/);
"[object RegExp]"
Object.prototype.toString.call(new Date());
"[object Date]"

Object.prototype.toString ( ) 当调用 toString 方法,采用如下步骤:

  1. 如果 this 的值是 undefined, 返回 "[object Undefined]".
  2. 如果 this 的值是 null, 返回 "[object Null]".
  3. 令 O 为以 this 作为参数调用 ToObject 的结果 .
  4. 令 class 为 O 的 [[Class]] 内部属性的值
  5. 返回三个字符串 "[object ", class, and "]" 连起来的字符串 .

基本类型的包装对象

布尔值,数字,字符串这三种原始值都有相应的构造函数:Boolean,Number,String。他们的实例称为包装对象,包含原始值。这些构造函数有两种用法。
(1)作为构造函数,构造的对象与原始值存在很大差异

> new String('abc') === 'abc'
false
> typeof new String('abc')
"object"

(2)作为函数,将传入的参数转成对应的原始值(转换成字符串,数字,布尔值和对象的函数)。

>  Number('12');
12

原始值通过调用包装构造函数进行包装,通过调用valueOf()方法来进行去包装,所有的对象都有该方法。

new Number(123) //包装
new Number(123).valueOf() //去包装

将包装对象转换为原始值时,字符串和数字都可以得到正确的原始值,而布尔值则不能。

>  Boolean(new Boolean(true)).valueOf()
true
>  Boolean(new Boolean(false)).valueOf()
true

其原因在于Boolean()函数将对象转化为布尔值时,所有的对象都会被转换成true。

数据类型的转化

Boolean() 转化为布尔值。

下面的值将被转换为 false,除此之外的值都将被转换成 true。

undefined, null, false, 0, NaN , ''
Number() 转换成数字。

undefined被转换成 NaN。 NaN表示 not a number , 它与任何值都不相等,包括自身。
null 被转换成 0。
false 被转换成 0, true 被转换成 1。
字符串将会被解析。

> Number('12abc');//不能解析成数字
NaN
> Number('12.34');//可以解析成数字
12.34

对象先转换成原始值(稍后会讲到),然后再将其原始值按照上述规则转换为数字。

String() 转换为字符串。

原始值转换为字符串的结果显而易见。

String(null)
"null"
String(undefined)
"undefined"
String(12.34)
"12.34"
String('abc')
"abc"
String(false)
"false"
String(true)
"true"

对象会先转换为原始值,然后再转换为字符串。

Object() 转换为对象。

对象会转换为自身,不发生变化。 undefined 和 null 将会转换为 空对象,布尔值、数字、字符串会转换为相应的包装对象。

ToPrimitive() -----将值转换为原始值
要将任意值转换成数字或者是字符串,首先会将其转换为任意的原始值,然后再转换为最终的结果。
ECMAScript规范中有一个内部函数 ToPrimitive() 实现转换的功能,该函数JavaScript中不能访问。
该函数形如: ToPrimitive(input , PreferredType?)
input表示输入需要进行类型转换的参数,可选参数PreferredType表示转换之后的类型:它可以是Number 或者 String,取决于ToPrimitive的结果希望转换成数字还是字符串。

如果 PreferredType 是Number ,即期望得到的类型是Number,会执行以下步骤。
(1)判断input 类型,如果 input 是一个原始值,直接返回。
(2)否则,input是对象,调用input.valueOf(),如果结果是原始值,直接返回结果。
(3)否则,调用input.toString(),如果结果是原始值,直接返回结果。
(4) 否则,抛出一个TypeError(说明将输入转换为原始值出错了)。

如果PreferredType是字符串,则交换步骤二和三,即先调用toString()方法,后调用valueOf()方法。
JavaScript中valueOf函数方法是返回指定对象的原始值。
每个JavaScript固有对象的 valueOf 方法定义不同。

对象 返回值
Array 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。
Boolean Boolean 值。
Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
Function 函数本身。
Number 数字值。
Object 对象本身。这是默认情况。
String 字符串值。

Math 和 Error 对象没有 valueOf 方法。

来源: http://www.jb51.net/article/32327.htm
参考 : http://www.xuebuyuan.com/2234641.html

上述如有错漏之处,敬请指教。

推荐阅读更多精彩内容