判断数据类型与数组

js判断数据类型

1、typeof 用来检测数据类型的运算符
typeof null ->“object”
检测的不管是数组还是正则都返回的是"object",所以typeof不能判断一个值是否为数组

用于判断数据类型,返回值为6个字符串,分别为string、Boolean、number、function、object、undefined。
typeof在判断null、array、object以及函数实例(new + 函数)时,得到的都是object。这使得在判断这些数据类型的时候,得不到真是的数据类型。由此引出instanceof。

2、instanceof
判断对象和构造函数在原型链上是否有关系,如果有关系,返回真,否则返回假,基本数据类型是没有检测出他们的类型

instance中文翻译为实例,因此instanceof的含义就不言而喻,判断该对象是谁的实例,同时我们也就知道instanceof是对象运算符。
这里的实例就牵扯到了对象的继承,它的判断就是根据原型链进行搜寻,在对象obj1的原型链上如果存在另一个对象obj2的原型属性,那么表达式(obj1 instanceof obj2)返回值为true;否则返回false。

typeof和instanceof都是用来判断变量类型的,两者的区别在于:
· typeof判断所有变量的类型,返回值有number,boolean,string,function,object,undefined。
· typeof对于丰富的对象实例,只能返回"Object"字符串。
· instanceof用来判断对象,代码形式为obj1 instanceof obj2(obj1是否是obj2的实例),obj2必须为对象,否则会报错!其返回值为布尔值。
· instanceof可以对不同的对象实例进行判断,判断方法是根据对象的原型链依次向下查询,如果obj2的原型属性存在obj1的原型链上,(obj1 instanceof obj2)值为true。

3.constructor:查看对象对应的构造函数,undefined和null是不能够判断出类型的,并且会报错。因为null和undefined是无效的对象,因此是不会有constructor存在的
同时我们也需要注意到的是:使用constructor是不保险的,因为constructor属性是可以被修改的,会导致检测出的结果不正确

4、Object.prototype.toString(可以说不管是什么类型,它都可以立即判断出)
toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,更严格的讲,是 toString运行时this指向的对象类型, 返回的类型

基本数据类型和引用数据类型

基本数据类型
String,Boolean,Number,Undefined,Null;Symbol(ES6)
引用数据类型
Object(Array,Date,RegExp,Function)

JS中的变量都是保存到栈内存中的
基本数据类型的值直接在栈内存中存储
值与值之间是独立存在,修改一个变量不会影响其他的变量
栈内存存储对应空间地址。

对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,
而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,
当一个通过一个变量修改属性时,另一个也会受到影响
当比较两个基本数据类型的值时,就是比较值。
而比较两个引用数据类型时,它是比较的对象的内存地址,
如果两个对象是一摸一样的,但是地址不同,它也会返回false

Symbol 是一种新的数据类型,它的值是唯一的,不可变的.ES6 中提出 symbol 的目的是为了生成一个唯一的标识符,不过你访 问不到这个标识符,Symbol(ES6)属于基本数据类型

基本数据类型(存放在栈中)
引用数据类型(存放在堆内存中的对象,每个空间大小不一样,要根据情况进行特定的配置)

强制类型转换
Number(参数)把任何类型转换成数值类型
parseInt(参数1,参数2)将字符串转换成整数
parseFloat()将字符串转换成浮点数字
string(参数):可以将任何类型转换成字符串
Boolean()可以将任何类型的值转换成布尔值

基本数据类型): Undefined、Null、Boolean、Number和String
Object、Array和Function则属于引用类型
需要注意的是typeof null返回为object,因为特殊值null被认为是一个空的对象引用。
基本数据类型:Number、String、Boolean、Null、 Undefined、Symbol(ES6),这些类型可以直接操作保存在变量中的实际值。
引用数据类型:Object(在JS中除了基本数据类型以外的都是对象,数据是对象,函数是对象,正则表达式是对象)

判断数组

方法一:使用 toString 方法

function isArray(arg) {
	return Object.prototype.toString.call(arg) === '[object Array]'
}

let arr = [1,2,3]
isArray(arr)  // true

方法二:使用 ES6 新增的 Array.isArray 方法

let arr = [1,2,3]
Array.isArray(arr) // true

数组方法

(1)map --映射
(2)reduce --汇总
(3)filter --过滤
(4)forEach --迭代
es6数组扩展了比如find,findIndex

遍历数组的方法有哪些?
for循环 for… in foreach方法 filter( ) map 遍历数组 every() some()

forEach:遍历开始以后无法停止,如果要遍历整个数组,那就使用这个方法;
map:根据当前数组映射出一个新的数组;
some:遍历整个数组,返回值true就停止循环(返回false继续循环)? ? ? ? ?返回值:如果数组中的有一项回调函数返回true,那么结果为true,否则为false;(或者这样理解:数组被遍历完,那么结果为false,否则为true)
every:与some相反,返回false就停止循环(返回true就继续循环)
filter:过滤数组,返回一个新的数组
循环出来的是key, for…of循环出来的是value,filter函数, 过滤通过条件的元素组成一个新数组, 原数组不变

1.原生for循环法,最常用,使用简单,性能强悍,顺序严格
2.forEach循环,此方法为数组自带方法,使用方便,性能稍弱,遍历出来可能不能保留数组中的顺序
3.原生的for…in循环,既可以用于遍历数组,也可以用于遍历对象,
4.es6的新方法 map,使用优雅,但是性能不及forEach,不适合严格顺序的遍历

js 数组类型中常用的方法
concat()
连接两个或更多的数组,并返回结果.
join()
把数组的所有元素放入一个字符串.元素通过指定的分隔符进行分隔.
pop()
删除并返回数组的最后一个元素
push()
向数组的末尾添加一个或更多元素,并返回新的长度.
reverse()
颠倒数组中元素的顺序.
shift()
删除并返回数组的第一个元素
slice()
从某个已有的数组返回选定的元素
sort()
对数组的元素进行排序
splice()
删除元素,并向数组添加新元素.
toSource()
返回该对象的源代码.
toString()
把数组转换为字符串,并返回结果
toLocaleString()
把数组转换为本地数组,并返回结果.
unshift()
向数组的开头添加一个或更多元素,并返回新的长度.
valueOf()
返回数组对象的原始值

数组的 map 方法:返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组
语法:array .map( callback [, thisArg ])
返回值:原数组中的元素经过该方法后返回一个新的元素

Set结构是类似于数组结构,但是成员都是不重复的值
Map结构是键值对集合(Hash结构)
两者都是可以去重,set的话直接打数组放进去,然后直接返回一个去重的数组
Map去重的话要遍历每一项,并且要进行判断才能去重.比较麻烦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值