关于javascript 的数据类型

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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值