文章较长,建议收藏以便浏览
《JavaScript高级程序设计(第三版)》学习总结
在JavaScript中,数据类型分为基本数据类型和引用数据类型两中:
- 基本数据类型:string、number、boolean、null、undefined、Symbol(ES6新增)
- 引用数据类型:object、array、function
- 两种数据类型的区别:
- 基本数据类型是存在栈内存中的,按值访问;引用数据类型是存在堆内存中的,按地址访问。
Undefined类型
- Undefined类型只有一个特殊的值,即undefined,那么什么情况下为产生undefined呢?
- 一个变量声明了却没有被赋值(获取未声明的变量不会是undefined会报错)
var a console.log(a) // undefined console.log(b) // 报错:b is not defined
- 一个对象上不存在的属性或方法
var obj = { name: 'luffy' } console.log(obj.name) // luffy console.log(obj.age) // undefined
- 一个数组中没有被赋值的索引
var arr = [1,2,3] console.log(arr[3]) // undefined arr[8] = 9 console.log(arr[8]) // 9 console.log(arr[7]) // undefined
Null类型
- Null类型也是只有一个特殊的值,即null。从逻辑角度看,null值表示一个空对象指针,因此会有下面的结果:
console.log(typeof null) //object
- 但是因为null不具有任何对象的特性,所以使用
instanceof
检测时会返回false
:
console.log(null instanceof Object) //false
Boolean类型
- Boolean类型只有两个字面值:true和false(区分大小写,True/False以及其它混合大小写的形式都不是Boolean值,只是标识符)。
- 使用Boolean()函数可以将其它数据类型转为Boolean类型,返回值取决于要转换值的数据类型及其实际值。下表为相应的转换规则:
数据类型 | 转为true的值 | 转为false的值 |
---|---|---|
Boolean | true | false |
Undefined | N/A | undefined |
String | 任何非空字符串 | 空字符串 |
Number | 任何非零数 | 0和NaN |
Object | 任何对象 | null |
- 需要区分的是以下几种情况
// 因为[]属于Object,并且不是null,所以下面的值为true
Boolean([]) // true
// 但是对象和Boolean值进行比较时,对象会进行转换-->字符串-->数字;
// Boolean值会进行转换-->数字
console.log([] == true); //false ([]-->''-->0; true-->1)
console.log([] == false); // true ([]-->''-->0; false-->0)
console.log(![] == false); // true (因为加了!,所以[]-->true)
Number类型
- Number类型包括整数和浮点数值,同时定义了不同的数值字面量格式来支持各种数值类型。
浮点数值
- 浮点数值就是该数值中必须包含一个小数点,并且小数点后必须至少有一位数字。
let a1 = 1.1 // 1.1
let a3 = .1 // 0.1,不推荐
// 由于保存浮点数值需要的内存空间是保存整数值得两倍,
// 所以ECMAScript会自动将部分浮点数值转为整数
let a2 = 1. // 1
let a4 = 1.0 // 1
- 对于极大或极小的值,可以用e表示法(e前面的数值乘以10的指数次幂)表示
let a = 1.2e3 // 1.2*10^3^ = 1200
let b = 3e-4 // 3 * 10^-4^ = 0.0003
- 典型问题:
console.log(0.1+0.2 == 0.3) // false
- 原因: 浮点数运算有精度误差问题,根本原因是运算转换为二进制,小数点后支持52位,再把它转换为十进制,结果就成了0.30000000000000004,所以是false
数值字面量
- 最基本的数值字面量格式是10进制整数:
let a = 55
- 2进制字面值的前两位必须是0b,后跟0或1:
let a = 0b11
是2进制的3 - 8进制字面值的第一位必须是0,后跟8进制数字序列(0~7):
let a = 070
是8进制的56 - 16进制字面值的前两位必须是0x,后跟16进制数字序列(0~9 和 A~F):
let a = 0xA
是16进制的10 - 进制转换
parseInt(str,radix)
把radix进制(默认为10)字符串转为10进制返回
console.log(parseInt('11', 2)) // 3 console.log(parseInt('11', 8)) // 9 console.log(parseInt('11', 16)) // 17 console.log(parseInt('11')) // 11
Number.toString(radix)
默认将10进制数字转为radix进制
let a = 22 console.log(a.toString(2)) // 10110 console.log(a.toString(8)) // 26 console.log(a.toString(16)) // 16 console.log(a.toString()) // 22
NaN
- NaN(Not a Number)表示一个本来要返回数值的操作数未返回数值的情况
- isNaN()验证参数是否“不是数值”
console.log(isNaN(10)) // false
console.log(isNaN("10")) // false
console.log(isNaN("hello")) // true
console.log(isNaN(true)) // false
- 典型问题:
NaN==NaN的结果为false
- 原因: NaN 属性是代表非数字值的特殊值,该属性用于指示某个值不是数字,NaN不与任何值相等,比如"aa","bc"都为NaN,它们两个相比的结果肯定是false
转为数值
Number()
适用于任何数据类型parseInt(str,radix)
只适用于String类型,其它类型返回NaNparseFloat(str)
只适用于String类型,其它类型返回NaN,并且只解析十进制
console.log(parseInt("0xA")) // 10
console.log(parseFloat("0xA")) // 0
String类型
- String类型用于表示由0个或者多个16位Unicode字符组成的字符串。
字符字面量
- String数据类型包含一些特殊的字符字面量(转义序列),用于表示非打印字符或者具有其它用途的字符。如下表所示
字面量 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 空格 |
\r | 回车 |
\f | 进纸 |
\ | 斜杠\ |
\ ’ | 单引号 ’ |
\ " | 双引号 " |
\xnn | 以十六进制代码nn表示一个字符(n为0~F) |
\unnnn | 以十六进制代码nnnn表示一个Unicode字符(n为0~F) |
转换为字符串
String()
适用于任何数据类型toString()
不适用于null、undefined- toString()方法是Number、Boolean、Object、String自身拥有的方法
Symbol类型
- ES6引入了一种新的原始数据类型Symbol,表示独一无二的值
-
ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6引入Symbol的原因。
-
let s = Symbol();
console.log(typeof s) // symbol
Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。也就是说,由于Symbol值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
类型判断
typeof()
用来检测一个变量的类型,返回值为字符串(‘undefined’/‘object’/‘number’/‘boolean’/‘string’/‘function’/‘symbol’)
typeof 1 // number
typeof undefined //undefined
typeof { } //object
typeof [ ] //object
typeof console.log() //undefined
typeof console.log //function
typeof number //undefined
typeof Number //function
typeof Function //function
instanceof
检测的是原型,内部机制是通过判断对象的原型链中是否有类型的原型
var arr = [1,2,3,4];
console.log(arr instanceof Array)//true;
constructor
:根据prototype追溯数据类型
''.constructor == String // true
1.constructor == Number // true
[].constructor == Array // true
Object.prototype.toString.call()
:数组,正则,日期,对象上的判断
const call = Object.prototype.toString.call()
call(new Date);//[object Date]
call(new String);//[object String]
call(Math);//[object Math]
call(undefined);//[object Undefined]
call(null);//[object Null]
- 四则运算
- 加法运算符+是双目运算符,只要其中一个是String类型,表达式的值便是一个String
- 对于其他的四则运算,只要其中一个是Number类型,表达式的便是一个Number
- 对于非法字符的情况通常会返回NaN:‘1’*‘a’ // => NaN
let s1 = "1"+1 //11,string
let s2 = 1+"1" //11,string
let s3 = "1"+1-1 //10,number
let s4 = "1"+1-"1" //10,number
引用数据类型更新在下一篇文章。