数组、字符串、对象、类数组、typeof
数组中常用方法
改变原数组 在原数组上操作
.push(num1,num2,num3...)
在数组的最后添加数据
.pop( )
把数组最后一位剪切
.shift( )
把数组的第一个元素从其中删除,并返回第一个元素的值。
.unshift(num1,num2.. )
向数组开头添加一个或更多元素,并返回新的长度。
.reverse( )
将该数组反序
.splice(从第几位开始,截取多少长度,在切口添加新的数据1,在切口添加新的数据2...)
.sort( )
根据asc码排升序,提供函数接口可按需设计排序
sort()
里写的函数规则:
1.必须写俩形参;
2.当返回值是负数,前面的数放前面;为正数,前面的数放后面;为0不动
不改变原数组 返回新数组
concat join ---> split toString slice
.concat( )
将两个数组拼接
var arr = [1,2,3],
arr1 = [4,5,6];
//因为不改变原数组并且返回新数组所以要拿变量接收
var newArr = arr.concat(arr1) ---> [1,2,3,4,5,6]
.slice(从该位开始截取,截取到该位之前)
//只填一个参数就从该位截取到最后,无参数全部截取
var arr = [1,2,3,4,5,6];
var newArr1 = arr.slice(1,3) ---> [2,3]
.join('写哈用哈链接,不写用逗号,写空串直接连') 返回字符串
var arr = [1,2,3,4,5];
var newArr = arr.join('~'); ---> '1~2~3~4~5'
.split('写哈用哈拆分,且写的是该数组里有的') 返回数组
这个其实是字符串上的方法
var str = '1~2~3~4~5';
var arr = str.split('~'); ---> ['1','2','3','4','5']
新增数组方法
迭代(遍历)方法:forEach()
、map()
、filter()
、some()
、every()
forEach()
遍历(循环)数组
//array.forEach(function(当前数组值,当前数组索引,数组对象本身))
var arr = [1,2,3,4,5];
var sum = 0;
arr.forEach(function(value, index, arr) {
sum += value;
})
console.log(sum);//15
filter()
返回一个新数组,新数组中的元素是通过指定方法筛选出来的,主要用于筛选数组
//array.filter(function(数组当前的值, 当前数组索引, 数组对象本身))
var arr = {1,2,3,4,33,44,55};
var newArr = arr.rilter(function(value, index) {
//return value >= 20;//[33,44,55]
return value % 2 === 0;//[2,4,44]
})
console.log(newArr);
some()
返回布尔值,检测(查找)数组中有无满足指定条件的元素,有返回true
无返回flase
找到第一个满足条件的元素就终止循环输出结果,不再查找
//array.some(function(数组当前的值, 当前数组索引, 数组对象本身))
var arr = [1,2,4,5,7,8, 'red'];
var flag = arr.some(function(value) {
//return value >= 3;//true
//return value < 0; //false
return value == 'red';//true
})
console.log(flag);
MAP 与数组的关系
Map
对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。
一个Map
对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for...of
循环在每次迭代后会返回一个形式为[key,value]
的数组。
let kvArray = [["key1", "value1"], ["key2", "value2"]];
// 使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
let myMap = new Map(kvArray);
myMap.get("key1"); // 返回值为 "value1"
// 使用Array.from函数可以将一个Map对象转换成一个二维键值对数组
console.log(Array.from(myMap)); // 输出和kvArray相同的数组
// 更简洁的方法来做如上同样的事情,使用展开运算符
console.log([...myMap]);
// 或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组
console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]
新增字符串方法
trim() 删除字符串两端的空白字符,返回一个新的字符串
str.trim();
var str = ' par ker ';
console.log(str);//' par ker '
var newStr = str.trim();
console.log(newStr)//'par ker'
//实例应用:可以解决input输入框,输入空格判断为有值得情况
新增对象方法
Object.keys()
用于获取对象自身所有的属性名
Object.key(obj)
类似于for...in
,返回一个由属性名组成的数组
var obj = {
name: 'parker',
age: 18,
id: 1
}
var arr = Object.key(obj);//['name', 'age', 'id']
Object.defineProperty()
定义对象中新属性或修改原有属性
Object.defineProperty(目标对象,需定义或修改的属性的名字,目标属性拥有的特性)
以上三个参数都是必填项
Object.defineProperty()
第三个参数以对象的形式书写{}
value
:设置属性的值,默认为undefinedwritable
:定义该值是否可以重写,true | false
默认false
enumerable
:目标属性是否可以被被枚举(遍历),true | false
默认false
configurable
:目标属性是否可以被删除或是否可以再次修改特性,true | false
默认false
var obj = {
name: 'parker',
age: 18,
id: 1
}
//第二个参数在原对象中没定义就是添加
Object.defineProperty(obj, 'color', {
value: 'blue';
enumerable: true;//该属性可被枚举
})
console.log(obj);
//第二个参数在原对象中定义了就是修改
Object.defineProperty(obj, 'age', {
value: '20';
})
console.log(obj);
//第三个参数
Object.defineProperty(obj, 'id', {
writable: false;
})
obj.id = 2;
console.log(obj.id);// 1
类数组
可以利用属性名模拟数组的特性
可以动态的增长length属性
如果强行让类数组调用push方法,则会根据length属性的位置进行属性的扩充
类数组的特性是把对象和数组的属性拼到一起
类数组属性要为索引(数字)属性,必须有length属性,最好加上push
var obj = {
'0': 'a',
'1': 'b',
'2': 'c',
name: 'abc',
age: 123,
length: 3,
push: Array.prototype.push,
splice: Array.prototype.splice
}
typeof 类型转换
number
string
boolean
object
undefined
function
显示类型转换
//类型变成number类型,null->0 bool->0/1 undefined->NaN
// 转换不成数字的->NaN
Number(mix)
//识别数字开头的和第一个小数点的数
//parseFloat('123.45.5.1abc') -> 123.45
parseFloat(string)
//转换成整型 parseInt(12.3) -> 12 parseInt('123.5abc') -> 123
//俩参数时,以目标进制为基底转换成10进制的数 parseInt(string,基底)
//基底取值范围2-36,2进制到36进制,前一个参数要符合基底,否则NaN
parseInt(string, radix)
//parseFloat('123.45.5.1abc') -> 123.45
parseFloat(string)
//如果谁想变成字符串,谁就用点调用toString( ) num.toString( )
//undefined和null不能用
//参数是基底,把10进制的数转换成目标基底的数
//var num = 10; num.toString(8) -> 12
toString(radix)
//把参数变成字符串类型
String(mix)
//把参数转换成bool类型,其它为true
//被认定为false的值:undefined , null , NaN , “” , 0 , false
Boolean()
隐式类型转换
isNaN( )
--> 隐式调用Number( );
++、--、正负号+、-
--> 隐式调用Number( );
+
当加号两边有一个是字符串类型就会调用String( );
-、*、/、%
–> 隐式调用Number( );
&&
||
!
隐式调用Boolean( );
<
>
<=
>=
数字和字符串比隐式调用Number( );
== !=
没有隐式类型转换
===
!==
实例
数组排序 sort()
var arr = [23,43,55,63,3,2,9];
arr.sort(function(a,b) {
//return a-b; 升序
//return b-a; 降序
}
数组乱序 sort()
var arr = [1,2,3,4,5,6];
arr.sort(function() {
return Math.random( ) - 0.5;
});
数组去重
原型链上编程此方法用到this不能使用箭头函数(该方法this指向调用者)
Array.prototype.unique = function() {
var temp = {},
arr = [],
len = this.length;
for (var i = 0; i < len; i++) {
if (!temp[this[i]]) {
temp[this[i]] = 'abc';
arr.push(this[i]);
}
}
return arr;
}
var arr = [1,2,2,3,3,3,4];
var newArr = arr.unique();//[1,2,3]
Set()方法去重
Set
对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
var arr = [1, 2, 3, 4, 4, 4, 4];
//new Set(arr)返回的是对象,使用[]和...扩展运算符转换成数组
var arr1 = [...new Set(arr)];
console.log(arr1);//[1,2,3,4]
封装完整版typeof
typeof([ ]) --- array
typeof({ }) --- object
typeof(function) --- object
typeof(new Number( )) --- number Object
typeof(123) --- number
function type(target) {
var ret = typeof(target);
var template = {
'[object Array]': 'array',
'[object Object]': 'object',
'[object Number]': 'number - object',
'[object Boolean]': 'boolean - object',
'[object String]': 'string - object'
}
if (target === null) {
return 'null';
} else if (ret == 'object') {
var str = Object.prototype.toString.call(target);
return template[str];
} else {
return ret;
}
}
数组扁平化
将多维数组转化为一维数组
let arr = [
[1, 2, 3, ],[4, 5, 6],[7, [8, 9, [10, 11, [12]]]]
]
ES6方法
let arr1 = arr.flat(Infinity); // [1,2,3,.....,12]
用转换成字符串的方法
toString方法
arr1 = arr.toString().split(',').map(item = > parseFloat(item));
toString()
可以将数组转化成字符串,split()
将字符串用,
分隔成数组,map()
把每一项转换成数字
其他
- 当且仅当一个未定义的变量放在console.log(typeof(a))中不报错
- typeof( )返回值的类型是string
- NaN不与自身相等且不与任何值相等
- 字符串和字符串比较的是ASC码
- arguments实参列表是个类数组