JS的数据类型

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

一、基础类型

  1. 数字/数值(Number)
  2. 字符串(String)
  3. 布尔值(Boolean)
  4. 符号(symbol)
  5. Null
  6. Undefined

二、复杂类型

  1. 对象(object)

一共七种类型,除了符号剩余的这里都有基础介绍。

1. 数字/数值

JavaScript 内部所有数字都是以64位浮点数形式储存,即使整数也是如此。所以底层是没有整数的,只有小数(64位浮点数)。由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心


  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(开区间),超出这个范围的数无法表示。在使用时,如果超出最大值,回发生‘正向溢出’。小于最小值时,会发生‘负向溢出’


  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

JavaScript 内部实际上存在2个0:一个是+0,一个是-0,
几乎所有场合,正零和负零都会被当作正常的0,唯一有区别的场合是,+0或-0当作分母,返回的值是不相等的

2. 字符串

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


'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 + ''

3. 布尔值

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

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

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

5. 对象

对象是一组“键值对”(key-value)的集合,是一种无序的复合数据集合
对象包括普通对象,数组以及函数


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

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"

你可能感兴趣的:(JS的数据类型)