2018-03-26 JS标准库和数组

1. String

String(s);    //'s',不加new 就直接输出字符串
new String(s)    //String{'s'},加new就输出一个对象

2. Number

Number(sss)    //报错,Error: sss is not defined
Number('sss')    //NaN,NaN也是一个数字
Number(1)    //1
Number('1')    //1
new Number(123)    //Number{123},加new就变成对象

3. Boolean

6个falsy值
Boolean(false)    //false
Boolean(undefined)    //false
Boolean(null)    //false
Boolean(NaN)    //false
Boolean('')    //false
Boolean(0)    //false

其他的全是true

4. 基本类型和复杂类型的区别

数据类型.png

除了对象(包括数组、函数)是复杂类型,其他数据类型都是基础类型

5. Object

Object(1);    //Number{1},前加new 和不加new是一样的
Object('s')    //String{'s'}
Object()    //{}

6. Array

1. 用法
第一种用法:

let a = ['a','b'];    //['a','b']
let b = new Array('a','b');   //['a','b']
//上面两种写法效果是一样的

let a = Array(3)  //创建了一个长度为3的空数组
a.length    //3
a[0]   //undefined
0 in a    //false

let a = new Array(3)     //和上面一样

第二种用法:

let a = Array(3,3);    //[3,3],length为2
//这和第一种一样的写法,功能却不同,不一致性,JS的垃圾之处

2. 什么是数组?

数组.png
数组就是对象,是拥有特殊原型链的对象,有Array.prototype的就是数组,没有的就不是数组
3. 伪数组

let obj = {
    0:'1',
    1:'2',
    length:2;
} //看起来像数组,但没有Array.prototype的,就是伪数组

arguments是伪数组

4. 数组的API

  1. forEach
var a = ['a','b','c'];
a.forEach(function(x,y){
  console.log(y);    //y是key
  console.log(x);    //x是value
})
//0 a
//1 b
//2 c
  1. sort,这个API会改变原值!只有这一个API会改变原值
var l = [2,3,1];
l.sort();    //[1,2,3],从小到大排序

// sort还会给首字母排序
var fruit = ['cherries', 'apples', 'bananas'];
fruit.sort();   //  ['apples', 'bananas', 'cherries']

// 直接sort()只会给首个数字排序
var s = [1,10,21,2,3];
s.sort()  //[1,10,21,2,3]

可以用function作为参数

var s = [1,10,21,2,3];
s.sort((x,y) =>  x - y)  
//  [1,2,3,10,21],正序排列

s.sort((x,y) => y - x)  
//  [21,10,3,2,1],倒序排列

对象里的排序

var s = [{age:3},{age:2},{age:1}]

s.sort((x,y) =>  x.age - y.age)
//  [{age:1},{age:2},{age:3}]

//  按成绩高到低排名
var students = ['小明','小红','小花'];
var scores = { 小明: 59, 小红: 99, 小花: 80 };
students.sort((x,y) => scores[y] - scores[x])    
//  ["小红", "小花", "小明"]

自己定规则排序,让English排在前面

let subjects = [{name: 'a'}, {name: 'b'}, {name: 'c'}, {name: 'd'}, {name: 'English'}]
subjects.sort((a, b) => (b.name === 'english' && a.name !== 'english'))
// 0: {name: "English"}
// 1: {name: "a"}
// 2: {name: "b"}
// 3: {name: "c"}
// 4: {name: "d"}

sort有稳定性的问题,在两个值相同的时候,会交换位置?所以排序可以用lodash的sortBy或orderBy

  1. join
var a = [1,2,3];
    
a.join('方方');    //'1方方2方方3'
a.join();    //'1,2,3',默认是逗号
  1. concat
var a = [1,2,3];
var b = [3,4,5];
var c = a.concat(b);    //'1,2,3,3,4,5'

var d = a.concat([]);    //'1,2,3',d和a的值一样,但d和a是两个数组,所以concat可以用来深拷贝数组
  1. map(映射)
var a = [1,2,3];
a.map(function(value,key){
  return value * 2;
})    //[2,4,6];
a.map(value => value * 2);    //[2,4,6]
  1. filter(过滤器)
var a = [1,2,3,4,5];
a.filter(function(value,key){
   return value >= 3;
})    //[3,4,5]
a.filter(function(value,key){
    return value % 2 === 0 ;
})    //返回偶数,[2,4]

a.filter(function(value,key){
  return value % 2 === 0 ;
}).map(function(value){
    return value * value;
})     //[4,16];
  1. reduce
var a = [1,2,3];
a.reduce(function(sum,n){
   return sum + n ;
},0)    //6,求和,0是初始值,第一次传给sum的就是0,sum是每次传进来的值,之后传给sum的是return里的值,n是遍历的数
    
a.reduce((sum,n) => sum + n ,0)    //6,箭头函数的写法

map可以用reduce表示:

a.reduce(function(arr,n){
    arr.push(n*2);
    return arr;
},[])    //[2,4,6]

filter也可以用reduce表示:

a.reduce(function(arr,n){
  if(n % 2 === 0){
      arr.push(n)
}
  return arr;
},[])

只要掌握reduce就行了

  1. splice
    array.splice(start)  //start第一个位置是0
    array.splice(start, deleteCount) //若不写删除的个数,则会把包括start位置的数据和后面的所有数据都删除,并返回它们
    array.splice(开始的位置, 删除的个数, 插入的数据1, 插入的数据2, 3...)
    
    splice会改变数组本身的数据!!
  2. slice
    slice不会改变数组本身数据!!
    array.slice()  //或array.slice(0),返回完整数组
    array.slice(4)  //返回位置4到最后的数据
    array.slice(4,8)  //返回位置4到8以前的数据(不包括8)
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容