js数据类型
- 8种数据类型。Number、String、Boolean、Null、undefined、object、symbol、bigInt。
2.在ES5的时候,我们认知的数据类型确实是 6种:Number、String、Boolean、undefined、object、Null。
ES6 中新增了一种 Symbol 。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。
谷歌67版本中还出现了一种 bigInt。是指安全存储、操作大整数。(但是很多人不把这个做为一个类型)
数据类型判断
- typeof 对基本数据类型判断]()是没有问题的 但是遇到引用数据类型就不起作用了
typeof :
对于基本类型,除 null 以外,均可以返回正确的结果。
对于引用类型,除 function 以外,一律返回 object 类型。
对于 null ,返回 object 类型。
对于 function 返回 function 类型。
其中,null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型,没有错,但不是我们想要的结果。 - instanceof 判断 new 关键字创建的引用数据类型]() 不考虑null 和 undefined
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型 - constructor 完全可以应对基本数据类型和引用数据类型]() 但是声明一个构造函数 把他的原型指向Array的原型 这种情况下也不能判断
null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。 - 函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object
- Object.prototype.toString.call() 是完美解决方案
- jquery.type()
如果对象是undefined或null,则返回相应的“undefined”或“null”。
arguments
1.arguments 对象是当前函数的一个内置属性,只能在其关联函数的范围内直接进行访问。
当 arguments 对象开始执行时,它会为每个函数进行实例化。
2.使用 arguments 对象可以创建可接受任意个参数的函数,这一功能还可以通过在定义函数时使用参数数组结构来实现
3.在函数代码中,使用特殊对象 arguments,我们无需明确指出参数名,就能访问它
传递到函数的所有参数和参数的数目都存储在arguments对象中,用 arguments 对象检测函数的参数个数,引用属性 arguments.length。arguments对象的长度是由实参个数决定的,不是形参个数决定的(形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠)
与其他程序设计语言不同,JS不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 255 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略。
4.用 arguments 对象判断传递给函数的参数个数,模拟函数重载
5.把arguments对象转换成一个真正的数组,含有一个函数所有参数的标准javascript数组对象(arguments 对象不是数组,但访问各个参数与访问数组元素的方式相同,要使用 [ ] )
Array.from() 是个非常推荐的方法,其可以将所有类数组对象转换成数组。