百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

你必须收藏的 ES6 语法密糖-Spread Operator 技巧

toyiye 2024-06-21 11:58 10 浏览 0 评论

不使用 Apply

apply 和 call 可以执行函数,改变 this 执行,比如:

function add(a, b){ 
 return a + b 
}

假设有个场景参数是以数组的形式传递过来,传统的做法是:

const args = [11, 12] 
add.apply(null, args)

或者

const args = [11, 12] 
add.call(null, args[0], args[1])

使用 Spread Operator 之后:

const args = [11, 12] 
add(...args)

babel 编译后的结果:

function add(a, b) { 
 return a + b; 
} 
var args = [11, 12]; 
add.apply(undefined, args);

常见的场景还有:

const arr = [1, 2, 3, 4, 5] 
Math.min(...arr) //求最小值 
Math.max(...arr) //求最大值

babel 编译后的结果:

var arr = [1, 2, 3, 4, 5]; 
Math.min.apply(Math, arr); //求最小值 
Math.max.apply(Math, arr); //求最大值

因为 Math.min 和 Math.max 参数个数是不限制的,所以这种场景非常适合使用 Spread Operator 。

合并数组

先看下 array push 的语法:

array.push(item1, item2, ...., item3)

可以看到 push 接收的参数也是不定,所以可以利用其实现合并数组功能:

arr1.push(...arr2)

或者合并到前方:

arr1.unshift(...arr2)

也可以直接声明式合并:

const arr1 = [2, 3] 
const arr2 = [1, ...arr1, 4] //arr2 相当于 [1, 2, 3, 4]

在比如:

const a = [1, 2] a.push(...[3, 4, 5]) //[1,2,3,4,5]

babel 编译后:

var a = [1, 2]; 
a.push.apply(a, [3, 4, 5]);

把 arguments 或 NodeList 转成数组

[...document.querySelectorAll('div')]

bebel 编译后:

function _toConsumableArray(arr) { 
 if (Array.isArray(arr)) { 
 for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { 
 arr2[i] = arr[i]; 
 } 
 return arr2; 
 } else { 
 return Array.from(arr); 
 } 
} 
[].concat(_toConsumableArray(document.querySelectorAll('div')));

直接把 arguments 转成数组:

var myFn = function(...args) { 
 console.log(args.forEach) //? forEach() { [native code] } 
 console.log(arguments.forEach) //undefined 
} 
myFn()

babel 编译后:

var myFn = function myFn() { 
 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 
 args[_key] = arguments[_key]; 
 } 
 
 console.log(args.forEach); //? forEach() { [native code] } 
 console.log(arguments.forEach); //undefined 
}; 
myFn();

快速赋值

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 }; 
console.log(x); // 1 
console.log(y); // 2 
console.log(z); // { a: 3, b: 4 }

babel 编译后:

function _objectWithoutProperties(obj, keys) { 
 var target = {}; 
 for (var i in obj) { 
 if (keys.indexOf(i) >= 0) continue; 
 if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; 
 target[i] = obj[i]; 
 } 
 return target; 
} 

var _x$y$a$b = { x: 1, y: 2, a: 3, b: 4 }, 
 x = _x$y$a$b.x, 
 y = _x$y$a$b.y, 
 z = _objectWithoutProperties(_x$y$a$b, ["x", "y"]);

Spread 实战

react useomi use

 return [list, { 
 set, 
 push: (entry) => set([...list, entry]), 
 filter: (fn) => set(list.filter(fn)), 
 sort: (fn?) => set([...list].sort(fn)), 
 }]; 
 };
 <button onClick={() => setItems([...items, { text: 'new item' }])}> 
 add 
 </button> 
 <button onClick={() => setItems([])}>empty</button>

当然我自身不喜欢这种方式定义组件,所以在 omio 中没有加入类似的功能。

Omi extractclass

import { classNames, extractClass } from 'omi' 

define('my-element', class extends WeElement { 
 render(props) { 
 //extractClass will take out this class/className from props and merge the other classNames to obj 
 const cls = extractClass(props, 'o-my-class', { 
 'other-class': true, 
 'other-class-b': this.xxx === 1 
 }) 
 
 return ( 
 <div {...cls} {...props}> 
 Test 
 </div> 
 ) 
 }
})

extractClass 简直是写 UI 组件的神器,该方法会提取出 props 的 class 或者 className,并且进行类似 classNames 库的合并。最后通过扩展运算符增加到 JSX 上。

Omiu button 实战

import { define, WeElement, extractClass } from 'omi' 
import css from './_index.css' 

define('o-button', class extends WeElement { 
 static defaultProps = { 
 disabled: false, 
 type: 'primary', 
 size: 'normal' 
 } 
 
 css() { 
 return css 
 } 
 
 render(props) { 
 //提取 class,并从 props 中去掉 
 let cls = extractClass(props) || {} 
 const { 
 component, 
 type, 
 size, 
 plain, 
 children, 
 ...others 
 } = this.props 
 
 const Component = component 
 ? component 
 : this.props.href || type === 'vcode' 
 ? 'a' 
 : 'button' 
 cls = 
 type === 'vcode' 
 ? extractClass(cls, 'weui-vcode-btn') 
 : extractClass(cls, { 
 'weui-btn': true, 
 'weui-btn_mini': size === 'small', 
 'weui-btn_primary': type === 'primary' && !plain, 
 'weui-btn_default': type === 'default' && !plain, 
 'weui-btn_warn': type === 'warn', 
 'weui-btn_plain-primary': type === 'primary' && plain, 
 'weui-btn_plain-default': type === 'default' && plain, 
 'weui-btn_disabled': this.props.disabled && !plain, 
 'weui-btn_plain-disabled': this.props.disabled && plain 
 }) 
 
 return ( 
 <Component {...others} {...cls}> 
 {children} 
 </Component> 
 ) 
 } 
})

extractClass 源码

export function extractClass() { 
 //提取第一个参数 props 和剩余的 args 
 const [props, ...args] = Array.prototype.slice.call(arguments, 0) 
 if (props.class) { 
 args.unshift(props.class) 
 delete props.class 
 } else if (props.className) { 
 args.unshift(props.className) 
 delete props.className 
 } 
 if (args.length > 0) { 
 return { class: classNames.apply(null, args) } 
 } 
}

可以看到 extractClass 本身也用到了 Spread Operator,真实无处不在。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码