JS里的数据类型

JS里的数据类型主要分为两大类。

  1. 基本类型
  • 字符串(string)
  • 数字(number)
  • 布尔值(boolean)
  • null
  • undefined
  • 符号(symbol)
  1. 复杂类型
  • 对象(object)包括对象,数组,函数都属于对象。

一共有七种,在这里介绍除了符号外的所有类型。

字符串

只要放在单引号或双引号中的字符就是字符串,在字符串内部如果要使用引号,就必须和外层引号不同,例如一下表示都是合法的。

'key = "value"'
"It's a long journey"

另外也可以使用转义符。

'Did she say \'Hello\'?'
// "Did she say 'Hello'?"

"Did she say \"Hello\"?"
// "Did she say "Hello"?"

如果要想多个单行字符串连接可用+号,这也是字符串换行连接的推荐方式。

var longString = 'Long '
  + 'long '
  + 'long '
  + 'string';

要表示特殊字符就需要使用转义符,主要使用的有一下几个。

  • \0 :null(\u0000)
  • \b :后退键(\u0008)
  • \f :换页符(\u000C)
  • \n :换行符(\u000A)
  • \r :回车键(\u000D)
  • \t :制表符(\u0009)
  • \v :垂直制表符(\u000B)
  • ' :单引号(\u0027)
  • " :双引号(\u0022)
  • \ :反斜杠(\u005C)
    其他类型要转换为字符串可以使用加空字符串的方法xxx + ''

数字

JS中所有数字都是用64位浮点数的形式存储的,所以在其底层并没有整数,只有小数。而浮点数的表示并不精确,会出现以下情况,需特别小心。

0.1 + 0.2 === 0.3
// false

0.3 / 0.1
// 2.9999999999999996

(0.3 - 0.2) === (0.2 - 0.1)
// false

JS能够表示的数值范围为21024到2-1023(开区间),超出这个范围的数无法表示。在使用时,如果超出最大值,回发生‘正向溢出’。小于最小值时,会发生‘负向溢出’。

Math.pow(2, 1024) // Infinity
Math.pow(2, -1075) // 0

JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。

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

其他数据类型如果想转换为数字,可使用减零的方式xxx - 0(如果该数据可以转换为数字的话)。

布尔值

布尔值只有两个truefalse,在条件表达式中,会将表达式转换为布尔值,以进行下一步操作。除了以下六个falsy值外,其它一切转换为布尔值都为true

  • 数字0
  • NaN
  • null
  • undefined
  • 空字符串''
  • 布尔值false
    要将其它值转换为布尔值可使用双重取反!!xxx

null和undefined

这两个类型基本没什么区别,如果一个变量声明了而没有赋值,则会自动赋值为undefined。惯例来说,如果一个变量打算赋值为对象,而暂时还未赋值,则会先赋值为null
另外,在转换为数字时,null会转换为0,而undefined则会转换为NaN

对象

对象包括普通对象,数组以及函数。

var obj = {
  foo: 'Hello',
  bar: 'World'
};
var array = [1, 2, 3];
function fun() {}

对象的键名都是字符串,可以直接使用数字,JS会在后台自动转换为字符串。
可以使用Object.keys(obj)查看对象的属性。使用delete操作符可以删除对象的属性,返回true。注意,删除一个不存在的属性,delete不报错,而且返回true

var obj = { p: 1 };
Object.keys(obj) // ["p"]

delete obj.p // true
obj.p // undefined
Object.keys(obj) // []

var obj = {};
delete obj.p // true

只有一种情况,delete命令会返回false,那就是该属性存在,且不得删除。
in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false

var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true

in运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的。就像上面代码中,对象obj本身并没有toString属性,但是in运算符会返回true,因为这个属性是继承的。
for...in循环可用来遍历对象属性(可枚举属性),包括继承的。JS内建属性和方法都不可枚举。

var obj = {a: 1, b: 2, c: 3};

for (var i in obj) {
  console.log('键名:', i);
  console.log('键值:', obj[i]);
}
// 键名: a
// 键值: 1
// 键名: b
// 键值: 2
// 键名: c
// 键值: 3

复杂类型和基本类型最大的区别就是在存储上面。基本类型的赋值都是使用拷贝,即改变赋值并不会影响另一个变量。而对象使用的是引用赋值,拷贝给声明的只是同一个内存地址,当改变了对象的内容,会影响另外的指向同一内存地址的变量。

typeof

使用typeof操作符检查变量类型。

typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"

function f() {}
typeof f // "function"
typeof undefined // "undefined"
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
typeof /([a-z])/ //"object"

其中需要注意的是,普通对象,数组,null以及正则表达式都会返回"object"

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

推荐阅读更多精彩内容

  • 简介 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有七种。 n...
    sxfshdf阅读 862评论 0 48
  • 目录 概述typeof运算符number(数字)string(字符串)boolean(布尔)undefined &...
    阿小经阅读 770评论 0 7
  • JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。 数值(n...
    七月凛冬阅读 394评论 0 0
  • JS里的数据类型主要分为两大类。 基本类型 字符串(string) 数字(number) 布尔值(boolean)...
    饥人谷_王捷阅读 531评论 0 0
  • JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 ...
    Yixi_Li阅读 371评论 0 0