Javascript中的数据结构

看到题目可能一脸懵逼,前端也需要数据结构?扯什么jb,写写样式、做做页面交互不就没了么?
坦白讲,一开始我也是这么认为的,实际上只要涉及编程,都会有数据结构和算法!
那么Js中的数据结构是什么样子的?
第一部分:Js中的基本数据类型(js大小写敏感)
简单数据类型:String number boolean null undefined symbol
String:表示字符串类型

var test0='test';
console.log(typeof(test0));//返回  string
var test1=new String('test');
console.log(typeof(test1));//返回   object

Number:表示数字

var m=1;
console.log(typeof(m));     //输出 number

Boolean:布尔值:true/false

var m=true;
console.log(typeof(m));    //boolean

Null:空,空嘛,就是啥也没有

var m=null;
console.log(m);          //null
console.log(typeof(m));  //object
咦?为什么是object?
    这实际上是涉及到JavaScript内部的存储机制,js中的数据在底层是以二进制存储,如果前三位为0,那么就会判定为object,而null的所有都为0,自然也就是object类型了,记住就好了,特殊情况特殊处理。

Undefined:未定义,声明了变量但是没有赋值

var m;
console.log(s);   //undefined  ,如果一个没有声明的变量,会报错

Symbol:( 在 ECMAScript 6 中新添加的类型).。一种数据类型,它的实例是唯一且不可改变的。

var  s=Symbol('添加描述');
console.log(s);    //Symbol(添加描述)
console.log(typeof(s)); //symbol

那么数据类型之间的转换是什么样子呢?
简单来说:
+:会将数字转化为字符串
其他运算符不会将数字转化为字符串
复杂数据类型:object function array date RegExp Error
Object:对象,object被其他所有的复杂数据类型引用(为什么没用父类这个说法,避免混淆)

var obj={};
function fun(){};
var arr=[];
var date=new Date();
var er=new Error('ssss');
console.log(typeof(obj));
console.log(typeof(fun));
console.log(typeof(fun.prototype));
console.log(typeof(arr));
console.log(typeof(date));
console.log(er);
//输出
object
function
object
object
object
Error: ssss

特殊函数api:Math,不需要创建,直接使用函数api
第二部分:数据结构
最基本的数据结构:数组array

/**
 * Created by 451-donspeng on 2017/5/28.
 */
var name=["ok","ss"];
var res=name.join();
console.log(res);
console.log(name.toString());
//concat 不影响原来数组
var first=["1","2","3","4"];
var second=["5","6","7","8"];
res=first.concat(second);
console.log(res);
res=second.concat(first);
console.log(res);
//slice 不影响原来的数组,原数组也不会影响现在的数组,如果第二个值为空,默认到最后一个元素
var sliceArr=first.slice(1);
first.push("10");
console.log(first);
console.log(sliceArr);
//splice 影响原来数组,第一个为截取的索引,后面为截取的长度,如果第二个值为空,默认最后一个元素
var spliceArr=first.splice(1);
console.log(spliceArr);
console.log(first);
//向数组开头添加元素,数组移位
function addHead(arr,item){
    var len=arr.length;
    for(;len>0;len--){
        arr[len]=arr[len-1];
    }
    arr[0]=item;
    return arr;
}
console.log(addHead(second,"head"));
//或者通过unshift
console.log(second);
second.unshift("un","ss");//  该函数返回数组的个数。。。。。。。。什么几把玩意
console.log(second);
//删除元素
//删除第一个元素
function delLast(arr){
    var len=arr.length;
    for(var i=0;i<len-2;i++){
        arr[i]=arr[i+1];
    }
    return arr;
}
console.log(delLast(second));
//移除第一个
second.shift(second);
console.log(second);
//移除最后一个
second.pop(second);
console.log(second);
//从中间位置删除元素===使用splice
second.splice(1,2,1,2,3);
console.log(second);
//对数组排序,默认是字典序排序
var a=[,1,2,5,4,8,0,5,4,100];
a.sort();
console.log(a);
var b=[,1,2,5,4,8,0,5,4,100];
function compare(one,two){
    return one-two;
}
b.sort(compare);
console.log();
//迭代器方法
//foreach:接受一个函数作为一个参数,使数组中的每个元素都使用该函数
//every:使数组中的每一个元素都使用该函数,如果所有的元素均返回true,则该函数返回true
//some:与every相反,只要有一个为true,那么就返回true
//reduce:接受一个函数,从累加值开始计算,相当于保存了前一次运行的结果。。。。
//reduceRight:从右往左执行
var num=[1,2,3,4,5,6,7,8,9,10,11];
function die(item){
    console.log(item,item*item);
}
function isEven(item){
    return item%2==0;
}
num.forEach(die);
//var num=[2,4,6,8,10];  //如果全部为偶数,那么久返回true
var even=num.every(isEven);
//var sssss=num.some(isEven);
if(even){
    console.log("全部为true");
}
else{
    console.log("不全部为true!");
}
//使用reduce求和
function add(now,before){
    return now+before;
}
var su=num.reduce(add);
console.log(su);
//使用reduce连接字符串
var str=["10","20","30","40","50","60"];
console.log(str.reduce(add));
//生成新数组的迭代器方法
//map:返回一个新数组,是元素的每一个item,应用函数的结果
//filter:传入一个为返回值为布尔型的函数,返回一个满足条件的新数组,也可以使用其过滤字符串
function curve(item){
    return item+1;
}
var result=num.map(curve);
console.log(result);
function cr(item) {
    return item[0];
}
var re=str.map(cr);
console.log(re.join(""));
function ne(item){
    if(item>5) return true;
    else return false;
}
console.log(num.filter(ne));
//多维数组,javascript中不支持多维数组,但是可以数组中,每一个元素为数组,实现多维数组,数组的形式不是矩阵的形式,相当于对数组进行降维
//转化为n行1列
//处理多维数组的方法:就是两层循环就解决了。。。。。。
//最简单创建多维数组的方式如下:
console.log("#############多维数组#################")
var mul=[[1,2,3],[4,5,6],[7,8,9]];
console.log(mul[2][2]);
d(mul);
//处理多维数组,假如求每一行的和
function d(mul) {
    for(var i=0;i<mul.length;i++){
        var sum=0;
        for(var j=0;j<mul[i].length;j++){
            sum+=mul[i][j];
        }
        console.log("第"+i+"行的和:"+sum);
    }
}
//动态添加多维数组元素
Array.matrix=function (row,col,initItem){
    var arr=[];
    for(var i=0;i<row;i++){
        var cols=[];
        for(var j=0;j<col;j++){
            cols[j]=initItem;
        }
        arr[i]=cols;
    }
    return arr;
}
//测试方法
var test=Array.matrix(5,5,1);
console.log(test[4][4]);
test[3][3]=6;
console.log(test[3][3]);
console.log(test);

复杂数据结构(都可以用array构造出来):
es自带的:set map weakset weakmap
es未有的:dictionary list linkedlist doublelinkedlist quene hash stack
本文先简单介绍下es6自带的数据结构,es未有的请移步github查看源码,不过多介绍
set:值唯一、不重复(可以用于数组去重)
方法:
add:添加一个值
delete(value):删除某一个值,返回布尔值
has(value):返回布尔值
clear:清除所有值,无返回值
keys/values:遍历,因为set中没有键值对,所以所有的都是值,两者对于set是一样的
entries:返回键值对,对于set返回的是一样的重复的两个值
weakset:值唯一、不重复、值只能为对象
weakset中的引用都是弱引用(所谓弱引用就是指垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中);不可遍历
map:键值对,其中键是和内存地址对应的,内存地址不一样,就视为不同的键
方法:get/set/has/clear/size/delete
weakmap和weakset类似:方便垃圾回收
关于JavaScript中map和set的方法,请看
ES6标准

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值