JavaScript中的每一个数据,都有它的类型。JS中一共有7种数据类型(包括ES6新增的symbol)。每一种数据类型所对应的数据分别是:
- number:整数跟小数(如
1
和1.23
)。 - string:文本(如
hello world
)。 - boolean:表示两个状态,真(
true
)与假(false
)。 - null:表示空值,及此处的值为空。
- undefinde:表示未定义或不存在。
- object:对象属于复杂数据类型。可以细分为:
--狭义的对象(object
)
--数组(array
)
--函数(function
) - 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
null
与undefined
都可以表示“没有”,含义非常相似。在实际使用中也几乎没有区别。
null表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入null,表示该参数为空。比如,某个函数接受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就会传入null,表示未发生错误。undefined表示“未定义”。
- 在if语句中
null
跟undefined
都会转换成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 */ })();
网友评论