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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容