数据类型

Undefined

Undefined只有一个特殊值,即undefind,在使用var申明变量但没有对其赋值时,这个变量值就是undefined,例如:

var message;
message == undefined  // true

Null

Null是JS中第二个只有一个值的数据类型,其值为nullnull值表示一个空对象指针,使用typeof检测会返回object,例如:

var car = null;
typeof car  // 'object'

undefined派生自null,所以null == undefined会返回true

Boolean

布尔类型返回两个值,即truefalse
数据类型与布尔值之间的转换

数据类型 转换为true值 转换为false值
Boolean true false
String 任何非空字符串 "" (空字符串)
Number 任何非零数值(包括无穷大) 0和NaN
Object 任何对象 null
Undefined 不适用 undefined

Number

使用number类型来表示正数与浮点数。number类型除了可以表示10进制数外,还可以表示8进制,16进制等。
JS中可以保存+0-0+0 == -0 // true

  • 浮点数 & 科学计数法

浮点数保存需要的内存,是正数值的2倍。所以JS中不符合浮点数规则的数会自动被转换为正数

var float1 = 1.     // 将被解析为整数 1
var float2 = 10.00  // 将被解析为整数 10

对于极大或者极小的数,可以使用e科学计数法表示

var float2 = 3.14e7  // 表示 3.14*10的7次方
var float2 = 3.14e-7  // 表示 3.14*10的-7次方

浮点数的最高精度是17位,但是做数学运算的时候,其精度远远不及整数

var a = 0.1+0.2 // 并不是输出0.3 而是 0.30000000000004

所以,最好不要用浮点数做运算和做判断。
JS中能够表达的最大的值,保存在Number.MAX_VALUE,表达的最小的值,保存在Number.MIN_VALUE中。

Number.MAX_VALU // 1.7976931348623157e+308
Number.MIN_VALUE //5e-324

如果某次运算超出了JS的数值计算范围,则会返回Infinity,负数为-Infinity(负无穷),正数为Infinity(正无穷),可以使用isFinite()函数检测是不是位于最大值和最小值之间,该函数返回布尔值

  • NaN & isNaN

NaN表示非数值。这个值表示一个要返回数值的操作并未返回数值。任何与NaN的操作,都会返回NaN,比如NaN/10 // NaNNaN不与任何值相等,包括它自己,NaN == NaN // false

isNaN函数,帮助我们确定这个参数是否'不是一个数值',任何不能被转换为数值的值,都会导致这个函数返回true

isNaN(NaN)    // true
isNaN(10)      // false 10是一个数
isNaN('10')    // false 可以被转换为number
isNaN('blue')   // true 不能被转换为number
isNaN(true)   // false 可以被转换为数值 1

尽管有点儿不可思议,但isNaN()确实也适用于对象。在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转 换为数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。 而这个过程也是ECMAScript中内置函数和操作符的一般执行流程。

  • 数值转换

Number() parseInt() parseFloat()
Number可以用于任何数据类型,另外两个则专门用于把字符串转成数字,这3个函数对同样的输入会返回不同的结果。

Number()函数的转换规则如下。

  • 如果是Booleantruefalse将分别被转换为10
  • 如果是数字值,只是简单的传入和返回。
  • 如果是null值,返回0
  • 如果是undefined,返回NaN
  • 如果是字符串,遵循下列规则:
    1、如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1" 会变成 1,"123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);
    2 、如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
    3 、如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
    4 、如果字符串是空的(不包含任何字符),则将其转换为 0;
    5 、如果字符串中包含除上述格式之外的字符,则将其转换为NaN
  • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1

字符串"Hello world!"会被转换为NaN,因为其中不包含任何有意义的数字值。空字符串
会被转换为 0。字符串"000011"会被转换为 11,因为忽略了其前导的零。最后,true值被转换为 1。
parseInt()忽略字符串的空格,找到第一个非空字符串,如果第一个字符不是数字字符或者符号,则返回NaN。用parseInt()转换空字符串会返回 NaN(Number()对空字符返回0)。如果遇到非数字字符,则停止解析。同时parseInt也能够字符解析8进制(ES3 ES5不具备解析8进制的能力),16进制等。

var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5);  // 22
var num5 = parseInt("070"); // 56(八进制数)
var num6 = parseInt("70");  // 70(十进制数) 
var num7 = parseInt("0xf"); // 15(十六进制数)

同时,parseInt可以传入第二个参数,具体按照什么进制来转换

var n1 = parseInt(70,10)   // 按照10进制解析
var n2 = parseInt(70,8)   // 按照8进制解析

parseFloatparseInt差不多,只是parseFloat只能解析10进制的数,所以没有第二个参数。

String

  • toString方法
    NumberBooleanObjectString值(没错,每个字符串也都有一个 toString()方法,该方法返回字 符串的一个副本)都有toString()方法。但nullundefined值没有这个方法。Number调用toString可以传递参数,即需要转换的字符基数。默认按照10进制输出
var num = 10;    
alert(num.toString());   // "10"
alert(num.toString(2));  // 2进制 "1010"
alert(num.toString(8));  // 8进制  "12"
alert(num.toString(10)); // 10进制  "10"
alert(num.toString(16)); // 16进制  "a"
  • String方法
    String函数转换规则
    1 、 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果
    2 、 如果值为null ,则返回'null'
    3 、 如果值为undefined ,则返回'undefined'
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1));   // "10"
alert(String(value2));  // "true"
alert(String(value3));  // "null"
alert(String(value4));  // "undefined"

Object

Object类型所具有的任何属性和方法也同样存在于更具体的对象中。
Object的每个实例都具有下列属性和方法。

  • constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor) 就是Object()
  • hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例 的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例 如:o.hasOwnProperty("name"))。
  • isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型
  • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符=串形式指定。
  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
  • toString():返回对象的字符串表示。
  • valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容