常用的ES2015中的字符串、数值、数组的拓展方法

一、字符串的拓展

1、使用for ... of循环字符串中的字符

for(let a of 'java') {
      console.log(a);
}
// j
// a
// v
// a

2、利用includes、startsWith、endsWith三种方法检测字符串中是否含有某些字符(串),根据是否存在返回布尔值

传统中只能使用indexOf方法检测

const value = 'hello world!';

console.log(value.includes('w'));
console.log(value.startsWith('he'));
console.log(value.endsWith('d!'));
// true
// true
// true

当然,这几个方法都支持第二个参数,作为搜索开始的位置,但是endsWith()方法的第二个参数是指前n的字符:

console.log(value.includes('w',2));
console.log(value.startsWith('he',1));
console.log(value.endsWith('he',2));
// true
// false
// true

3、利用repeat()方法重复字符串,这个方法接受一个数字作为重复的次数,如果是小数则采用舍的方式,这个方法不会对原来的字符串进行修改
传统的方法使用符号+进行重复

const s = 'js';
const v = s.repeat(2);
console.log(v);
// jsjs

4、使用模板字符串来简化字符串的拼接,模板字符串为了区分普通的字符串使用反引号括起来,使用${}作为占位符标识

传统方法使用符号+来拼接,如:

let lang = 'js';
let s = lang + ' is powerful';

如果字符串太长,还可以将字符串划分为数组中的一个个元素,使用join()方法拼接,这样的好处是方便代码的组织

let lang = 'js;
let  s = [lang, ' is', ' powerful'].join('');

使用模板字符串可以更加方便和简洁,如:

let lang1 ='js';
let lang2 = 'java';
function str(value) {
    return `${value} is powerful`;
}
let s1 = str(lang1);
let s2 =  str(lang2);

当然模板字符串中还可以嵌套模板字符串,使用函数等等。

二、数值的拓展

1、使用0b表示二进制数,使用0o表示八进制数

传统中定义使用零0开头表示八进制数如071就是表示57,用0x表示十六进制数,但是ES5中说明了严格模式中规定不能用0开头表示八进制,ES6中则更加明确说明使用0b开头表示,使用Number方法可以将这些转化为10进制,同时这些进制的数字进行计算都是返回10进制数

let n = 071;
Number(n);
// 57
071 + 01;
// 58
0b10 + 0b10;
// 4

2、使用Number.isFinite()方法来检测一个数是否有限,使用Number.isNaN()方法来检测一个变量是否是数字
传统中isFinite()方法和isNaN()方法已经部署到了全局对象中,使用Infinity来表示正无限,-Infinity来表示负无限,如下:

let n = 12;
isNaN(n);
// false
isFinite(n);
// true

这个与传统方法不同的是,传统方法使用时会先调用类型转换,而Number新增的这两个方法首先检测参数是否是数字,不是数字一律返回false

isNaN('NaN');
// true
isFinite('12');
// true
Number.isNaN('NaN');
// false
Number.isFinite('12');
// false

3、Number.parseInt()和Number.parseFloat()方法

这里和传统的全局方法parseInt()和parseFloat()一致,这样做的目的是减少全局方法,逐步模块化

4、利用Number.isInteger()方法判断一个数是否是整数

传统方法中我们可以使用Math.floor()或者是Math.ceil()方法来处理数字后与原数字对比来判断是否为整数。

let n = 12;
console.log(n === Math.floor(n));
// true
console.log(n === Math.ceil(n));
// true
console.log(Number.isInteger(n));
// true

同样,由于JavaScript内部储存数据并不会区分浮点数与整数,因此12和12.0使用这个方法同样都是返回true,都认为是整数。

console.log(Number.isInteger(12.0));
// true

三、Math对象拓展

1、利用Math.trunc()方法来舍去一个数字的小数部分,返回整数部分。

传统方法中我们需要判断这个数字大于0还是小于0,大于0采用Math.floor()方法处理,小于0使用Math.ceil()方法处理,因为这两个方法一个表示入,一个表示舍

function trunc(num) {
    if(num >= 0) {
        return Math.floor(num);        
    } else {
        return Math.ceil(num);
    }
}
let n1 = 4.5;
let n2 = -4.5;
console.log(trunc(n1));
// 4
console.log(trunc(n2));
// -4
console.log(Math.trunc(n1));
// 4
console.log(Math.trunc(n2));
// -4

2、利用Math.sign()判断一个数字的正负

传统方法中需要和0做对比之后根据结果处理。

Math.sign()方法使用的时候同样会先做类型转化之后再做判断,Math.sign()方法有可能返回5个值:

正数:返回+1

负数:返回-1

0:返回0

-0:返回-0

其他:返回NaN

// 传统模拟
function sign(num) {
  x = +x; // 转化为一个数字,遇到不能转化的非数字返回NaN
  if (x === 0 || isNaN(x)) {
    return x;
  }
  return x > 0 ? 1 : -1;
}
Math.sign('12');
// 1
Math.sign(-12);
// -1
Math.sign(0);
// 0
Math.sign(-0);
// -0
Math.sign('12js');
// NaN

3、利用Math.cbrt()方法来求一个数的立方根

传统方法中我们需要使用Math.abs()方法将其转换为绝对值之后利用Math.pow()方法求绝对值的立方根,之后根据原始值的正负返回正负值。

同样这个方法执行的时候会先调用类型装换。

// 传统模拟
function cbrt(num) {
    let  n = Math.pow(Math.abs(num), 1/3);
    return num >= 0 ? n : -n;
}
Math.cbrt(-1);
// -1
Math.cbrt(8);
// 2

四、数组的拓展

1、利用Array.from()方法将类数组对象和set、map数据结构转化为一个真正的数组的对象

传统方法中将一个有length属性的类数组对象转化为数组的对象会使用Array.slice.call()来转化,如:

const  a = {
'0': 'a',
length: 1
};
const b = [].slice.call(a);
// ['a'] 

类数组对象键值对中键必须是以0,1,2这样命名,同时也必定需要length属性

类数组对象经典的就是arguments对象,还有DOM操作中得到的节点也是,将这些类数组对象转化为数组后就可以放心的使用数组的所有方法了,尤其是forEach()、map()、reduce()这些迭代器方法。

function a(){
    console.log(Array.isArray(arguments));
    console.log(Array.isArray(Array.from(arguments)));
}
a();
// false
// true

2、利用Array.of()方法将一组数值转化为一个数组

传统方法中我们初始化一个数组一半采用字面量法,构造函数方法基本不会用到,主要是因为构造函数方法根据参数的多少,行为是不一致的。当参数只有一个时返回的是一个length属性为参数值的数组,而当参数为两个或者两个以上时,返回的就是这些值组成的一个数组,而Array.of()方法就可以行为一致,始终返回这些参数组成的数组。

let a = new Array(3);
// [ , , ]
let b = new Array(2,3);
// [2,3]

显然,传统上将arguments对象转化为数组即可模拟Array.of()这个方法

function arrayOf(){
  return [].slice.call(arguments);
}

3、利用数组实例方法find()来查找出符合条件的第一个成员,find()方法的参数是一个回调函数,类似于forEach()等方法的回调函数,这个函数的第一个参数是元素,第二个参数是位置,第三个参数是这个数组,find()方法返回第一个返回值为true的数组元素,如果数组中没有返回为true的元素,则返回undefined。

传统中这种迭代器方法还有forEach()、every()、some()、map()、filter()、reduce()、reduceRight()方法,传统中需要模拟这个方法则需要使用循环来逐个判断。

[1,2,3,4,-5,6].find((ele) => ele < 0);
// -5
[1,2,3,4,5].find((ele) => ele>3);
// 4

4、使用数组实例方法findIndex()来查找出符合条件的第一个成员的索引值,参数依旧是一个回调函数,如果数组中没有符合条件的元素,则返回-1。

传统方法中依旧是需要使用循环来逐个判断。

[1,2,3,4,-5,6].findIndex((ele) => ele < 0);
// 4
[1,2,3,4,5].findIndex((ele) => ele>3);
// 3
[1,2,3,4,5].findIndex((ele) => ele<0);
// -1

5、使用数组实例方法includes()来判断数组中是否存在某个元素

与字符串方法includes一样,有则返回true,无则返回false

传统方法中需要使用indexOf来根据索引值来判断。

// 传统方法模拟
function includes(arr, ele) {
    return arr.indexOf(ele) > -1 ? true : false;
}

最后是一个广告贴,最近新开了一个分享技术的公众号,欢迎大家关注👇

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

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,212评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,581评论 18 399
  • 本章内容 使用对象 创建并操作数组 理解基本的 JavaScript 类型 使用基本类型和基本包装类型 引用类型的...
    闷油瓶小张阅读 676评论 0 0
  • 关于作者 刘希平,全球顶级公关公司万博宣伟的中国区主席。作为中国公关界的权威人士,他曾带领团队参与过北京申办200...
    飞生阅读 475评论 0 2
  • 安卓逆向系列教程(二)APK 和 DEX 作者:飞龙 APK APK 是 Android 软件包的分发格式,它本身...
    布客飞龙阅读 1,453评论 0 7