JS 里的数据类型

JavaScript中的每一个数据,都有它的类型。JS中一共有7种数据类型(包括ES6新增的symbol)。每一种数据类型所对应的数据分别是:

  1. number:整数跟小数(如11.23)。
  2. string:文本(如hello world)。
  3. boolean:表示两个状态,真(true)与假(false)。
  4. null:表示空值,及此处的值为空。
  5. undefinde:表示未定义或不存在。
  6. object:对象属于复杂数据类型。可以细分为:
    --狭义的对象(object
    --数组(array
    --函数(function
  7. symbol:表示独一无二的值。

number

JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。容易造成混淆的是,某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转成32位整数,然后再进行运算。
一个数在JS内部的保存形式为:
(-1)^符号位 * 1.xx...xx(小数部分) * 2^指数部分
第1位:

  • 0表示正数,1表示负数

第2-12位:

  • 指数部分。指数部分共11位,意味着指数部分的最大值是2047。分出一半表示负数,JavaScript 能够表示的数值范围为2的1024次方到2的-1023次方(开区间)。

第13-64位:

  • 小数部分(有效数字)。其中1不保存在JS之中,所以JS的有效数字长度位53位。这意味着,绝对值小于2的53次方的整数,都可以精确表示。

string

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

  • 在字符串中是用单引号,可以使用\转义字符
  • 将字符串分为多行书写,直接换行会报错。可以使用
    1 在行末加\
    2 使用+连接多个字符串
  • JavaScript 使用 Unicode 字符集。JavaScript 引擎内部,所有字符都用 Unicode 表示。
  • 每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。但JavaScript 对 UTF-16 的支持是不完整的,对于码点在U+10000到U+10FFFF之间的字符,JavaScript 总是认为它们是两个字符(length属性为2)。

boolean

boolean表示真与假两个状态,真用true表示,假用false表示。
除了以下了六个falsy值的boolean值是false以外,其余的值在JS中都被视为true。
-null
-undefined
-NaN //(Not a Number)
-0
-''"" //空字符串,需要注意空数组[]或空对象{}是true
-false

null和undefined

nullundefined都可以表示“没有”,含义非常相似。在实际使用中也几乎没有区别。

null表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入null,表示该参数为空。比如,某个函数接受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就会传入null,表示未发生错误。undefined表示“未定义”。

  • 在if语句中nullundefined都会转换成false
  • null转化为数字时,会变成0;undefined转为数字时,会变成NaN

object

简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

1. 狭义的对象

  • 对象的所有键名都是字符串,加不加引号都可以。如果不加引号,则键名必须符合标识符的规范。
  • 对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”
  • 如果遇到如下这种情况,无法确定是对象还是代码块,一律解释为代码块。
{ foo: 123 }
{ console.log(123) } // 123  JS认为第一行是代码库
//如果需要解释位对象,可以加上圆括号
({ foo: 123 }) 
({ console.log(123) }) // 报错  JS认为第一行是对象
  • 读取与赋值对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。
  • 如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。数值键名只能使用方括号运算符。
  • 查看一个对象本身的所有属性,可以使用Object.keys方法。
  • delete命令用于删除对象的属性,删除成功后返回true。注意,即使删除的属性不存在,也会返回true。只有当属性 存在但不能删除时才会返回false

2. 数组

数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。

  • length属性的值就是等于最大的数字键加1。不是数字的键值对对length没有影响。
  • for...in不仅会遍历数组所有的数字键,还会遍历非数字键。

3. 函数

函数是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。typeof会返回function.

  • JavaScript 有三种声明函数的方法。
    1 function 命令
function print(s) {
  console.log(s);
}

2 函数表达式

var print = function(s) {
  console.log(s);
};
//此时S作为函数名只能在函数内部使用
//结尾要加;

3 Function 构造函数

var add = new Function(
  'x',
  'y',
  'return x + y'
);

// 等同于
function add(x, y) {
  return x + y;
}
// 最后一个参数才会被当作函数体,前面的都是参数。只有一个参数,该参数就是函数体。
  • 如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。
  • JavaScript 语言将函数看作一种值,与其它值(数值、字符串、布尔值等等)地位相同。由于函数与其他数据类型地位平等,所以在 JavaScript 语言中又称函数为第一等公民。
  • 函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。
  • 没有办法只省略靠前的参数,而保留靠后的参数。如果一定要省略靠前的参数,只有显式传入undefined。
  • 如果有同名的参数,则取最后出现的那个值。
  • 在有多个参数的情况下,如果要获得第一个参数的值,可以使用arguments对象。arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。
  • 闭包就是函数,即能够读取其他函数内部变量的函数。
  • 闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。
  • JavaScript 引擎规定,如果function关键字出现在行首,一律解释成语句。如果要立即调用匿名函数,应该加上圆括号:
// 语句
function f() {}

// 表达式
var f = function f() {}
---------------------------------

(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();

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