简介

JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有七种

  • 数值(number):整数和小数,比如13.14
  • 字符串(string):文本
  • 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)
  • undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • null:表示空值
  • 对象(object):各种值组成的集合
  • Symbol:ES6新增,表示独一无二的值,Symbol 用来生成一个全局唯一的值

通常,数值、字符串、布尔值、Symbol 这四种类型,合称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。对象则称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。至于undefinednull,一般将它们看成两个特殊值。

数值(number)

JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,11.0是相同的,是同一个数。

1 === 1.0 //true

由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心

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

数值的范围

JavaScript 能够表示的数值范围为21024到2-1023(开区间),超出这个范围的数无法表示。

如果一个数大于等于2的1024次方,那么就会发生“正向溢出”,即 JavaScript 无法表示这么大的数,这时就会返回Infinity

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

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

数值的表示方法

JavaScript 的数值有多种表示方法,可以使用字面形式(十进制,二进制,十六进制,八进制)和科学计数法表示。

以下两种情况,JavaScript 会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示

  • 小数点前的数字多于 21 位

    1234567890123456789012
    // 1.2345678901234568e+21 123456789012345678901
    // 123456789012345680000
  • 小数点后面的零多余 5 个

    // 小数点后紧跟5个以上的零,
    // 就自动转为科学计数法
    0.0000003 // 3e-7 // 否则,就保持原来的字面形式
    0.000003 // 0.000003

字面形式:

  • 十进制:没有前导 0 的数值
  • 八进制:有前缀0o0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
  • 十六进制:有前缀0x0X的数值。
  • 二进制:有前缀0b0B的数值。

默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。下面是一些例子

0xff // 255
0o377 // 255
0b11 // 3

如果八进制、十六进制、二进制的数值里面,出现不属于该进制的数字,就会报错。

0xzz // 报错
0o88 // 报错
0b22 // 报错

前导0表示八进制,处理时很容易造成混乱。ES5 的严格模式和 ES6,已经废除了这种表示法,但是浏览器为了兼容以前的代码,目前还继续支持这种表示法

NaN

  • NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。

  • NaN不等于任何值,包括它本身。

  • NaN与任何数(包括它自己)的运算,得到的都是NaN

  • 数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立。

字符串(string)

字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。

单引号字符串的内部,可以使用双引号。双引号字符串的内部,可以使用单引号。

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

如果要在单引号字符串的内部,使用单引号,就必须在内部的单引号前面加上反斜杠,用来转义。双引号字符串内部使用双引号,也是如此。

'在单引号中显示单引号 \'Hello\''
// "在单引号中使用单引号 'Hello'" "在双引号中显示双引号 \"Hello\""
//在双引号中显示双引号 \"Hello\"

如何将字符串分成多行

  • 在每一行的尾部使用反斜杠

    var longString = 'Long \
    long \
    long \
    string'; longString
    // "Long long long string"
  • 使用运算符 + 连接

    var longString = 'Long '
    + 'long '
    + 'long '
    + 'string';
  • 使用 ES6 提供的字符串模板,所有的空格和缩进都会被保留在输出之中

    var longString=`1111
    2222
    3333` // 输出
    1111
    2222
    3333

转义

反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。

需要用反斜杠转义的特殊字符,主要有下面这些。

  • \0 :null(\u0000
  • \b :后退键(\u0008
  • \f :换页符(\u000C
  • \n :换行符(\u000A
  • \r :回车键(\u000D
  • \t :制表符(\u0009
  • \v :垂直制表符(\u000B
  • \' :单引号(\u0027
  • \" :双引号(\u0022
  • \\ :反斜杠(\u005C

字符串数组

字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。

var s = 'hello';
s[0] // "h"
s[1] // "e"
s[4] // "o" // 直接对字符串使用方括号运算符
'hello'[1] // "e"

如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined

'abc'[3] // undefined
'abc'[-1] // undefined
'abc'['x'] // undefined

但是,字符串与数组的相似性仅此而已。实际上,无法改变字符串之中的单个字符。

var s = 'hello';

delete s[0];
s // "hello" s[1] = 'a';
s // "hello" s[5] = '!';
s // "hello"

length 属性

length属性返回字符串的长度,该属性也是无法改变的。

Base64 转码

Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理。

JavaScript 原生提供两个 Base64 相关的方法。

  • btoa():任意值转为 Base64 编码
  • atob():Base64 编码转为原来的值
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"

注意,这两个方法不适合非 ASCII 码的字符,会报错。

btoa('你好') // 报错

要将非 ASCII 码字符转为 Base64 编码,必须中间插入一个转码环节,再使用这两个方法。

function b64Encode(str) {
return btoa(encodeURIComponent(str));
} function b64Decode(str) {
return decodeURIComponent(atob(str));
} b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"

布尔(Boolean)

布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示。布尔值只有这两个值。

下列运算符会返回布尔值:

  • 前置逻辑运算符: ! (Not)
  • 相等运算符:===!====!=
  • 比较运算符:>>=<<=

转换规则是除了下面六个值被转为false,其他值都视为true

  • undefined

  • null

  • false

  • 0

  • NaN

  • ""''(空字符串)

注意,空数组([])和空对象({})对应的布尔值,都是true

null 和 undefined

nullundefined都可以表示“没有”,含义非常相似。

null是一个表示“空”的对象,转为数值时为0undefined是一个表示"此处无定义"的原始值,转为数值时为NaN

  1. (规范)如果一个变量没有被赋值,那么这个变量的值就是 undefiend
  2. (习俗)如果你想表示一个还没赋值的对象,就用 null。如果你想表示一个还没赋值的字符串/数字/布尔/symbol,就用 undefined(但是实际上你直接 var xxx 一下就行了,不用写 var xxx = undefined)

对象(object)

简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。键名与键值之间用冒号分隔,两个键值对之间用逗号分隔。

对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。

如果键名是数值,会被自动转为字符串。

如果键名不符合标识名的条件(比如第一个字符为数字,或者含有空格或运算符),且也不是数字,则必须加上引号,否则会报错。

// 报错
var obj = {
1p: 'Hello World'
}; // 不报错
var obj = {
'1p': 'Hello World',
'h w': 'Hello World',
'p+q': 'Hello World'
};

对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。

var obj = {
p: function (x) {
return 2 * x;
}
}; obj.p(1) // 2

如果属性的值还是一个对象,就形成了链式引用。

var o1 = {};
var o2 = { bar: 'hello' }; o1.foo = o2;
o1.foo.bar // "hello"

读取与赋值

读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符.

点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。

var obj = {
p: 'Hello World'
}; obj.p // "Hello World"
obj['p'] // "Hello World" // 方括号运算符内部还可以使用表达式
obj['hello' + ' world']
obj[3 + 3] // 数字键可以不加引号,因为会自动转成字符串。
var obj = {
0.7: 'Hello World'
}; obj['0.7'] // "Hello World"
obj[0.7] // "Hello World" obj['0.7'] = '赋值';

注意,数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符

查看属性

查看一个对象本身的所有属性,可以使用Object.keys方法。

var obj = {
key1: 1,
key2: 2
}; // 查看对象本身所有的属性
Object.keys(obj); // ['key1', 'key2']

删除属性

delete命令用于删除对象的属性,删除成功后返回true

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

上面代码中,delete命令删除对象objp属性。删除后,再读取p属性就会返回undefined,而且Object.keys方法的返回值也不再包括该属性。

注意,删除一个不存在的属性,delete不报错,而且返回true

遍历属性

使用 for...in循环来遍历一个对象的全部属性

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

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

注意:

  1. 它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性
  2. 它不仅遍历对象自身的属性,还遍历继承的属性

如果继承的属性是可遍历的,那么就会被for...in循环遍历到,这时应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性

var person = { name: '老张' };

for (var key in person) {
if (person.hasOwnProperty(key)) {
console.log(key);
}
}

属性是否存在:in 运算符

in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false。它的左边是一个字符串,表示属性名,右边是一个对象。

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

其它

typeof 操作符

xxx 的类型 string number boolean symbol undefined null object function
typeof xxx 'string' 'number' 'boolean' 'symbol' 'undefined' 'object' 'object' 'function'

注意 function 并不是一个类型。

JS 中的数据类型的更多相关文章

  1. js中的数据类型

    JS中的数据类型: ——数字  (number)NaN ——字符串(string) ——布尔  (boolean)——函数  (function)     也是对象的一种 ——对象  (object) ...

  2. 如何判断js中的数据类型?

    js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...

  3. 如何判断js中的数据类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  4. [转]如何判断js中的数据类型

    原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...

  5. 浅谈js中的数据类型,使用typeof获取js数据类型

    JS中的数据类型 1):Undefined——值未定义 注:Undefined类型只有一个值,即特色的undefined.在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined ...

  6. 如何判断js中的数据类型(转)

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  7. 判断js中的数据类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  8. js中的数据类型及其转换

    Js中的数据类型 Js中的数据类型一共有六种,即number,string,boolean,underfine,null,object. 一,number Number数据类型指的是数字,可以为整型, ...

  9. JS中的数据类型和转换

    一.JS中的数据类型 js中的数据类型可以分为五种:number .string .boolean. underfine .null. number:数字类型 ,整型浮点型都包括. string:字符 ...

  10. 判断js中的数据类型的几种方法

    判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...

随机推荐

  1. OC - runtime - 1

  2. discuz回贴通知插件实现-用户状态设置

    1.获取用户提交数据 discuz通过$_GET来获取全部数据,包括($_GET,$_POST). else if($_GET['pluginop'] == 'set') { //获取用户提交数据 $ ...

  3. Sql优化-必劳记!

    0. 尝试在合适的场景下,用 Charindex()函数代替 like,或者全文索引进行 内容搜寻.%like%不走索引,'like%'后百分号可以走索引. 1.调整不良SQL通常可以从以下几点切入: ...

  4. db2 创建用户及授权

    1.创建系统用户dbuser/ehong隶属于db2users 2.C:\Program Files\IBM\SQLLIB\BIN>db2 connect to AKZXTEST数据库连接信息  ...

  5. iOS.Dev.Support.MultiVersions

    如何利用target conditionals和availabilty 如何来区分平台iOS OR Mac “When building for iOS the deployment target i ...

  6. MapReduce 计算模式

    声明:本文摘录自<大数据日知录——架构与算法>一书. 较常见的计算模式有4类,实际应用中大部分ETL任务都可以归结为这些计算模式或者变体. 1.求和模式 a.数值求和 比如我们熟悉的单词计 ...

  7. BZOJ1221 [HNOI2001]软件开发 - 费用流

    题解 非常显然的费用流. 但是建图还是需要思考的QuQ 将每天分成两个节点 $x_{i,1}, x_{i,2} $, $ x_{i,1}$用于提供服务, $x_{i ,2}$ 用来从源点获得$nd[i ...

  8. maven web 项目 打入 jar 包 , 和编译入 java 文件到 web-inf 下

    <outputDirectory>src\main\webapp\WEB-INF\classes</outputDirectory> 可以把 类文件编译到 web-inf 下 ...

  9. cnn 反向bp这个地方怎么推导??

  10. pandas replace函数使用小结

    http://blog.csdn.net/kancy110/article/details/72719340