重学JavaScript之基本概念(上) => 数据类型
重学JavaScript之基本概念(上) => 数据类型
Lieme前提:任何语言的核心都会描述这门语言最基本的工作原理,通常描述的内容会涉及到这门语言的语法 、操作符、数据类型、内置功能等用于构建复杂解决方案的基本概念。
1. 语法
1、js 中的变量、函数名和操作符都区分大小写,
2、另外一些像typeof这些关键字也不能使用
2. 标识符
所谓标识符就是指变量、函数、属性的名字,或者函数的参数。
标识符的写法标准如下:
1、第一个字符必须是一个字母、下划线或者一个美元符号
2、其他字符可以是字母、下划线、美元符号或数字
3、标识符中的字母采用驼峰大小写格式,例如:firstSecond、myCar
3. 注释
js的注释包括单行注释和块级注释,单行注释两个反斜杠开头,块级注释则是以(/)开始以(/)结束
单行注释
// 注释
块级注释
/*
块级注释
*/
4. 语句
在js中语句是以分毫结尾但是不是必须的,但是推荐还是写上分号。因为这样在压缩代码的时候就不会出现不必要的问题。
5. 关键字和保留字
在js中有一些特定的关键字,这些关键字可用于表示控制语句的开始或结束,或者用于执行特定操作等,关键字是语言特地保留的,所以不能用作标识符。另外在js中还有另外一些保留字,也是不能用来当作标识符。
6. 变量
因为js的变量是松散类型的,松散类型就是可以用来保存任何类型的数据。每个变量仅仅是用来保存值的占位符而已,定义变量需要用到var,在之后的ES6中增加了let和const关键字来定义变量。
var a = 10 // 定义一个变量a 给它赋值 10
注意:虽然省略 var 操作符可以定义全局变量,但是并不推荐这种做法,因为在局部作用域中定义全局变量会使得代码很难维护。
7. 数据类型
在js中有5种基本数据类型:Undefined、Null、Boolean、Number和String,复杂类型 Object。Object是一组由无序的名值对组成的。在ES中不支持任何创建自定义类型的机制。
8. typeof操作符
用来检测给定变量的数据类型,检测的返回值如下:
undefined -- 值未定义
Boolean -- 布尔值
string -- 字符串
number -- 数值
object -- 对象或者null
function -- 函数
typeof操作符的操作数可以是变量,也可以是数值字面量,typeof是一个操作符而不是函数。
9. undefined
它只有一个特殊类型的值即undefined,如果变量在var后没有赋值,那么这个变量的值就是 undefined。
var message;
message // undefined
注意:未初始化的变量和未赋值的变量 typeof之后都是undefined,所以为了更好的判断undefined的来源到底是未赋值还是未初始化,建议所有的值都声明在使用。
10. null类型
null 是第二个只有一个值的数据类型,值为 null,从表面看 null 表示的是一个空对象指针,而这个真是typeof 检测 null 返回值为 “object”的原因。
如果你想定义一个变量用来保存对象,那么最好的做法就是将变量赋值 null 这样检测 null 就知道 相应的变量是否保存了一个对象的引用。
注意:null == undefined 为 true,尽管这样两者的用途并不相同。无论任何情况下都没有必要将一个变量的值显式的设置为 undefined,而null则是如果保存对象的变量没有真正保存对象,那么就应该明确的让变量保存null值。这样可以进一步的区分 null 和 undefined。
11. Boolean类型
boolean类型有两个字面值:ture 和 false,另外这两个值和数字值不是一回事,ture 不一定等于1,false也不一定等于0.
注意:true 和 false 是区分大小写的,True 和 Flase 只是标识符。
我们可以通过函数** Boolean()** 将一个值转换为Boolean类型。 如下:
var message = 'haha,nihao';
var zh = Boolean(message)
各种类型的转换规则如下:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “” (空字符串) |
Number | 任何非零数字值(包括无穷大) | 0 和 NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
12. number类型
在js中广泛使用的数据类型,有整数和浮点数值。可以通过十进制、八进制、十六进制的字面来表示。
var bjz = 070 // 八进制 56
var sjz = 56 // 十进制 56
var sljz = 0xA // 十六进制 10
12.1 浮点数值
就是该数值中必须包含一个小数点,并且小数点后面至少有一位数字。
var f = 1.1
注意:由于保存浮点数的内存空间是保存整数的两倍,所以以下情况会自动将浮点转换为整数保存,如下:
var f = 1. // 小数点后没有数字 保存为 1
var b = 10.0 // 保存为 10
另外对于 过大 或者过小的值可以通过 e(科学计数法)表示,如下:
var f = 3.125e7 // 3.125 * 10^7 => 31250000
var f = 3e-17 // js 会将小数点后面超过6个0的浮点数值转换为科学计数法
注意:0.1 + 0.2 != 0.3
12.2 数值范围
js中由于内存的限制并不能保存所有的数值,js能够表示的最小值为 5e-324,最大值为 1.7976931348623157e + 308。如果某次计算数值超过最大 就转换为Infinity,最小为 -Infinity。如果出现这两个值,那么该值就不能在参与之后的运算了。
12.3 NaN
js 中的非数值,是一个特殊的值。主要是为了防止抛出错误,用来表示一个本来返回数值的操作数未返回数值的情况。
NaN 有两个特定,1、任何涉及NaN的操作都会返回NaN,2、NaN与任何值都不相等包括其本身。针对这两个特点,ES定义了isNaN() 函数,这个函数接受一个参数,该参数可以是任何类型,而该函数会帮我们确定这个参数是否 “不是数值”,isNaN()接受参数之后会尝试将这个值转换为数值,某些不是数值的值会直接转为数值。如下:
isNaN(NaN) // true
isNaN(10) // false (10是一个数值)
isNaN("10") // false (可以被转换成数值10)
isNaN('blue') // true (不能转换成数值)
isNaN(true) // flase (可以被转换成数值 1)
注意:isNaN()也可以用于对象,在基于对象调用的时候,首先会调用 valueOf()方法,然后确定该方法的返回值是否可以转换为数值,如果不能则基于这个返回值在调用 toString() 方法,在测试返回值。
12.4 数值转换
有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat(),第一个函数可以用于任何数据类型。另外两个函数用于将字符串转换为数值。
Number()转换规则如下:
Boolean值 => true or flase => 1 or 0
number => 传入和返回
null => 返回 0
undefined => 返回null
字符串
如果包含十进制数值 则 '123' => 123 ,'012' => 12
如果是浮点字符串 则 '1.1' => 1.1 , '01.1' => 1.1
如果包含十六进制 则 '0xf' => 相同的十进制
如果为空 则 '' => 0
如果包含除了上述格式 则 '' => NaN
如果是对象,则调用对象的 valueOf()方法,在按照之前的规则转换返回值,
如果转换对象是NaN,则调用对象的 toString() 方法,在按照之前的规则返回字符串
值。
parseInt()转换规则如下:
它会忽略字符串前面的空格,如果第一个字符不是数字或者负号则返回NaN。
如果是其他进制,则转换为响应的十进制数值。
var n = parseInt('1234blue') => 1234
var m = parseInt('') => NaN
parseFloat()转换规则如下:
从第一个字符开始解析每个字符,知道遇到第一个无效的浮点数字字符为止
也就是说字符串中第一个小数点是有效的,第二个小数点就无效的了。因此
它后面的字符串就被忽略了。
var n = parseFloat('1234blue') => 1234
var m = parseFloat('0xA') => 0
var c = parseFloat('22.21.2') => 22.21
var b = parseFloat('22.4') => 22.4
13. string类型
用于表示由零或者多个16位 Unicode字符组成的字符序列,即字符串。由双引号(””)或者单引号 (’’)包裹而成
var a = '124'
var b = "123"
// 注意:双引号开头必须双引号结尾!
13.1 字符字面量
一些特殊的字符字面量,即转义序列。用于表示非打印字符,或者具有其他用途的字符。
字面量 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 空格 |
\r | 回车 |
\f | 进纸 |
\ | 斜杠 |
' | 单引号 |
" | 双引号 |
这些字符可以出现在字符串冲的任意位置,而且也会被当作一个字符来解析。
任何字符串的长度都可以通过 length 属性来获取。
let b = '1kljk'
b.length // 5
13.2 字符串的特点
在 ES 中字符串是不可变的。字符串一旦被创建,它的值将不能被改变。如果要改变某个字符串的值则需要销毁原本的值,在重新赋值
var lang = 'shanghai'
lang = lang + 'daxue'
// shanghaidaxue
13.3 转换为字符串
如果想将一个值转换为字符串有两种方法。一、通过toString(),如下:
var age = 11;
var agestring = age.toString() // '11'
var b = true
var bstring = b.toString() // 'true'
大多数数据类型(数值、布尔值、对象和字符串值)都有** toString**方法,但是 null 和 undefined 没有。大多数情况下 toString 是不需要传递参数的。默认是以十进制格式返回数值的字符串表示。但是其实是可以传递八进制、二进制、十六进制参数的。
var num = 10;
num.toString() // '10'
num.toString(2) // '1010'
num.toString(8) // '12'
num.toString(10) // '10'
num.toString(16) // 'a'
14. object类型
对象是一组数据和功能的集合。对象可以通过执行 new 操作符后跟要创建的对象类型的名称来创建。创建的object类型的实例,可以为其添加属性和方法。
var o = new Object()
在ES中 Object类型是所有它的实例的基础,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。
Object的每个实例都具有下列属性和方法:
constructor => 保存用于创建当前对象的函数
hasOwnProperty(propertyName)=> 用于检查给定的属性在当前对象实例中是否存在。propertyName必须以字符串形式指定。
isPrototypeOf(object) => 用于检查传入的对象是否是另一个对象的原型。
propertyIsEnumerable(propertyName) => 用于检查给的属性是否能够使用 for-in语句来枚举,与hasOwnProperty()方法一样,作为参数的属性名必须以字符串指定。
toString() => 返回对象的字符串表示
valueOf() => 返回对象的字符串、数值或布尔值表示。·