Javascript数据类型
数据类型可以分为7种:NULL,Undefined,Number,String,Boolean,Symbol,Object
其中前6种为基础类型,最后1种为引用类型
Undefined
Undefined 是一个很特殊的数据类型,它只有一个值,也就是undefined。可以通过下面几种方式来得到Undefined:
- 引用已声明但未初始化的变量
- 引用未定义的对象属性
- 执行无返回值函数
- 执行void表达式
- 全局变量 window.undefined 或 undefined
var a //undefined
var o = {} //undefined
o.b //undefined
(()=>{}) //undefined
void 0 //undefined
window.undefined / /undefined
其中比较推荐通过 void 表达式来得到undefined值,因为这种方式既简便(window.undefined 或 undefined 常量的字符长度都要大于 void 0), 同时它作为表达式还可以配合三目运算符使用,代表不进行任何操作
如下面的代码满足条件的时候执行 fn() ,否则不进行任何操作
x>0 && x<5 ? fn() : void 0
判断变量x是否为undefined
if(!x){ //x的值为undefined ,null ,空串, 数值0 都能判断为真
}
if(x===undefined){ // 如果x未定义则会抛出错误”ReferenceError: x is not defined“
}
if(typeof x == 'undefined'){ //这个很ok
}
null
Null 数据类型和Undefined 类似,只有唯一的一个值 null,都可以表示空值,甚至我们通过 ”==“ 来比较它们是否相等的时候得到的结果都是true,但null 是javascript 保留关键字,而undefined只是一个常量。
Boolean
Number
两个重要值
Number是数值类型,有2个特殊数值得注意一下,即 NaN 和 Indinity
NaN 通常计算失败的时候会得到该值
Infinity 是无穷大
String
千分分隔符是为了方便识别较大的数字,每隔3位数就会加入一个1个逗号,该逗号就是千分分隔符。
例如1234456.789
转换过之后1,234,456.789
第一种方法
function step(n) {
// 先分割成整数位和小数位
let [i , c] = n.toString().split(/(\.\d)/)
return (
i.split('').
reverse().
map((item,index)=>(index+1) % 3 ==0?','+item : item)
.reverse()
.join('')
.replace(/^,/,'')
+ c )
// 把整数位分割成数组
// 把数组反转进行分隔
// map 遇到3的倍数则增加一个分隔符,
// 把分隔好的数组,翻转回来
// 把数组转换成字符串
// 以防开头是,进行正则验证
// 最后把小数位加上
第二种方法
let str = n.toString();
str.indexOf(".") < 0 ? (str += ".") : void 0;
return str.replace(/(\d)(?=(\d{3})+\.)/g, "$1,").replace(/\.$/, "");
Symbol
Symbol 是ES6 中引入的新数据类型,它表示一个唯一的常量
通过Symbol 函数创建对应的数据类型,创建时可添加变量描述,该变量描述在传入时会被强行转换成字符串进行存储
var a = Symbol('1')
var b = Symbol(1)
a.description == b.description // true
var c = Symbol({id:1})
c.description // [Object, Object]
Symbol数据类型比较适用于两类场景中: 常量值和对象属性
Object
- 由于引用类型在赋值时只传递指针,这种拷贝方式为 浅拷贝
- 而创建一个新的与之相同的引用类型的过程称之为 深拷贝
实现一个拷贝函数
function colne (obj){
let map = new WeakMap()
function deep(data){
let result = {}
const keys = [...Object.getOwnPropertyNames(data),...Object.getOwnPropertySymbols(data)]
if(!key.length) return data
const exist = map.get(data)
if(exist) return exist
map.set(data,result)
keys.forEach(key => {
let item = data [key]
if(typeof item == 'object' && item){
result[key] = deep(item)
}else {
result[key] = item
}
})
returm result
}
return deep(obj)
}