js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Undefined,Null),和一种复杂数据类型(Object)。我们可以使用typeof *** 作符来判断响应参数的设备类型。
let a = []; if ( typeof a === 'object' ) console.log('是object');
需要注意的是,在js中,所以的聚合数据类型都是以object来表示,包括list,dic 和 set,那么,该如何区分list和dic呢?这里我们就要区分list和dic的不同了,list是有length这个属性的,而dic作为键值对,是没有length这个属性的。
Numbernumber在js中采用的是IEEE754中的浮点数计算标准来计算的,也就是在js中的一切数字都会被转化成浮点型,通过Number.MAX_VALUE得知,我们最大可以表示10308的整型数,但是因为浮点计算的损耗,所以我们能够精确到个位的最大的整型数在253,所以如果你需要表示一个java中的Int值,那么很容易会导致精度丢失。
// 判空条件,特别注意: // 1. typeof NaN === 'number' 故需要判断 不为NaN // 2. if (a) 条件不完备,因为 a === 0 时为false,导致a即使时数字也会报错 if (typeof a === 'number' && !isNaN(a) )String
// 转型问题 // undefined和null类型不能使用toString的转型函数,故出于安全考虑,一般使用String() 来进行转化。 let a; console.log(a.toString()); // error console.log(String(a)); // undefined // 判空条件, 需要特别考虑为空字符串是否应该被判断为空的问题 if (typeof a === 'string' && a !== '')Object
object是引用数据类型的简称,我们常用的有list(数组),dic(键值对)和function(没错,在js中函数也是引用类型)。
引用类型和基本数据类型的一个重要的区别是深浅拷贝的问题:
值类型,在从一个变量向另一个变量赋值基本类型时,会在该变量上创建一个新值,然后再把该值复制到为新变量分配的位置上。
而当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。这时保存在变量中的是对象在堆内存中的地址,所以,与简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值 *** 作后,两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响。
因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的 *** 作都会相互影响。
// list 判空, 需额外注意 length 为 0是是否为空 if ( typeof a === 'object' && a.length > 0 ) // dic 判空,需额外注意 {} 是否为空 if ( typeof a === 'object' && isEmptyObject(a) )和JAVA间数据类型的转化
我们知道,js作为弱类型语言,它里面的变量在不做特殊处理时是不会进行类型检查的,这就会导致java中数据的数据类型丢失,例如 String a = “20000000000000000000”(某个不超过264但大于253的大整数),在使用ReactMethod进行数据传递时Sting类型会丢失,在RN中会自动转化成Number,导致数据精度的丢失。
所以为了安全起见,我们规定,所以js和java间的数据传递都需要通过json来传递。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)