js数据类型(学习笔记) ----九层之台,起于累土;javascript
基本数据类型是保存在栈内存中,直接按值存放的,因此能够直接访问java
Number 如:1 2 3 NaN (not a number)数组
String 如:'' "" 'hello zhufeng'浏览器
Boolean 如:true false函数
Null 如:空(空指针)工具
Undefined 如:未定义(默认值)学习
Symbol(ES6新增)ui
引用数据类型是保存在堆内存(浏览器分配的一块内存空间)中的对象,对象赋值后的变量实质存储的是这块堆内存的引用地址(指针)spa
普通对象 object {}
数组 Array []
正则 RegExp /\d+/
日期 Date
Math
....net
function
浏览器中JS引擎存在栈内存(Stack)和堆内存(Heap)的概念(这里只是一个大概的概念,后面再详细解读)
下图中的红色 a、b、c 是定义的引用数据类型变量 指向堆内存中某块空间里面 存有 1 2 3 4
typeof
typeof 检测一个值数据类型 返回相应数据类型 而且返回值是字符串类型
用法:typeof value / typeof(value)
typeof 2 // "number"
// 也能够做为函数用
typeof(2) // "number"
复制代码
typeof的局限性 只能检测基本数据类型 对于对象数据类型不能细分 如: 是正则 仍是数组
typeof 1 // "number"
typeof NaN // "number"
typeof '' // "string"
typeof "24" // "string"
typeof true // "boolean"
typeof false // "boolean"
typeof undefined // "undefined"
// null 特殊状况 至关于空指针对象
typeof null // "object"
// 函数数据类型
function fn () {
}
console.log(typeof fn) // "function"
var fe = function() {
}
console.log(typeof fe) // "function"
// 普通对象
var arr = [1]
console.log(typeof arr) // "object"
var object = {title: 'hello'}
console.log(typeof object) // "object"
typeof(/\d/) // "object"
复制代码
instanceOf
判断一个实例对象是否属于某种类型 返回值Boolean类型(它的原理js面向对象-原型)
// 若是是基本数据类型 须要经过构造函数方式建立的值(包装对象) 才能检测出来
console.log(1 instanceof Number) // false
var num = new Number(1)
console.log(num instanceof Number) // true
console.log('' instanceof String) // false
var str = new String('hello')
console.log(str instanceof String) // true
复制代码
constructor 根据对象引用的构造函数来判断
var obj = {}
console.log(obj.constructor === Object) // true
var arr = []
console.log(arr.constructor === Array) // true
var date = new Date()
console.log(date.constructor === Date) // true
var reg = /\d+/
console.log(reg.constructor === RegExp) // true
复制代码
Object.prototype.toString.call(value) 终极解决方案
toString() 是 Object 的原型方法,调用该方法 返回值格式 "[object 类名]]"
// toString() 是 Object 的原型方法,调用该方法 返回值格式 [object 类名]]
console.log(Object.prototype.toString.call(1)) // "[object Number]"
console.log(Object.prototype.toString.call('a')) // "[object String]"
console.log(Object.prototype.toString.call([])) // "[object Array]"
console.log(Object.prototype.toString.call({})) // "[object Object]"
console.log(Object.prototype.toString.call(function(){})) // "[object Function]"
console.log(Object.prototype.toString.call(null)) // "[object Null]"
console.log(Object.prototype.toString.call(undefined)) // "[object Undefined]"
console.log(Object.prototype.toString.call(true)) // "[object Boolean]"
复制代码
parseInt(string, radix)
从左到右将字符串中的整数提取出来,如遇到的不是数字或小数点 中止查找 返回找到后整数 或NaN,也可将其余进制转换为十进制整数(需指定第二个参数)
参数:
string 要解析的字符串
radix 可选。默认为0(十进制) 表示要解析的数字基数。该值介于(0~36)之间 十进制转换
// 从左到右将
console.log(parseInt('10')) // 10
console.log(parseInt('20.5')) // 20
console.log(parseInt('20a')) // 20
// 若是字符串的第一个字符不能被转换为数字 会返回 NaN。
console.log(parseInt('a20a')) // NaN
parseInt([]) // NaN
parseInt([1]) // 1
parseInt(null) // NaN
// 进制转换
// 十六进制转换为十进制
parseInt('0xff', 16) // 255 15 + 16 * 15
// 二进制转换为十进制
parseInt(110, 2) // 6 2 + 4
// 八进制转换为十进制
parseInt(70, 8) // 56 8 * 0 + 8 * 7
复制代码
parseFloat()
函数可解析一个字符串 支持小数,并返回一个浮点数(小数)。
console.log(parseFloat('10')) // 10
console.log(parseFloat('20.5')) // 20.5
console.log(parseFloat('20.3a')) // 20.3
// 若是字符串的第一个字符不能被转换为数字 会返回 NaN。
console.log(parseFloat('a20a')) // NaN
parseFloat([]) // NaN
parseFloat([1]) // 1
parseFloat(null) // NaN
复制代码
Number
将其余类型转换为数字
// 字符中只要有一个不是有效数字 就返回NaN
console.log(Number('12.5')) // 12.5
console.log(Number('20k')) // NaN
Number(null) // 0
Number(undefined) // NaN
// 将数组转换为数字
Number([]) // 0
Number([1]) // 1
Number([1, 2]) // NaN
// 将对象转换为数字
var obj = {}
console.log(Number(obj)) // NaN
obj.valueOf = function() {
return 2
}
console.log(Number(obj)) // 2
+[] // 0
+[1] // 1
+'1' // 1
+'1.5' // 1.5
// Date对象 转换为毫秒数
console.log(Number(new Date())) // 1543587621655
复制代码
// !! 至关于Boolean()
console.log(!!1) // true
console.log(Boolean(1)) // true
console.log(!![]) // true
console.log(Boolean([])) // true
console.log(!!'1') // true
console.log(Boolean('1')) // true
console.log(!!'') // false
console.log(Boolean('')) // false
!!null // false
Boolean(null) // false
!!{} // true
复制代码
除了 null undefined NaN '' 0 转换为Boolean是false, 其他都是true
String(false) // 返回 "false"
String(true) // 返回 "true"
true + "" // "true"
复制代码
(123).toString() // "123"
100 + "" // "100"
复制代码
[1, 2] + "" // "1,2"
[[[1, 2]]] + "" // "1,2"
[[[1, 2]]].toString() // "1,2"
[1, 2].join() // "1,2"
[1, 2].join("") // "12"
[1, 2, 3, 4, 5].join('+') // "1+2+3+4+5"
复制代码
5 + null // 返回 5 null 转换为 0
"5" + null // 返回"5null" null 转换为 "null"
"5" + 1 // 返回 "51" 1 转换为 "1"
"5" - 1 // 返回 4 "5" 转换为 5
复制代码
----------------------------------------------------------------------------------------------------------------
参考文章&&强烈推荐:布罗利